diff --git a/fhem/CHANGED b/fhem/CHANGED index 3e6c0b3f8..70d358343 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,7 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - feature: SHC: support for analog inputs (EnvSensor) and new device + RGB_Dimmer added (rr2000) - feature: PRESENCE: MAC address support for mode fritzbox (by Markus M.) - bugfix: PRESENCE: fixing presence detection in mode fritzbox with new Fritz!OS 6.20 (by Markus M.) diff --git a/fhem/FHEM/37_SHCdev.pm b/fhem/FHEM/37_SHCdev.pm index 1d986dfc4..4905ab894 100644 --- a/fhem/FHEM/37_SHCdev.pm +++ b/fhem/FHEM/37_SHCdev.pm @@ -35,13 +35,15 @@ my $parser = new SHC_parser(); my %dev_state_icons = ( "PowerSwitch" => "on:on:toggle off:off:toggle set.*:light_question:off", "Dimmer" => "on:on off:off set.*:light_question:off", - "EnvSensor" => undef + "EnvSensor" => undef, + "RGB_Dimmer" => undef ); my %web_cmds = ( "PowerSwitch" => "on:off:toggle:statusRequest", "Dimmer" => "on:off:statusRequest", - "EnvSensor" => undef + "EnvSensor" => undef, + "RGB_Dimmer" => undef ); # Array format: [ reading1, str_format1, reading2, str_format2 ... ] @@ -50,12 +52,17 @@ my %web_cmds = ( my %dev_state_format = ( "PowerSwitch" => ["on", ""], "Dimmer" => ["on", "", "brightness", "B: "], - "EnvSensor" => [ # Results in "T: 23.4 H: 27.3 Baro: 978.34 B: 45" + "EnvSensor" => [ # Results in "T: 23.4 H: 27.3 Baro: 978.34 B: 45" "temperature", "T: ", "humidity", "H: ", "barometric_pressure", "Baro: ", "brightness", "B: ", - "distance", "D: " + "distance", "D: ", + "dins", "Din: ", + "ains", "Ain: " + ], + "RGB_Dimmer" => [ + "color", "Color: " ] ); @@ -71,6 +78,8 @@ my %sets = ( # Used from SetExtensions.pm "blink on-for-timer on-till off-for-timer off-till intervals", "EnvSensor" => "", + "RGB_Dimmer" => "Color " . + "ColorAnimation", "Custom" => "PowerSwitch.SwitchState " . "PowerSwitch.SwitchStateExt " . "Dimmer.Brightness " . @@ -82,7 +91,8 @@ my %sets = ( my %gets = ( "PowerSwitch" => "", "Dimmer" => "", - "EnvSensor" => "input:all,1,2,3,4,5,6,7,8 ", + "EnvSensor" => "din:all,1,2,3,4,5,6,7,8 ain:all,1,2,3,4,5 ain_volt:1,2,3,4,5", + "RGB_Dimmer" => "", "Custom" => "" ); @@ -96,8 +106,11 @@ my %auto_devtype = ( "Environment.Brightness" => "EnvSensor", "Environment.Distance" => "EnvSensor", "GPIO.DigitalPin" => "EnvSensor", + "GPIO.AnalogPin" => "EnvSensor", "PowerSwitch.SwitchState" => "PowerSwitch", - "Dimmer.Brightness" => "Dimmer" + "Dimmer.Brightness" => "Dimmer", + "Dimmer.Color" => "RGB_Dimmer", + "Dimmer.ColorAnimation" => "RGB_Dimmer" ); sub SHCdev_Parse($$); @@ -117,7 +130,7 @@ sub SHCdev_Initialize($) ." readonly:1" ." forceOn:1" ." $readingFnAttributes" - ." devtype:EnvSensor,Dimmer,PowerSwitch"; + ." devtype:EnvSensor,Dimmer,PowerSwitch,RGB_Dimmer"; } ##################################### @@ -241,10 +254,22 @@ sub SHCdev_Parse($$) for (my $i = 0 ; $i < 8 ; $i++) { my $pinx = $parser->getField("On", $i); my $channel = $i + 1; - readingsBulkUpdate($rhash, "pin" . $channel, $pinx); + readingsBulkUpdate($rhash, "din" . $channel, $pinx); $pins .= $pinx; } - readingsBulkUpdate($rhash, "pins", $pins); + readingsBulkUpdate($rhash, "dins", $pins); + } + when ('AnalogPin') { + my $pins = ""; + for (my $i = 0 ; $i < 5 ; $i++) { + my $pinx_on = $parser->getField("On", $i); + my $pinx_volt = $parser->getField("Voltage", $i); + my $channel = $i + 1; + readingsBulkUpdate($rhash, "ain" . $channel, $pinx_on); + readingsBulkUpdate($rhash, "ain_volt" . $channel, $pinx_volt); + $pins .= $pinx_on; + } + readingsBulkUpdate($rhash, "ains", $pins); } } } @@ -303,6 +328,22 @@ sub SHCdev_Parse($$) readingsBulkUpdate($rhash, "on", $on); readingsBulkUpdate($rhash, "brightness", $brightness); } + when ('Color') { + my $color = $parser->getField("Color"); + readingsBulkUpdate($rhash, "color", $color); + } + when ('ColorAnimation') { + my $repeat = $parser->getField("Repeat"); + my $autoreverse = $parser->getField("AutoReverse"); + readingsBulkUpdate($rhash, "repeat", $repeat); + readingsBulkUpdate($rhash, "autoreverse", $autoreverse); + for (my $i = 0 ; $i < 10 ; $i = $i + 1) { + my $time = $parser->getField("Time" , $i); + my $color = $parser->getField("Color", $i); + readingsBulkUpdate($rhash, "time$i", $time); + readingsBulkUpdate($rhash, "color$i", $color); + } + } } } } @@ -478,6 +519,53 @@ sub SHCdev_Set($@) return SetExtensions($hash, "", $name, @aa); } } + when ('RGB_Dimmer') { + if ($cmd eq 'Color') { + #TODO Verify argument values + my $color = $arg; + + # DEBUG + # Log3 $name, 3, "$name: Color args: $arg, $arg2, $arg3, $arg4"; + + readingsSingleUpdate($hash, "state", "set-color:$color", 1); + $parser->initPacket("Dimmer", "Color", "SetGet"); + $parser->setField("Dimmer", "Color", "Color", $color); + SHCdev_Send($hash); + } elsif ($cmd eq 'ColorAnimation') { + #TODO Verify argument values + + $parser->initPacket("Dimmer", "ColorAnimation", "SetGet"); + $parser->setField("Dimmer", "ColorAnimation", "Repeat", $arg); + $parser->setField("Dimmer", "ColorAnimation", "AutoReverse", $arg2); + + my $curtime = 0; + my $curcolor = 0; + # Iterate over all given command line parameters and set Time and Color + # accordingly. Fill the remaining values with zero. + for (my $i = 0 ; $i < 10 ; $i = $i + 1) { + if (!defined($aa[($i * 2) + 3])) { + $curtime = 0; + } else { + $curtime = $aa[($i * 2) + 3]; + } + if (!defined($aa[($i * 2) + 4])) { + $curcolor = 0; + } else { + $curcolor = $aa[($i * 2) + 4]; + } + + # DEBUG + # Log3 $name, 3, "$name: Nr: $i Time: $curtime Color: $curcolor"; + + $parser->setField("Dimmer", "ColorAnimation", "Time" , $curtime, $i); + $parser->setField("Dimmer", "ColorAnimation", "Color", $curcolor, $i); + } + readingsSingleUpdate($hash, "state", "set-coloranimation", 1); + SHCdev_Send($hash); + } else { + return SetExtensions($hash, "", $name, @aa); + } + } } return undef; @@ -505,9 +593,9 @@ sub SHCdev_Get($@) given ($devtype) { when ('EnvSensor') { - if ($cmd eq 'input') { + if ($cmd eq 'din') { if ($arg =~ /[1-8]/) { - my $channel = "pin" . $arg; + my $channel = "din" . $arg; if ( defined($hash->{READINGS}{$channel}) && defined($hash->{READINGS}{$channel}{VAL})) { @@ -517,14 +605,45 @@ sub SHCdev_Get($@) } elsif ($arg eq "all") { - if ( defined($hash->{READINGS}{pins}) - && defined($hash->{READINGS}{pins}{VAL})) + if ( defined($hash->{READINGS}{dins}) + && defined($hash->{READINGS}{dins}{VAL})) { - return "$name.pins => " . $hash->{READINGS}{pins}{VAL}; + return "$name.dins => " . $hash->{READINGS}{dins}{VAL}; } return "Error: \"input all\" readings not yet available or not supported by device"; } } + if ($cmd eq 'ain') { + if ($arg =~ /[1-5]/) { + my $channel = "ain" . $arg; + if ( defined($hash->{READINGS}{$channel}) + && defined($hash->{READINGS}{$channel}{VAL})) + { + return "$name.$channel => " . $hash->{READINGS}{$channel}{VAL}; + } + return "Error: \"input " . $channel . "\" readings not yet available or not supported by device"; + } + elsif ($arg eq "all") + { + if ( defined($hash->{READINGS}{ains}) + && defined($hash->{READINGS}{ains}{VAL})) + { + return "$name.ains => " . $hash->{READINGS}{ains}{VAL}; + } + return "Error: \"input all\" readings not yet available or not supported by device"; + } + } + if ($cmd eq 'ain_volt') { + if ($arg =~ /[1-5]/) { + my $channel = "ain_volt" . $arg; + if ( defined($hash->{READINGS}{$channel}) + && defined($hash->{READINGS}{$channel}{VAL})) + { + return "$name.$channel => " . $hash->{READINGS}{$channel}{VAL}; + } + return "Error: \"input " . $channel . "\" readings not yet available or not supported by device"; + } + } # This return is required to provide the get commands in the web interface return "Unknown argument $cmd, choose one of " . $gets{$devtype}; @@ -603,6 +722,16 @@ sub SHCdev_Send($)
  • statusRequest
    Supported by Dimmer and PowerSwitch.

  • +
  • Color <ColorNumber>
    + A detailed description is available at www.smarthomatic.org + The color palette can be found here + Supported by RGB_Dimmer. +

  • +
  • ColorAnimation <Repeat> <AutoReverse> <Time0> <ColorNumber0> <Time1> <ColorNumber1> ... up to 10 time/color pairs
    + A detailed description is available at www.smarthomatic.org + The color palette can be found here + Supported by RGB_Dimmer. +

  • set extensions
    Supported by Dimmer and PowerSwitch.

  • @@ -610,8 +739,22 @@ sub SHCdev_Send($) Get
    @@ -621,7 +764,7 @@ sub SHCdev_Send($)