# $Id$ # package main; use strict; use warnings; use feature qw/say switch/; use configDB; sub CommandConfigdb($$); my @pathname; sub configdb_Initialize($$) { my %hash = ( Fn => "CommandConfigdb", Hlp => "help ,access additional functions from configDB" ); $cmds{configdb} = \%hash; } sub CommandConfigdb($$) { my ($cl, $param) = @_; # my @a = split(/ /,$param); my @a = split("[ \t][ \t]*", $param); my ($cmd, $param1, $param2) = @a; $cmd = $cmd ? $cmd : ""; $param1 = $param1 ? $param1 : ""; $param2 = $param2 ? $param2 : ""; my $configfile = $attr{global}{configfile}; return "\n error: configDB not used!" unless($configfile eq 'configDB' || $cmd eq 'migrate'); my $ret; given ($cmd) { when ('attr') { Log3('configdb', 4, 'configdb: attr $param1 $param2 requested.'); if ($param1 eq "" && $param2 eq "") { # list attributes foreach my $c (sort keys %{$attr{configdb}}) { my $val = $attr{configdb}{$c}; $val =~ s/;/;;/g; $val =~ s/\n/\\\n/g; $ret .= "attr configdb $c $val\n"; } } elsif($param2 eq "") { # delete attribute undef($attr{configdb}{$param1}); $ret = " attribute $param1 deleted"; } else { # set attribute $attr{configdb}{$param1} = $param2; $ret = " attribute $param1 set to value $param2"; } } when ('diff') { return "\n Syntax: configdb diff " if @a != 3; Log3('configdb', 4, "configdb: diff requested for device: $param1 in version $param2."); $ret = _cfgDB_Diff($param1, $param2); } when ('filedelete') { return "\n Syntax: configdb fileexport " if @a != 2; my $filename; if($param1 =~ m,^[./],) { $filename = $param1; } else { $filename = $attr{global}{modpath}; $filename .= "/$param1"; } $ret = _cfgDB_Filedelete $filename; } when ('fileexport') { return "\n Syntax: configdb fileexport " if @a != 2; my $filename; if($param1 =~ m,^[./],) { $filename = $param1; } else { $filename = $attr{global}{modpath}; $filename .= "/$param1"; } $ret = _cfgDB_Fileexport $filename; } when ('fileimport') { return "\n Syntax: configdb fileimport " if @a != 2; my $filename; if($param1 =~ m,^[./],) { $filename = $param1; } else { $filename = $attr{global}{modpath}; $filename .= "/$param1"; } if ( -r $filename ) { my $filesize = -s $filename; $ret = _cfgDB_binFileimport($filename,$filesize); } elsif ( -e $filename) { $ret = "\n Read error on file $filename"; } else { $ret = "\n File $filename not found."; } } when ('filelist') { return _cfgDB_Filelist; } when ('filemove') { return "\n Syntax: configdb filemove " if @a != 2; my $filename; if($param1 =~ m,^[./],) { $filename = $param1; } else { $filename = $attr{global}{modpath}; $filename .= "/$param1"; } if ( -r $filename ) { my $filesize = -s $filename; $ret = _cfgDB_binFileimport ($filename,$filesize,1); $ret .= "\nFile $filename deleted from local filesystem."; } elsif ( -e $filename) { $ret = "\n Read error on file $filename"; } else { $ret = "\n File $filename not found."; } } when ('fileshow') { my @rets = cfgDB_FileRead($param1); my $r = (int(@rets)) ? join "\n",@rets : "File $param1 not found in database."; return $r; } when ('info') { Log3('configdb', 4, "info requested."); $ret = _cfgDB_Info; } when ('list') { $param1 = $param1 ? $param1 : '%'; $param2 = $param2 ? $param2 : 0; Log3('configdb', 4, "configdb: list requested for device: $param1 in version $param2."); $ret = _cfgDB_Search($param1,$param2,1); } when ('migrate') { return "\n Migration not possible. Already running with configDB!" if $configfile eq 'configDB'; Log3('configdb', 4, "configdb: migration requested."); $ret = _cfgDB_Migrate; } when ('recover') { return "\n Syntax: configdb recover " if @a != 2; Log3('configdb', 4, "configdb: recover for version $param1 requested."); $ret = _cfgDB_Recover($param1); } when ('reorg') { $param1 = $param1 ? $param1 : 3; Log3('configdb', 4, "configdb: reorg requested with keep: $param1."); $ret = _cfgDB_Reorg($a[1]); } when ('search') { return "\n Syntax: configdb search [searchVersion]" if @a < 2; $param1 = $param1 ? $param1 : '%'; $param2 = $param2 ? $param2 : 0; Log3('configdb', 4, "configdb: list requested for device: $param1 in version $param2."); $ret = _cfgDB_Search($param1,$param2); } when ('uuid') { $param1 = _cfgDB_Uuid; Log3('configdb', 4, "configdb: uuid requested: $param1"); $ret = $param1; } default { $ret = "\n Syntax:\n". " configdb attr [attribute] [value]\n". " configdb diff \n". " configDB filedelete \n". " configDB fileimport \n". " configDB fileexport \n". " configDB filelist\n". " configDB filemove \n". " configDB fileshow \n". " configdb info\n". " configdb list [device] [version]\n". " configdb migrate\n". " configdb recover \n". " configdb reorg [keepVersions]\n". " configdb search [version]\n". " configdb uuid\n". ""; } } return $ret; } 1; =pod =begin html

configdb

    Starting with version 5079, fhem can be used with a configuration database instead of a plain text file (e.g. fhem.cfg).
    This offers the possibility to completely waive all cfg-files, "include"-problems and so on.
    Furthermore, configDB offers a versioning of several configuration together with the possibility to restore a former configuration.
    Access to database is provided via perl's database interface DBI.

    Interaction with other modules

      Currently the fhem modules

    • 02_RSS.pm
    • 93_DbLog.pm
    • 95_holiday.pm
    • 98_SVG.pm

    • will use configDB to read their configuration data from database
      instead of formerly used configuration files inside the filesystem.
      This requires you to import your configuration files from filesystem into database.

      Example:
      configdb fileimport FHEM/nrw.holiday
      configdb fileimport FHEM/myrss.layout
      configdb fileimport www/gplot/xyz.gplot

      This does not affect the definitons of your holiday or RSS entities.
      The given filenames in the definitions will be translated automatically to find the correct entries inside the database.

      Each fileimport into database will overwrite the file if it already exists in database.



    Prerequisits / Installation

    • Please install perl package Text::Diff if not already installed on your system.

    • You must have access to a SQL database. Supported database types are SQLITE, MYSQL and POSTGRESQL.

    • The corresponding DBD module must be available in your perl environment,
      e.g. sqlite3 running on a Debian systems requires package libdbd-sqlite3-perl

    • Create an empty database, e.g. with sqlite3:
      	mba:fhem udo$ sqlite3 configDB.db
      
      	SQLite version 3.7.13 2012-07-17 17:46:21
      	Enter ".help" for instructions
      	Enter SQL statements terminated with a ";"
      	sqlite> pragma auto_vacuum=2;
      	sqlite> .quit
      
      	mba:fhem udo$ 
      			
    • The database tables will be created automatically.

    • Create a configuration file containing the connection string to access database.

      IMPORTANT:

      • This file must be named "configDB.conf"
      • This file must be located in the same directory containing fhem.pl and configDB.pm, e.g. /opt/fhem

      ## for MySQL
      ################################################################
      #%dbconfig= (
      #	connection => "mysql:database=configDB;host=db;port=3306",
      #	user => "fhemuser",
      #	password => "fhempassword",
      #);
      ################################################################
      #
      ## for PostgreSQL
      ################################################################
      #%dbconfig= (
      #        connection => "Pg:database=configDB;host=localhost",
      #        user => "fhemuser",
      #        password => "fhempassword"
      #);
      ################################################################
      #
      ## for SQLite (username and password stay empty for SQLite)
      ################################################################
      #%dbconfig= (
      #        connection => "SQLite:dbname=/opt/fhem/configDB.db",
      #        user => "",
      #        password => ""
      #);
      ################################################################
      			

    Start with a complete new "fresh" fhem Installation

      It's easy... simply start fhem by issuing following command:

        perl fhem.pl configDB

      configDB is a keyword which is recognized by fhem to use database for configuration.

      That's all. Everything (save, rereadcfg etc) should work as usual.

    or:

    Migrate your existing fhem configuration into the database

      It's easy, too...

    • start your fhem the last time with fhem.cfg

        perl fhem.pl fhem.cfg


    • transfer your existing configuration into the database

        enter

        configdb migrate

        into frontend's command line


      Be patient! Migration can take some time, especially on mini-systems like RaspberryPi or Beaglebone.
      Completed migration will be indicated by showing database statistics.
      Your original configfile will not be touched or modified by this step.

    • shutdown fhem

    • restart fhem with keyword configDB

        perl fhem.pl configDB

    • configDB is a keyword which is recognized by fhem to use database for configuration.

      That's all. Everything (save, rereadcfg etc) should work as usual.


    Additional functions provided

      A new command configdb is propagated to fhem.
      This command can be used with different parameters.

    • configdb attr [attribute] [value]

    • Provides the possibility to pass attributes to backend and frontend.

      configdb attr private 1 - set the attribute named 'private' to value 1.

      configdb attr private - delete the attribute named 'private'

      configdb attr - show all defined attributes.

      Currently, only one attribute is supported. If 'private' is set to 1 the user and password info
      will not be shown in 'configdb info' output.

    • configdb diff <device> <version>

    • Compare configuration dataset for device <device> from current version 0 with version <version>
      Example for valid request:

      configdb diff telnetPort 1

      will show a result like this:
      compare device: telnetPort in current version 0 (left) to version: 1 (right)
      +--+--------------------------------------+--+--------------------------------------+
      | 1|define telnetPort telnet 7072 global  | 1|define telnetPort telnet 7072 global  |
      * 2|attr telnetPort room telnet           *  |                                      |
      +--+--------------------------------------+--+--------------------------------------+
    • configdb filedelete <Filename>

    • Delete file from database.


    • configdb fileexport <targetFilename>

    • Exports specified fhem file from database into filesystem.
      Example:

      configdb fileexport FHEM/99_myUtils.pm


    • configdb fileimport <sourceFilename>

    • Imports specified text file from from filesystem into database.
      Example:

      configdb fileimport FHEM/99_myUtils.pm


    • configdb filelist

    • Show a list with all filenames stored in database.


    • configdb filemove <sourceFilename>

    • Imports specified fhem file from from filesystem into database and
      deletes the file from local filesystem afterwards.
      Example:

      configdb filemove FHEM/99_myUtils.pm


    • configdb fileshow <Filename>

    • Show content of specified file stored in database.


    • configdb info

    • Returns some database statistics
      --------------------------------------------------------------------------------
       configDB Database Information
      --------------------------------------------------------------------------------
       dbconn: SQLite:dbname=/opt/fhem/configDB.db
       dbuser: 
       dbpass: 
       dbtype: SQLITE
      --------------------------------------------------------------------------------
       fhemconfig: 7707 entries
      
       Ver 0 saved: Sat Mar  1 11:37:00 2014 def: 293 attr: 1248
       Ver 1 saved: Fri Feb 28 23:55:13 2014 def: 293 attr: 1248
       Ver 2 saved: Fri Feb 28 23:49:01 2014 def: 293 attr: 1248
       Ver 3 saved: Fri Feb 28 22:24:40 2014 def: 293 attr: 1247
       Ver 4 saved: Fri Feb 28 22:14:03 2014 def: 293 attr: 1246
      --------------------------------------------------------------------------------
       fhemstate: 1890 entries saved: Sat Mar  1 12:05:00 2014
      --------------------------------------------------------------------------------
      
      Ver 0 always indicates the currently running configuration.

    • configdb list [device] [version]

    • Search for device named [device] in configuration version [version]
      in database archive.
      Default value for [device] = % to show all devices.
      Default value for [version] = 0 to show devices from current version.
      Examples for valid requests:

      get configDB list
      get configDB list global
      get configDB list '' 1
      get configDB list global 1

    • configdb recover <version>

    • Restores an older version from database archive.
      set configDB recover 3 will copy version #3 from database to version #0.
      Original version #0 will be lost.

      Important!
      The restored version will NOT be activated automatically!
      You must do a rereadcfg or - even better - shutdown restart yourself.

    • configdb reorg [keep]

    • Deletes all stored versions with version number higher than [keep].
      Default value for optional parameter keep = 3.
      This function can be used to create a nightly running job for
      database reorganisation when called from an at-Definition.

    • configdb search [searchVersion]

    • Search for specified searchTerm in any given version (default=0)
      Example:
      
      configdb search %2286BC%
      
      Result:
      
      search result for: %2286BC% in version: 0 
      -------------------------------------------------------------------------------- 
      define az_RT CUL_HM 2286BC 
      define az_RT_Clima CUL_HM 2286BC04 
      define az_RT_Climate CUL_HM 2286BC02 
      define az_RT_ClimaTeam CUL_HM 2286BC05 
      define az_RT_remote CUL_HM 2286BC06 
      define az_RT_Weather CUL_HM 2286BC01 
      define az_RT_WindowRec CUL_HM 2286BC03 
      attr Melder_FAl peerIDs 00000000,2286BC03, 
      attr Melder_FAr peerIDs 00000000,2286BC03, 
      

    • configdb uuid

    • Returns a uuid that can be used for own purposes.



    Author's notes

    • You can find two template files for datebase and configfile (sqlite only!) for easy installation.
      Just copy them to your fhem installation directory (/opt/fhem) and have fun.

    • The frontend option "Edit files"->"config file" will be removed when running configDB.

    • Please be patient when issuing a "save" command (either manually or by clicking on "save config").
      This will take some moments, due to writing version informations.
      Finishing the save-process will be indicated by a corresponding message in frontend.

    • There still will be some more (planned) development to this extension, especially regarding some perfomance issues.

    • Have fun!
=end html =begin html_DE

configdb

    Seit version 5079 unterstützt fhem die Verwendung einer SQL Datenbank zum Abspeichern der kompletten Konfiguration
    Dadurch kann man auf alle cfg Dateien, includes usw. verzichten und die daraus immer wieder resultierenden Probleme vermeiden.
    Desweiteren gibt es damit eine Versionierung von Konfigurationen und die Möglichkeit, jederzeit eine ältere Version wiederherstellen zu können.
    Der Zugriff auf die Datenbank erfolgt über die perl-eigene Datenbankschnittstelle DBI.

    Zusammenspiel mit anderen fhem Modulen

      Momentan verwenden die Module

    • 02_RSS.pm
    • 93_DbLog.pm
    • 95_holiday.pm
    • 98_SVG.pm

    • die configDB, um ihre Konfigurationsdaten von dort zu lesen
      anstatt aus den bisherigen Konfigurationsdateien im Dateisystem.
      Hierzu ist es notwendig, die Konfigurationsdateien aus dem Dateisystem in die Datenbank zu importieren.

      Beispiel:
      configdb fileimport FHEM/nrw.holiday
      configdb fileimport FHEM/myrss.layout
      configdb fileimport www/gplot/xyz.gplot

      Dies hat keinerlei Auswirkungen auf die Definition der holiday oder RSS Instanzen.
      Die dort verwendeten Dateinamen werden automtisch umgesetzt, um die zugehörigen Daten in der Datenbank zu finden.

      Jeder Neuimport einer bereits in der Datenbank gespeicherten Datei überschreibt die vorherige Datei in der Datenbank.



    Voraussetzungen / Installation

    • Bitte das perl Paket Text::Diff installieren, falls noch nicht auf dem System vorhanden.

    • Es muss eine SQL Datenbank verfügbar sein, untsrstützt werden SQLITE, MYSQL und POSTGRESQLL.

    • Das zum Datenbanktype gehörende DBD Modul muss in perl installiert sein,
      für sqlite3 auf einem Debian System z.B. das Paket libdbd-sqlite3-perl

    • Eine leere Datenbank muss angelegt werden, z.B. in sqlite3:
      	mba:fhem udo$ sqlite3 configDB.db
      
      	SQLite version 3.7.13 2012-07-17 17:46:21
      	Enter ".help" for instructions
      	Enter SQL statements terminated with a ";"
      	sqlite> pragma auto_vacuum=2;
      	sqlite> .quit
      
      	mba:fhem udo$ 
      			
    • Die benötigten Datenbanktabellen werden automatisch angelegt.

    • Eine Konfigurationsdatei für die Verbindung zur Datenbank muss angelegt werden.

      WICHTIG:

      • Diese Datei muss den Namen "configDB.conf" haben
      • Diese Datei muss im gleichen Verzeichnis liegen wie fhem.pl und configDB.pm, z.B. /opt/fhem

      ## für MySQL
      ################################################################
      #%dbconfig= (
      #	connection => "mysql:database=configDB;host=db;port=3306",
      #	user => "fhemuser",
      #	password => "fhempassword",
      #);
      ################################################################
      #
      ## für PostgreSQL
      ################################################################
      #%dbconfig= (
      #        connection => "Pg:database=configDB;host=localhost",
      #        user => "fhemuser",
      #        password => "fhempassword"
      #);
      ################################################################
      #
      ## für SQLite (username and password bleiben bei SQLite leer)
      ################################################################
      #%dbconfig= (
      #        connection => "SQLite:dbname=/opt/fhem/configDB.db",
      #        user => "",
      #        password => ""
      #);
      ################################################################
      			

    Aufruf mit einer vollständig neuen fhem Installation

      Sehr einfach... fhem muss lediglich folgendermassen gestartet werden:

        perl fhem.pl configDB

      configDB ist das Schlüsselwort, an dem fhem erkennt,
      dass eine Datenbank für die Konfiguration verwendet werden soll.

      Das war es schon. Alle Befehle (save, rereadcfg etc) arbeiten wie gewohnt.

    oder:

    übertragen einer bestehenden fhem Konfiguration in die Datenbank

      Auch sehr einfach...

    • fhem wird zum letzten Mal mit der fhem.cfg gestartet

        perl fhem.pl fhem.cfg


    • Bestehende Konfiguration in die Datenbank übertragen

        configdb migrate

        in die Befehlszeile der fhem-Oberfläche eingeben


      Nicht die Geduld verlieren! Die Migration eine Weile dauern, speziell bei Mini-Systemen wie
      RaspberryPi or Beaglebone.
      Am Ende der Migration wird eine aktuelle Datenbankstatistik angezeigt.
      Die ursprüngliche Konfigurationsdatei wird bei diesem Vorgang nicht angetastet.

    • fhem beenden.

    • fhem mit dem Schlüsselwort configDB starten

        perl fhem.pl configDB

    • configDB ist das Schlüsselwort, an dem fhem erkennt,
      dass eine Datenbank für die Konfiguration verwendet werden soll.

      Das war es schon. Alle Befehle (save, rereadcfg etc) arbeiten wie gewohnt.


    Zusätzliche Funktionen

      Es wird ein neuer Befehl configdb bereitgestellt,
      der mit verschiedenen Parametern aufgerufen werden kann.

    • configdb attr [attribute] [value]

    • Hiermit lassen sich attribute setzen, die das Verhalten von Front- und Backend beeinflussen.

      configdb attr private 1 - setzt das Attribut 'private' auf den Wert 1.

      configdb attr private - löscht das Attribut 'private'

      configdb attr - zeigt alle gespeicherten Attribute

      Im Moment ist nur ein Attribut definiert. Wenn 'private' auf 1 gesetzt wird, werden bei 'configdb info'
      keine Benutzer- und Passwortdaten angezeigt.


    • configdb diff <device> <version>

    • Vergleicht die Konfigurationsdaten des Gerätes <device> aus der aktuellen Version 0 mit den Daten aus Version <version>
      Beispielaufruf:

      configdb diff telnetPort 1

      liefert ein Ergebnis ähnlich dieser Ausgabe:
      compare device: telnetPort in current version 0 (left) to version: 1 (right)
      +--+--------------------------------------+--+--------------------------------------+
      | 1|define telnetPort telnet 7072 global  | 1|define telnetPort telnet 7072 global  |
      * 2|attr telnetPort room telnet           *  |                                      |
      +--+--------------------------------------+--+--------------------------------------+
    • configdb filedelete <Dateiname>

    • Löscht eine gespeicherte Datei aus der Datenbank.


    • configdb fileexport <zielDatei>

    • Schreibt die angegebene Datei aus der Datenbank in das Dateisystem. Beispiel:

      configdb fileexport FHEM/99_myUtils.pm


    • configdb fileimport <quellDatei>

    • Liest die angegbene Textdatei aus dem Dateisystem und schreibt den Inhalt in die Datenbank.
      Beispiel:

      configdb fileimport FHEM/99_myUtils.pm


    • configdb filelist

    • Liefert eine Liste mit allen Namen der gespeicherten Dateien.


    • configdb filemove <quellDatei>

    • Liest die angegbene Datei aus dem Dateisystem und schreibt den Inhalt in die Datenbank.
      Anschliessend wird die Datei aus dem lokalen Dateisystem gelöscht.
      Beispiel:

      configdb filemove FHEM/99_myUtils.pm


    • configdb fileshow <Dateiname>

    • Zeigt den Inhalt einer in der Datenbank gespeichert Datei an.


    • configdb info

    • Liefert eine Datenbankstatistik
      --------------------------------------------------------------------------------
       configDB Database Information
      --------------------------------------------------------------------------------
       dbconn: SQLite:dbname=/opt/fhem/configDB.db
       dbuser: 
       dbpass: 
       dbtype: SQLITE
      --------------------------------------------------------------------------------
       fhemconfig: 7707 entries
      
       Ver 0 saved: Sat Mar  1 11:37:00 2014 def: 293 attr: 1248
       Ver 1 saved: Fri Feb 28 23:55:13 2014 def: 293 attr: 1248
       Ver 2 saved: Fri Feb 28 23:49:01 2014 def: 293 attr: 1248
       Ver 3 saved: Fri Feb 28 22:24:40 2014 def: 293 attr: 1247
       Ver 4 saved: Fri Feb 28 22:14:03 2014 def: 293 attr: 1246
      --------------------------------------------------------------------------------
       fhemstate: 1890 entries saved: Sat Mar  1 12:05:00 2014
      --------------------------------------------------------------------------------
      
      Ver 0 bezeichnet immer die aktuell verwendete Konfiguration.

    • configdb list [device] [version]

    • Sucht das Gerät [device] in der Konfiguration der Version [version]
      in der Datenbank.
      Standardwert für [device] = % um alle Geräte anzuzeigen
      Standardwert für [version] = 0 um Geräte in der aktuellen Version anzuzeigen.
      Beispiele für gültige Aufrufe:

      configdb list
      configdb list global
      configdb list '' 1
      configdb list global 1

    • configdb recover <version>

    • Stellt eine ältere Version aus dem Datenbankarchiv wieder her.
      set configDB recover 3 kopiert die Version #3 aus der Datenbank zur Version #0.
      Die ursprüngliche Version #0 wird dabei gelöscht.

      Wichtig!
      Die zurückgeholte Version wird NICHT automatisch aktiviert!
      Ein rereadcfg oder - besser - shutdown restart muss manuell erfolgen.


  • configdb reorg [keep]

  • Löscht alle gespeicherten Konfigurationen mit Versionsnummern größer als [keep].
    Standardwert für den optionalen Parameter keep = 3.
    Mit dieser Funktion läßt sich eine nächtliche Reorganisation per at umsetzen.

  • configdb search [inVersion]

  • Sucht nach dem Suchbegriff in der angegeben Konfigurationsversion (default=0)
    Beispiel:
    
    configdb search %2286BC%
    
    Ergebnis:
    
    search result for: %2286BC% in version: 0 
    -------------------------------------------------------------------------------- 
    define az_RT CUL_HM 2286BC 
    define az_RT_Clima CUL_HM 2286BC04 
    define az_RT_Climate CUL_HM 2286BC02 
    define az_RT_ClimaTeam CUL_HM 2286BC05 
    define az_RT_remote CUL_HM 2286BC06 
    define az_RT_Weather CUL_HM 2286BC01 
    define az_RT_WindowRec CUL_HM 2286BC03 
    attr Melder_FAl peerIDs 00000000,2286BC03, 
    attr Melder_FAr peerIDs 00000000,2286BC03, 
    

  • configdb uuid

  • Liefert eine uuid, die man für eigene Zwecke verwenden kann.

    Hinweise

    • Im Verzeichnis contrib/configDB befinden sich zwei Vorlagen für Datenbank und Konfiguration,
      die durch einfaches Kopieren in das fhem Verzeichnis sofort verwendet werden können (Nur für sqlite!).

    • Der Menüpunkt "Edit files"->"config file" wird bei Verwendung von configDB nicht mehr angezeigt.

    • Beim Speichern einer Konfiguration nicht ungeduldig werden (egal ob manuell oder durch Klicken auf "save config")
      Durch das Schreiben der Versionsinformationen dauert das ein paar Sekunden.
      Der Abschluss des Speichern wird durch eine entsprechende Meldung angezeigt.

    • Diese Erweiterung wird laufend weiterentwickelt. Speziell an der Verbesserung der Performance wird gearbeitet.

    • Viel Spass!
=end html_DE =cut