From 7fb0c5c7caad6257797ddd496af271711e00e7bb Mon Sep 17 00:00:00 2001 From: fhemzap <> Date: Fri, 2 Oct 2015 18:49:32 +0000 Subject: [PATCH] HMCCUDEV: Client devices for HMCCU git-svn-id: https://svn.fhem.de/fhem/trunk@9343 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/contrib/HMCCU/88_HMCCUDEV.pm | 317 ++++++++++++++++++++++++++++++ 1 file changed, 317 insertions(+) create mode 100644 fhem/contrib/HMCCU/88_HMCCUDEV.pm diff --git a/fhem/contrib/HMCCU/88_HMCCUDEV.pm b/fhem/contrib/HMCCU/88_HMCCUDEV.pm new file mode 100644 index 000000000..f82e0df7c --- /dev/null +++ b/fhem/contrib/HMCCU/88_HMCCUDEV.pm @@ -0,0 +1,317 @@ +################################################################ +# +# 88_HMCCUDEV.pm +# +# $Id:$ +# +# Version 1.0 +# +# (c) 2015 zap (zap01 t-online de) +# +################################################################ +# +# define HMCCUDEV +# +# set datapoint . +# set devstate +# +# get datapoint . +# +# attr ccureadings { 0 | 1 } +# attr statechannel +# attr stateval :[,...] +# attr substitute :[,...] +# +################################################################ +# Requires module 88_HMCCU +################################################################ + +package main; + +use strict; +use warnings; +use SetExtensions; + +sub HMCCUDEV_Define ($$); +sub HMCCUDEV_Set ($@); +sub HMCCUDEV_Get ($@); +sub HMCCUDEV_Attr ($@); +sub HMCCUDEV_SetError ($$); + +##################################### +# Initialize module +##################################### + +sub HMCCUDEV_Initialize ($) +{ + my ($hash) = @_; + + $hash->{DefFn} = "HMCCUDEV_Define"; + $hash->{SetFn} = "HMCCUDEV_Set"; + $hash->{GetFn} = "HMCCUDEV_Get"; + $hash->{AttrFn} = "HMCCUDEV_Attr"; + + $hash->{AttrList} = "IODev ccureadings:0,1 stateval substitute statechannel:0,1,2,3 loglevel:0,1,2,3,4,5,6 ". $readingFnAttributes; +} + +##################################### +# Define device +##################################### + +sub HMCCUDEV_Define ($$) +{ + my ($hash, $def) = @_; + my $name = $hash->{NAME}; + my @a = split("[ \t][ \t]*", $def); + + return "Specifiy the CCU device name as parameters" if(@a < 3); + return "Channel or datapoint not allowed in CCU device name" if ($a[2] =~ /^(.*):/); + + $attr{$name}{ccureadings} = 1; + + # Keep name of CCU device + $hash->{ccudev} = $a[2]; + + # Inform HMCCU device about client device + Log 1, "HMCCUDEV: Assigning IO Port"; + AssignIoPort ($hash); + + readingsSingleUpdate ($hash, "state", "Initialized", 1); + + return undef; +} + +##################################### +# Set attribute +##################################### + +sub HMCCUDEV_Attr ($@) +{ + my ($cmd, $name, $attrname, $attrval) = @_; + + if (defined ($attrval)) { + if ($cmd eq "set" && $attrname eq "IODev") { + $defs{$name}{IODev} = $defs{$attrval}; + } + } + + return undef; +} + +##################################### +# Set commands +##################################### + +sub HMCCUDEV_Set ($@) +{ + my ($hash, @a) = @_; + my $name = shift @a; + my $opt = shift @a; + + if (!defined ($hash->{IODev})) { + return HMCCUDEV_SetError ($hash, "No IO device defined"); + } + + my $statechannel = AttrVal ($name, "statechannel", ''); + my $stateval = AttrVal ($name, "stateval", ''); + my $substitute = AttrVal ($name, "substitute", ''); + + my $hmccu_hash = $hash->{IODev}; + my $hmccu_name = $hash->{IODev}->{NAME}; + my $ccudev = $hash->{ccudev}; + + # process set command par1 ... + if ($opt eq 'datapoint') { + my $objname = shift @a; + my $objvalue = join ('%20', @a); + + if (!defined ($objname) || $objname !~ /^[0-9]+\..*$/ || !defined ($objvalue)) { + return HMCCUDEV_SetError ($hash, "Usage: set datapoint . "); + } + + $objname = $ccudev.':'.$objname; + + my ($dev, $chn, $dpt, $flags) = HMCCU_ParseCCUDev ($objname); + if ($flags != 7) { + return HMCCUDEV_SetError ($hash, "Format for objname is channel.datapoint"); + } + + $objvalue = HMCCU_Substitute ($objvalue, $substitute); + HMCCU_Set ($hmccu_hash, $hmccu_name, 'datapoint', $objname, $objvalue); + usleep (100000); + HMCCU_Get ($hmccu_hash, $hmccu_name, 'datapoint', $objname); + + return undef; + } + elsif ($opt eq 'devstate') { + my $objvalue = join ('%20', @a); + + if ($statechannel eq '') { + return HMCCUDEV_SetError ($hash, "No STATE channel specified"); + } + if (!defined ($objvalue)) { + return HMCCUDEV_SetError ($hash, "Usage: set devstate "); + } + + my $objname = $ccudev.':'.$statechannel.'.STATE'; + $objvalue = HMCCU_Substitute ($objvalue, $stateval); + HMCCU_Set ($hmccu_hash, $hmccu_name, 'datapoint', $objname, $objvalue); + usleep (100000); + HMCCU_Get ($hmccu_hash, $hmccu_name, 'datapoint', $objname); + + return undef; + } + else { + my $retmsg = "HMCCUDEV: Unknown argument $opt, choose one of datapoint"; + if ($stateval ne '') { + my @valpairs = split /,/, $stateval; + my $sep = " devstate:"; + foreach my $vp (@valpairs) { + my @sv = split /:/, $vp; + if (@sv == 2) { + $retmsg = $retmsg . $sep . $sv[0]; + $sep = "," if ($sep ne ','); + } + } + } + return $retmsg; + } +} + +##################################### +# Get commands +##################################### + +sub HMCCUDEV_Get ($@) +{ + my ($hash, @a) = @_; + my $name = shift @a; + my $opt = shift @a; + + if (!defined ($hash->{IODev})) { + return HMCCUDEV_SetError ($hash, "No IO device defined"); + } + + my $hmccu_hash = $hash->{IODev}; + my $hmccu_name = $hash->{IODev}->{NAME}; + my $ccudev = $hash->{ccudev}; + + if ($opt eq 'datapoint') { + my $objname = shift @a; + if (!defined ($objname) || $objname !~ /^[0-9]+\..*$/) { + return HMCCUDEV_SetError ($hash, "Usage: get datapoint ."); + } + + $objname = $ccudev.':'.$objname; + my ($dev, $chn, $dpt, $flags) = HMCCU_ParseCCUDev ($objname); + if ($flags != 7) { + return HMCCUDEV_SetError ($hash, "Format for objname is channel.datapoint"); + } + + HMCCU_Get ($hmccu_hash, $hmccu_name, 'datapoint', $objname); + + return undef; + } + else { + return "HMCCUDEV: Unknown argument $opt, choose one of datapoint"; + } +} + +sub HMCCUDEV_SetError ($$) +{ + my ($hash, $text) = @_; + my $name = $hash->{NAME}; + + $text = "HMCCUDEV: ".$name." ". $text; + readingsSingleUpdate ($hash, "state", "Error", 1); + Log 1, $text; + return $text; +} + +1; + +=pod +=begin html + + +

HMCCUDEV

+
+
    + The module implements client devices for HMCCU. +

    + + Define +
      +
      + define <name> HMCCUDEV <CCU_Device> +

      + Example: +
      + define window_living HMCCUDEV WIN-LIV-1 +

      + CCU_Device - Name of device in CCU without channel or datapoint. +
      +
    +
    + + + Set
    +
      +
      +
    • set <Name> devstate <Value> +
      + Set state of a CCU device channel. Channel must be defined in attribute + statechannel. +

      + Example:
      + set light_entrance devstate on +

    • +
    • set <Name> datapoint <channel.datapoint> <Value> +
      + Set value of a datapoint of a CCU device channel. +

      + Example:
      + set temp_control datapoint TEMP_CONTROL:2.SET_TEMPERATURE 21 +

    • +
    +
    + + + Get
    +
      +
      +
    • get <Name> datapoint <Device:Channel.datapoint> +
      + Get state of a CCU device datapoint. +

    • +
    +
    + + + Attributes
    +
    +
      +
    • ccureadings <0 | 1> +
      + If set to 1 values read from CCU will be stored as readings. +

    • +
    • statechannel <Channel> +
      + Channel for setting device state by devstate command. +

    • +
    • stateval <text:text[,...]> +
      + Define substitution for set commands values. +

    • +
    • substitude <expression:string[,...]> +
      + Define substitions for reading values. Substitutions for parfile values must + be specified in parfiles. +

    • +
    +
+
+ +=end html +=cut +