| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- # $Id: 98_exportdevice.pm 12047 2016-08-22 08:06:24Z loredo $
- package main;
- use strict;
- use warnings;
- no if $] >= 5.017011, warnings => 'experimental';
- sub CommandExportdevice($$);
- ########################################
- sub exportdevice_Initialize($$) {
- my %hash = (
- Fn => "CommandExportdevice",
- Hlp => "[devspec] [quote] [dependent]",
- );
- $cmds{exportdevice} = \%hash;
- }
- ########################################
- sub CommandExportdevice($$) {
- my ( $cl, $param ) = @_;
- my @a = split( "[ \t][ \t]*", $param );
- my $quote = 0;
- my $dependent = 0;
- my $str = "";
- return "Usage: exportdevice [devspec] [quote] [dependent]"
- if ( $a[0] eq "?" );
- $dependent = 1
- if ( $a[0] eq "dependent"
- || $a[1] eq "dependent"
- || $a[1] eq "dependent" );
- $quote = 1
- if ( $a[0] eq "quote" || $a[1] eq "quote" || $a[2] eq "quote" );
- $a[0] = ".*"
- if ( int(@a) < 1
- || $a[0] eq "quote"
- || $a[0] eq "dependent" );
- my $mname = "";
- my @objects;
- foreach my $d ( devspec2array( $a[0], $cl ) ) {
- next if ( !$defs{$d} || $d ~~ @objects );
- push( @objects, $d );
- # w/ module header
- if ( $mname ne $defs{$d}{TYPE} ) {
- $mname = $defs{$d}{TYPE};
- $str .= CommandExportdeviceGetBlock( $d, $quote, 1 );
- }
- # w/o module header
- else {
- $str .= CommandExportdeviceGetBlock( $d, $quote );
- }
- if ($dependent) {
- # dependent objects
- my $dc = 0;
- foreach my $do ( CommandExportdeviceGetDependentObjects($d) ) {
- next if ( !$do || $do eq $d || $do ~~ @objects );
- push( @objects, $do );
- $dc++;
- $str .= "#+++ Dependent objects"
- if $dc == 1;
- # w/ module header
- if ( $mname ne $defs{$do}{TYPE} ) {
- $mname = $defs{$do}{TYPE};
- my $s = CommandExportdeviceGetBlock( $do, $quote, 1 );
- $s =~ s/\n/\n /g;
- $str .= $s;
- }
- # w/o module header
- else {
- my $s = CommandExportdeviceGetBlock( $do, $quote );
- $s =~ s/\n/\n /g;
- $str .= $s;
- }
- }
- }
- }
- my $return;
- $return = "#\n# Flat Export created by "
- if ( !$quote );
- $return = "#\n# Quoted Export created by "
- if ($quote);
- return
- $return
- . AttrVal( "global", "version", "fhem.pl:?/?" )
- . "\n# at "
- . TimeNow() . "\n#"
- . $str . "\n\n"
- if ( $str ne "" );
- return "No device found: $a[0]";
- }
- sub CommandExportdeviceGetBlock($$;$) {
- my ( $d, $quote, $h ) = @_;
- my $str = "";
- return if ( !$defs{$d} );
- # module header (only once)
- if ($h) {
- my $ver = fhem( "version " . $defs{$d}{TYPE}, 1 );
- $ver =~ s/\n+/\n# /g;
- $ver =~ s/^/# /g;
- $str .= "\n\n### TYPE: $defs{$d}{TYPE}\n$ver\n\n";
- }
- # device definition
- if ( $d ne "global" ) {
- my $def = $defs{$d}{DEF};
- if ( defined($def) ) {
- if ($quote) {
- $def =~ s/;/;;/g;
- $def =~ s/\n/\\\n/g;
- }
- $str .= "define $d $defs{$d}{TYPE} $def\n";
- }
- else {
- $str .= "define $d $defs{$d}{TYPE}\n";
- }
- }
- # device attributes
- foreach my $a (
- sort {
- return -1
- if ( $a eq "userattr" ); # userattr must be first
- return 1 if ( $b eq "userattr" );
- return $a cmp $b;
- } keys %{ $attr{$d} }
- )
- {
- next
- if ( $d eq "global"
- && ( $a eq "configfile" || $a eq "version" ) );
- my $val = $attr{$d}{$a};
- if ($quote) {
- $val =~ s/;/;;/g;
- $val =~ s/\n/\\\n/g;
- }
- $str .= "attr $d $a $val\n";
- }
- $str .= "\n";
- return $str;
- }
- sub CommandExportdeviceGetDependentObjects($) {
- my ($d) = @_;
- my @dob;
- foreach my $dn ( sort keys %defs ) {
- next if ( !$dn || $dn eq $d );
- my $dh = $defs{$dn};
- if ( ( $dh->{DEF} && $dh->{DEF} =~ m/\b$d\b/ )
- || ( $defs{$d}{DEF} && $defs{$d}{DEF} =~ m/\b$dn\b/ ) )
- {
- push( @dob, $dn );
- }
- }
- return @dob;
- }
- 1;
- =pod
- =item command
- =item summary exports definition and attributes of devices
- =item summary_DE exportiert die Definition und die Attribute von Geräten
- =begin html
- <a name="exportdevice"></a>
- <h3>exportdevice</h3>
- <ul>
- <code>exportdevice [devspec] [quote] [dependent]</code>
- <br><br>
- Output a complete device and attribute definition of FHEM devices. This is
- one of the few commands which return a string in a normal case.<br>
- See the <a href="#devspec">Device specification</a> section for details on
- <devspec>.
- <br><br>
- The output can be used for reimport using FHEMWEB or telnet command line.<br>
- The optional paramter "quote" may be added to receive fhem.cfg compatible output.
- <br><br>
- Example:
- <pre><code> fhem> exportdevice Office
- #
- # Export created by fhem.pl:12022/2016-08-21
- # on 2016-08-22 01:02:59
- #
- ### TYPE: FS20
- # File Rev Last Change
- # 10_FS20.pm 11984 2016-08-19 12:47:50Z rudolfkoenig
- define Office FS20 1234 12
- attr Office userattr Light Light_map structexclude
- attr Office IODev CUL_0
- attr Office Light AllLights
- attr Office group Single Lights
- attr Office icon light_office
- attr Office model fs20st
- attr Office room Light
- </code></pre>
- </ul>
- =end html
- =begin html_DE
- <a name="exportdevice"></a>
- <h3>exportdevice</h3>
- <ul>
- <code>exportdevice [devspec] [quote] [dependent]</code>
- <br><br>
- Gibt die komplette Definition und Attribute eines FHEM Gerätes aus. Dies
- ist eines der wenigen Befehle, die im Normalfall eine Zeichenkette ausgeben.<br>
- Siehe den Abschnitt über <a href="#devspec">Geräte-Spezifikation</a>
- für Details der <devspec>.
- <br><br>
- Die Ausgabe kann für einen Reimport mittels FHEMWEB oder Telnet
- Kommandozeile verwendet werden.<br>
- Der optionale Parameter "quote" kann genutzt werden, um eine fhem.cfg
- kompatible Ausgabe zu erhalten.
- <br><br>
- Beispiel:
- <pre><code> fhem> exportdevice Office
- #
- # Export created by fhem.pl:12022/2016-08-21
- # on 2016-08-22 01:02:59
- #
- ### TYPE: FS20
- # File Rev Last Change
- # 10_FS20.pm 11984 2016-08-19 12:47:50Z rudolfkoenig
- define Office FS20 1234 12
- attr Office userattr Light Light_map structexclude
- attr Office IODev CUL_0
- attr Office Light AllLights
- attr Office group Single Lights
- attr Office icon light_office
- attr Office model fs20st
- attr Office room Light
- </code></pre>
- </ul>
- =end html_DE
- =cut
|