| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668 |
- # $Id: 98_configdb.pm 16218 2018-02-18 19:23:23Z betateilchen $
- #
- package main;
- use strict;
- use warnings;
- use feature qw/say switch/;
- use POSIX;
- use configDB;
- no if $] >= 5.017011, warnings => 'experimental';
- sub CommandConfigdb($$);
- sub _cfgDB_readConfig();
- 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("[ \t][ \t]*", $param);
- my ($cmd, $param1, $param2) = @a;
- $cmd //= "";
- $param1 //= "";
- $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 %{$configDB{attr}}) {
- my $val = $configDB{attr}{$c};
- $val =~ s/;/;;/g;
- $val =~ s/\n/\\\n/g;
- $ret .= "configdb attr $c $val\n";
- }
- } elsif($param2 eq "") {
- # delete attribute
- delete $configDB{attr}{$param1};
- $ret = " attribute $param1 deleted";
- } else {
- # set attribute
- $configDB{attr}{$param1} = $param2;
- $ret = " attribute $param1 set to value $param2";
- }
- }
- when ('dump') {
- return _cfgDB_dump($param1);
- }
- # my ($dbconn,$dbuser,$dbpass,$dbtype) = _cfgDB_readConfig();
- # my ($dbname,$dbhostname,$dbport,$gzip,$mp,$ret,$size,$source,$target,$ts);
- # $ts = strftime('%Y-%m-%d_%H-%M-%S',localtime);
- # $mp = $configDB{attr}{'dumpPath'};
- # $mp //= AttrVal('global','modpath','.').'/log';
- # $target = "$mp/configDB_$ts.dump";
- #
- # if (lc($param1) eq 'unzipped') {
- # $gzip = '';
- # } else {
- # $gzip = '| gzip -c';
- # $target .= '.gz';
- # }
- #
- # if ($dbtype eq 'SQLITE') {
- # (undef,$source) = split (/=/, $dbconn);
- # my $dumpcmd = "echo '.dump fhem%' | sqlite3 $source $gzip > $target";
- # Log 4,"configDB: $dumpcmd";
- # $ret = qx($dumpcmd);
- # return $ret if $ret; # return error message if available
- #
- # } elsif ($dbtype eq 'MYSQL') {
- # ($dbname,$dbhostname,$dbport) = split (/;/,$dbconn);
- # $dbport //= '=3306';
- # (undef,$dbname) = split (/=/,$dbname);
- # (undef,$dbhostname) = split (/=/,$dbhostname);
- # (undef,$dbport) = split (/=/,$dbport);
- # my $dbtables = "fhemversions fhemconfig fhemstate fhemb64filesave";
- # my $dumpcmd = "mysqldump --user=$dbuser --password=$dbpass --host=$dbhostname --port=$dbport -Q $dbname $dbtables $gzip > $target";
- # Log 4,"configDB: $dumpcmd";
- # $ret = qx($dumpcmd);
- # return $ret if $ret;
- # $source = $dbname;
- #
- # } elsif ($dbtype eq 'POSTGRESQL') {
- # ($dbname,$dbhostname,$dbport) = split (/;/,$dbconn);
- # $dbport //= '=5432';
- # (undef,$dbname) = split (/=/,$dbname);
- # (undef,$dbhostname) = split (/=/,$dbhostname);
- # (undef,$dbport) = split (/=/,$dbport);
- # my $dbtables = "-t fhemversions -t fhemconfig -t fhemstate -t fhemb64filesave";
- # my $dumpcmd = "PGPASSWORD=$dbpass pg_dump -U $dbuser -h $dbhostname -p $dbport $dbname $dbtables $gzip > $target";
- # Log 4,"configDB: $dumpcmd";
- # $ret = qx($dumpcmd);
- # return $ret if $ret;
- # $source = $dbname;
- #
- # } else {
- # return "configdb dump not supported for $dbtype!";
- # }
- #
- # $size = -s $target;
- # $size //= 0;
- # $ret = "configDB dumped $size bytes\nfrom: $source\n to: $target";
- # return $ret;
- # }
- when ('diff') {
- return "\n Syntax: configdb diff <device> <version>" 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 filedelete <pathToFile>" if @a != 2;
- my $filename;
- if($param1 =~ m,^[./],) {
- $filename = $param1;
- } else {
- $filename = $attr{global}{modpath};
- $filename .= "/$param1";
- }
- $ret = "File $filename ";
- $ret .= defined(_cfgDB_Filedelete($filename)) ? "deleted from" : "not found in";
- $ret .= " database.";
- }
- when ('fileexport') {
- return "\n Syntax: configdb fileexport <pathToFile>" if @a != 2;
- if ($param1 ne 'all') {
- my $filename;
- if($param1 =~ m,^[./],) {
- $filename = $param1;
- } else {
- $filename = $attr{global}{modpath};
- $filename .= "/$param1";
- }
- $ret = _cfgDB_Fileexport $filename;
- } else { # start export all
- my $flist = _cfgDB_Filelist(1);
- my @filelist = split(/\n/,$flist);
- undef $flist;
- foreach my $f (@filelist) {
- Log3 (4,undef,"configDB: exporting $f");
- my ($path,$file) = $f =~ m|^(.*[/\\])([^/\\]+?)$|;
- $path = "/tmp/$path";
- eval qx(mkdir -p $path) unless (-e "$path");
- $ret .= _cfgDB_Fileexport $f;
- $ret .= "\n";
- }
- } # end export all
- }
- when ('fileimport') {
- return "\n Syntax: configdb fileimport <pathToFile>" 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 <pathToFile>" 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') {
- return "\n Syntax: configdb fileshow <pathToFile>" if @a != 2;
- 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('$Id: 98_configdb.pm 16218 2018-02-18 19:23:23Z betateilchen $');
- }
- when ('list') {
- $param1 = $param1 ? $param1 : '%';
- $param2 = $param2 ? $param2 : 0;
- $ret = "list not allowed for configDB itself.";
- break if($param1 =~ m/configdb/i);
- 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 <version>" if @a != 2;
- Log3('configdb', 4, "configdb: recover for version $param1 requested.");
- $ret = _cfgDB_Recover($param1);
- }
- when ('reorg') {
- # $param1 = $param1 ? $param1 : 3;
- $param1 //= 3;
- Log3('configdb', 4, "configdb: reorg requested with keep: $param1.");
- $ret = _cfgDB_Reorg($a[1]);
- }
- when ('search') {
- return "\n Syntax: configdb search <searchTerm> [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 <device> <version>\n".
- " configdb dump\n".
- " configDB filedelete <pathToFilename>\n".
- " configDB fileimport <pathToFilename>\n".
- " configDB fileexport <pathToFilename>\n".
- " configDB filelist\n".
- " configDB filemove <pathToFilename>\n".
- " configDB fileshow <pathToFilename>\n".
- " configdb info\n".
- " configdb list [device] [version]\n".
- " configdb migrate\n".
- " configdb recover <version>\n".
- " configdb reorg [keepVersions]\n".
- " configdb search <searchTerm> [version]\n".
- " configdb uuid\n".
- "";
- }
- }
- return $ret;
-
- }
- sub _cfgDB_readConfig() {
- if(!open(CONFIG, 'configDB.conf')) {
- Log3('configDB', 1, 'Cannot open database configuration file configDB.conf');
- return 0;
- }
- my @config=<CONFIG>;
- close(CONFIG);
- use vars qw(%configDB);
- my %dbconfig;
- eval join("", @config);
- my $cfgDB_dbconn = $dbconfig{connection};
- my $cfgDB_dbuser = $dbconfig{user};
- my $cfgDB_dbpass = $dbconfig{password};
- my $cfgDB_dbtype;
- %dbconfig = ();
- @config = ();
- if($cfgDB_dbconn =~ m/pg:/i) {
- $cfgDB_dbtype ="POSTGRESQL";
- } elsif ($cfgDB_dbconn =~ m/mysql:/i) {
- $cfgDB_dbtype = "MYSQL";
- } elsif ($cfgDB_dbconn =~ m/sqlite:/i) {
- $cfgDB_dbtype = "SQLITE";
- } else {
- $cfgDB_dbtype = "unknown";
- }
- return($cfgDB_dbconn,$cfgDB_dbuser,$cfgDB_dbpass,$cfgDB_dbtype);
- }
- 1;
- =pod
- =item command
- =item summary frontend command for configDB configuration
- =item summary_DE Befehl zur Konfiguration der configDB
- =begin html
- <a name="configdb"></a>
- <h3>configdb</h3>
- <ul>
- <a href="https://forum.fhem.de/index.php?board=46.0">Link to FHEM forum</a><br/><br/>
- Starting with version 5079, fhem can be used with a configuration database instead of a plain text file (e.g. fhem.cfg).<br/>
- This offers the possibility to completely waive all cfg-files, "include"-problems and so on.<br/>
- Furthermore, configDB offers a versioning of several configuration together with the possibility to restore a former configuration.<br/>
- Access to database is provided via perl's database interface DBI.<br/>
- <br/>
- <b>Interaction with other modules</b><br/>
- <ul><br/>
- Currently the fhem modules<br/>
- <br/>
- <li>02_RSS.pm</li>
- <li>55_InfoPanel.pm</li>
- <li>91_eventTypes</li>
- <li>93_DbLog.pm</li>
- <li>95_holiday.pm</li>
- <li>98_SVG.pm</li>
- <br/>
- will use configDB to read their configuration data from database<br/>
- instead of formerly used configuration files inside the filesystem.<br/>
- <br/>
- This requires you to import your configuration files from filesystem into database.<br/>
- <br/>
- Example:<br/>
- <code>configdb fileimport FHEM/nrw.holiday</code><br/>
- <code>configdb fileimport FHEM/myrss.layout</code><br/>
- <code>configdb fileimport www/gplot/xyz.gplot</code><br/>
- <br/>
- <b>This does not affect the definitons of your holiday or RSS entities.</b><br/>
- <br/>
- <b>During migration all external configfiles used in current configuration<br/>
- will be imported aufmatically.</b><br>
- <br/>
- Each fileimport into database will overwrite the file if it already exists in database.<br/>
- <br/>
- </ul><br/>
- <br/>
- <b>Prerequisits / Installation</b><br/>
- <ul><br/>
- <li>Please install perl package Text::Diff if not already installed on your system.</li><br/>
- <li>You must have access to a SQL database. Supported database types are SQLITE, MYSQL and POSTGRESQL.</li><br/>
- <li>The corresponding DBD module must be available in your perl environment,<br/>
- e.g. sqlite3 running on a Debian systems requires package libdbd-sqlite3-perl</li><br/>
- <li>Create an empty database, e.g. with sqlite3:<br/>
- <pre>
- 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$
- </pre></li>
- <li>The database tables will be created automatically.</li><br/>
- <li>Create a configuration file containing the connection string to access database.<br/>
- <br/>
- <b>IMPORTANT:</b>
- <ul><br/>
- <li>This file <b>must</b> be named "configDB.conf"</li>
- <li>This file <b>must</b> be located in the same directory containing fhem.pl and configDB.pm, e.g. /opt/fhem</li>
- </ul>
- <br/>
- <pre>
- ## 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 => ""
- #);
- ################################################################
- </pre></li><br/>
- </ul>
- <b>Start with a complete new "fresh" fhem Installation</b><br/>
- <ul><br/>
- It's easy... simply start fhem by issuing following command:<br/><br/>
- <ul><code>perl fhem.pl configDB</code></ul><br/>
- <b>configDB</b> is a keyword which is recognized by fhem to use database for configuration.<br/>
- <br/>
- <b>That's all.</b> Everything (save, rereadcfg etc) should work as usual.
- </ul>
- <br/>
- <b>or:</b><br/>
- <br/>
- <b>Migrate your existing fhem configuration into the database</b><br/>
- <ul><br/>
- It's easy, too... <br/>
- <br/>
- <li>start your fhem the last time with fhem.cfg<br/><br/>
- <ul><code>perl fhem.pl fhem.cfg</code></ul></li><br/>
- <br/>
- <li>transfer your existing configuration into the database<br/><br/>
- <ul>enter<br/><br/><code>configdb migrate</code><br/>
- <br/>
- into frontend's command line</ul><br/></br>
- Be patient! Migration can take some time, especially on mini-systems like RaspberryPi or Beaglebone.<br/>
- Completed migration will be indicated by showing database statistics.<br/>
- Your original configfile will not be touched or modified by this step.</li><br/>
- <li>shutdown fhem</li><br/>
- <li>restart fhem with keyword configDB<br/><br/>
- <ul><code>perl fhem.pl configDB</code></ul></li><br/>
- <b>configDB</b> is a keyword which is recognized by fhem to use database for configuration.<br/>
- <br/>
- <b>That's all.</b> Everything (save, rereadcfg etc) should work as usual.
- </ul>
- <br/><br/>
- <b>Additional functions provided</b><br/>
- <ul><br/>
- A new command <code>configdb</code> is propagated to fhem.<br/>
- This command can be used with different parameters.<br/>
- <br/>
- <li><code>configdb attr [attribute] [value]</code></li><br/>
- Provides the possibility to pass attributes to backend and frontend.<br/>
- <br/>
- <code> configdb attr private 1</code> - set the attribute named 'private' to value 1.<br/>
- <br/>
- <code> configdb attr private</code> - delete the attribute named 'private'<br/>
- <br/>
- <code> configdb attr</code> - show all defined attributes.<br/>
- <br/>
- <ul>Supported attributes:</ul>
- <br/>
- <ul><b>deleteimported</b> if set to 1 files will always be deleted from filesystem after import to database.<br/></ul><br/>
- <ul><b>maxversions</b> set the maximum number of configurations stored in database. <br/>
- The oldest version will be dropped in a "save config" if it would exceed this number.</ul><br/>
- <ul><b>private</b> if set to 1 the user and password info will not be shown in 'configdb info' output.</ul><br/>
- <ul><b>useCache</b> (experimental!) if set to 1 fileread from database will be cached.</ul><br/>
- <br/>
- <li><code>configdb diff <device> <version></code></li><br/>
- Compare configuration dataset for device <device>
- from current version 0 with version <version><br/>
- Example for valid request:<br/>
- <br/>
- <code>configdb diff telnetPort 1</code><br/>
- <br/>
- will show a result like this:
- <pre>
- 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 * | |
- +--+--------------------------------------+--+--------------------------------------+</pre>
- <b>Special: configdb diff all current</b><br/>
- <br/>
- Will show a diff table containing all changes between saved version 0<br/>
- and UNSAVED version from memory (currently running installation).<br/>
- <br/>
- <li><code>configdb dump [unzipped]</code></li><br/>
- Create a gzipped dump file from from database.<br/>
- If optional parameter 'unzipped' provided, dump file will be written unzipped.<br/>
- <br/>
- <br/>
- <li><code>configdb filedelete <Filename></code></li><br/>
- Delete file from database.<br/>
- <br/>
- <br/>
- <li><code>configdb fileexport <targetFilename>|all</code></li><br/>
- Exports specified file (or all files) from database into filesystem.<br/>
- Example:<br/>
- <br/>
- <code>configdb fileexport FHEM/99_myUtils.pm</code><br/>
- <br/>
- <br/>
- <li><code>configdb fileimport <sourceFilename></code></li><br/>
- Imports specified text file from from filesystem into database.<br/>
- Example:<br/>
- <br/>
- <code>configdb fileimport FHEM/99_myUtils.pm</code><br/>
- <br/>
- <br/>
- <li><code>configdb filelist</code></li><br/>
- Show a list with all filenames stored in database.<br/>
- <br/>
- <br/>
- <li><code>configdb filemove <sourceFilename></code></li><br/>
- Imports specified fhem file from from filesystem into database and<br/>
- deletes the file from local filesystem afterwards.<br/>
- Example:<br/>
- <br/>
- <code>configdb filemove FHEM/99_myUtils.pm</code><br/>
- <br/>
- <br/>
- <li><code>configdb fileshow <Filename></code></li><br/>
- Show content of specified file stored in database.<br/>
- <br/>
- <br/>
- <li><code>configdb info</code></li><br/>
- Returns some database statistics<br/>
- <pre>
- --------------------------------------------------------------------------------
- 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
- --------------------------------------------------------------------------------
- </pre>
- Ver 0 always indicates the currently running configuration.<br/>
- <br/>
- <li><code>configdb list [device] [version]</code></li><br/>
- Search for device named [device] in configuration version [version]<br/>
- in database archive.<br/>
- Default value for [device] = % to show all devices.<br/>
- Default value for [version] = 0 to show devices from current version.<br/>
- Examples for valid requests:<br/>
- <br/>
- <code>get configDB list</code><br/>
- <code>get configDB list global</code><br/>
- <code>get configDB list '' 1</code><br/>
- <code>get configDB list global 1</code><br/>
- <br/>
- <li><code>configdb recover <version></code></li><br/>
- Restores an older version from database archive.<br/>
- <code>configdb recover 3</code> will <b>copy</b> version #3 from database
- to version #0.<br/>
- Original version #0 will be lost.<br/><br/>
- <b>Important!</b><br/>
- The restored version will <b>NOT</b> be activated automatically!<br/>
- You must do a <code>rereadcfg</code> or - even better - <code>shutdown restart</code> yourself.<br/>
- <br/>
- <li><code>configdb reorg [keep]</code></li><br/>
- Deletes all stored versions with version number higher than [keep].<br/>
- Default value for optional parameter keep = 3.<br/>
- This function can be used to create a nightly running job for<br/>
- database reorganisation when called from an at-Definition.<br/>
- <br/>
- <li><code>configdb search <searchTerm> [searchVersion]</code></li><br/>
- Search for specified searchTerm in any given version (default=0)<br/>
- <pre>
- 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,
- </pre>
- <br/>
- <li><code>configdb uuid</code></li><br/>
- Returns a uuid that can be used for own purposes.<br/>
- <br/>
- </ul>
- <br/>
- <br/>
- <b>Author's notes</b><br/>
- <br/>
- <ul>
- <li>You can find two template files for datebase and configfile (sqlite only!) for easy installation.<br/>
- Just copy them to your fhem installation directory (/opt/fhem) and have fun.</li>
- <br/>
- <li>The frontend option "Edit files"->"config file" will be removed when running configDB.</li>
- <br/>
- <li>Please be patient when issuing a "save" command
- (either manually or by clicking on "save config").<br/>
- This will take some moments, due to writing version informations.<br/>
- Finishing the save-process will be indicated by a corresponding message in frontend.</li>
- <br/>
- <li>There still will be some more (planned) development to this extension,
- especially regarding some perfomance issues.</li>
- <br/>
- <li>Have fun!</li>
- </ul>
- </ul>
- =end html
- =cut
|