From 1064e2a68f05f1b0eb303d3cf2167c9ab06b8b38 Mon Sep 17 00:00:00 2001 From: mike3436 <> Date: Fri, 13 Oct 2017 18:26:18 +0000 Subject: [PATCH] 26_tahoma.pm:2017-10-08 V 0216 group definition added git-svn-id: https://svn.fhem.de/fhem/trunk@15245 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/26_tahoma.pm | 65 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/fhem/FHEM/26_tahoma.pm b/fhem/FHEM/26_tahoma.pm index a492bb80c..2d5a02656 100644 --- a/fhem/FHEM/26_tahoma.pm +++ b/fhem/FHEM/26_tahoma.pm @@ -48,6 +48,7 @@ # 2017-07-01 V 0215 creation of fid and device names for first autocreate extended # 2017-07-08 V 0215 login delay increased automatically up to 160s if login failed # 2017-07-08 V 0215 default set commands on devices without commands deleted +# 2017-10-08 V 0216 group definition added package main; @@ -113,13 +114,14 @@ sub tahoma_fhemIdFromOid($) return $oid[0]; } +my $groupId = 123001; sub tahoma_Define($$) { my ($hash, $def) = @_; my @a = split("[ \t][ \t]*", $def); - my $ModuleVersion = "0215"; + my $ModuleVersion = "0216"; my $subtype; my $name = $a[0]; @@ -155,6 +157,23 @@ sub tahoma_Define($$) $modules{$hash->{TYPE}}{defptr}{"$fid"} = $hash; + } elsif( $a[2] eq "GROUP" && @a == 4 ) { + $subtype = "GROUP"; + + my $oid = $a[@a-1]; + my $fid = 'group' . "$groupId"; + $groupId++; + + $hash->{oid} = $oid; + $hash->{fid} = $fid; + + $hash->{INTERVAL} = 0; + + my $d = $modules{$hash->{TYPE}}{defptr}{"$fid"}; + return "group oid $oid already defined as $d->{NAME}" if( defined($d) && $d->{NAME} ne $name ); + + $modules{$hash->{TYPE}}{defptr}{"$fid"} = $hash; + } elsif( $a[2] eq "SCENE" && @a == 4 ) { $subtype = "SCENE"; @@ -202,6 +221,7 @@ sub tahoma_Define($$) tahoma_connect($hash) if( $hash->{SUBTYPE} eq "ACCOUNT" ); tahoma_initDevice($hash) if( $hash->{SUBTYPE} eq "DEVICE" ); tahoma_initDevice($hash) if( $hash->{SUBTYPE} eq "PLACE" ); + tahoma_initDevice($hash) if( $hash->{SUBTYPE} eq "GROUP" ); tahoma_initDevice($hash) if( $hash->{SUBTYPE} eq "SCENE" ); } @@ -236,6 +256,7 @@ sub tahoma_Notify($$) tahoma_connect($hash) if( $hash->{SUBTYPE} eq "ACCOUNT" ); tahoma_initDevice($hash) if( $hash->{SUBTYPE} eq "DEVICE" ); tahoma_initDevice($hash) if( $hash->{SUBTYPE} eq "PLACE" ); + tahoma_initDevice($hash) if( $hash->{SUBTYPE} eq "GROUP" ); tahoma_initDevice($hash) if( $hash->{SUBTYPE} eq "SCENE" ); } @@ -243,9 +264,10 @@ sub tahoma_Undefine($$) { my ($hash, $arg) = @_; - delete( $modules{$hash->{TYPE}}{defptr}{"$hash->{device}"} ) if( $hash->{SUBTYPE} eq "DEVICE" ); - delete( $modules{$hash->{TYPE}}{defptr}{"$hash->{oid}"} ) if( $hash->{SUBTYPE} eq "PLACE" ); - delete( $modules{$hash->{TYPE}}{defptr}{"$hash->{oid}"} ) if( $hash->{SUBTYPE} eq "SCENE" ); + delete( $modules{$hash->{TYPE}}{defptr}{"$hash->{fid}"} ) if( $hash->{SUBTYPE} eq "DEVICE" ); + delete( $modules{$hash->{TYPE}}{defptr}{"$hash->{fid}"} ) if( $hash->{SUBTYPE} eq "PLACE" ); + delete( $modules{$hash->{TYPE}}{defptr}{"$hash->{fid}"} ) if( $hash->{SUBTYPE} eq "GROUP" ); + delete( $modules{$hash->{TYPE}}{defptr}{"$hash->{fid}"} ) if( $hash->{SUBTYPE} eq "SCENE" ); return undef; } @@ -499,6 +521,13 @@ sub tahoma_initDevice($) $hash->{inLabel} = $device->{label}; $hash->{inOID} = $device->{oid}; } + elsif($subtype eq 'GROUP' ) { + $hash->{inType} = ''; + $hash->{inLabel} = ''; + $hash->{inLabel} = $attr{$hash->{NAME}}{alias} if (defined $attr{$hash->{NAME}}{alias}); + $hash->{inOID} = ''; + $hash->{inClass} = ''; + } else { my $device=$hash->{device}; @@ -656,6 +685,19 @@ sub tahoma_getDeviceList($$$$) } } +sub tahoma_getGroupList($$$) +{ + my ($hash,$oid,$deviceList) = @_; + #print "tahoma_getGroupList oid=$oid devices=".scalar @{$deviceList}."\n"; + + my @groupDevices = split(',',$oid); + foreach my $module (@groupDevices) { + if (defined($defs{$module}) && defined($defs{$module}{device}) && defined($defs{$module}{inClass})) { + push ( @{$deviceList}, { device => $defs{$module}{device}, class => $defs{$module}{inClass}, levelInvert => $attr{$module}{levelInvert} } ) ; + } + } +} + sub tahoma_checkCommand($$$$) { my ($hash,$device,$command,$value) = @_; @@ -685,13 +727,15 @@ sub tahoma_applyRequest($$$) Log3 $name, 4, "$name: tahoma_applyRequest"; if ( !defined($hash->{IODev}) || !(defined($hash->{device}) || defined($hash->{oid})) || !defined($hash->{inLabel}) || !defined($hash->{inClass}) ) { - Log3 $name, 4, "$name: tahoma_applyRequest failed - define error"; + Log3 $name, 3, "$name: tahoma_applyRequest failed - define error"; return; } my @devices = (); if ( defined($hash->{device}) ) { push ( @devices, { device => $hash->{device}, class => $hash->{inClass}, commands => $hash->{COMMANDS}, levelInvert => $attr{$hash->{NAME}}{levelInvert} } ); + } elsif ($hash->{SUBTYPE} eq 'GROUP') { + tahoma_getGroupList($hash->{IODev},$hash->{oid},\@devices); } else { tahoma_getDeviceList($hash->{IODev},$hash->{oid},$hash->{inClass},\@devices); } @@ -1288,6 +1332,7 @@ sub tahoma_Get($$@) } } elsif( $hash->{SUBTYPE} eq "SCENE" + || $hash->{SUBTYPE} eq "GROUP" || $hash->{SUBTYPE} eq "PLACE" ) { $list = ""; @@ -1320,9 +1365,11 @@ sub tahoma_Get($$@) sub tahoma_Set($$@) { my ($hash, $name, $cmd, $val) = @_; + #Log3 $name, 3, "$name: tahoma_Set $cmd $val $hash->{SUBTYPE} $hash->{COMMANDS}"; my $list = ""; if( $hash->{SUBTYPE} eq "DEVICE" || + $hash->{SUBTYPE} eq "GROUP" || $hash->{SUBTYPE} eq "PLACE" ) { $list = "dim:slider,0,1,100 setClosure open:noArg close:noArg my:noArg stop:noArg cancel:noArg"; $list = $hash->{COMMANDS} if (defined $hash->{COMMANDS}); @@ -1552,6 +1599,7 @@ sub tahoma_decrypt($) define <name> tahoma DEVICE <DeviceURL>
define <name> tahoma PLACE <oid>
define <name> tahoma SCENE <oid>
+ define <name> tahoma GROUP <tahoma_device1>,<tahoma_device2>,<tahoma_device3>


A definition is only necessary for a tahoma device:
@@ -1561,6 +1609,7 @@ sub tahoma_decrypt($) All registrated devices are automatically created with name tahoma_12345 (device number 12345 is used from setup)
All defined rooms will be are automatically created.
Also all defined scenes will be automatically created.
+ Groups of devices can be manually added to send out one group command for all attached devices


global Attributes for ACCOUNT: @@ -1616,6 +1665,12 @@ sub tahoma_decrypt($) attr tahoma_4ef30a23 IODev tahoma1
attr tahoma_4ef30a23 alias scene Rolladen Südfenster zu
attr tahoma_4ef30a23 room tahoma
+
+
manual created group e.g.:
+ define tahoma_group1 tahoma GROUP tahoma_23234545,tahoma_23234546,tahoma_23234547
+ attr tahoma_group1 IODev tahoma1
+ attr tahoma_group1 alias Gruppe Rolladen Westen
+ attr tahoma_group1 room tahoma