########################################################################################################################
# Light.pm
#-----------------------------------------------------------------------------------------------------------------------
#
# Steuerung von Ikea Tradfri Lampen
#
# Bei farbige Lampen kann die Farbtemperatur zusätzlich über ct-Werte eingestellt werden. Hierzu wurde ein Mapping der
# Temperaturangabe auf die xy-Farbskala integriert.
#
#
# Getestete Geräte:
# TRADFRI bulb E27 CWS opal 600lm (Color)
# TRADFRI bulb E14 CWS opal 600lm (Color)
# TRADFRI bulb E14 W op/ch 400lm (Fix White)
# FLAIR VIYU-C35-470-CCT-10011722 (Tunable White) 
#
#
# Aufruf           : use TSS::Ikea::Tradfri::Light;
#                    my $gobjDevice = TSS::Ikea::Tradfri::Light->new( gateway => <Gateway>, devicedata => <Gerätedaten> );
#                    my $gobjDevice=$gobjGateway->getDeviceInfo("itfl65552"); # itfl65552=Geräte-ID-Lampen
#                    print $gobjDevice."\n";
#                      > <datapoint deviceid='itfl65552' name='Stehlampe' devicetype='TRADFRI bulb E27 CWS opal 600lm' online='1' status='1' brightness='120' temperature='2' color='5' ct='153' xyY='9830,3932,133' hsv='65535,65279,75' />
#     
#                    Version ausgeben:
#                    -----------------
#                    print "Version: ".$TSS::Ikea::Tradfri::Light::VERSION."\n";
#                      > Version: v3.0.0
#
#                    Name des Gerätes ausgeben:
#                    --------------------------
#                    print $gobjDevice->name()."\n";
#                      > <datapoint deviceid='itfl65552' name='Stehlampe' />
#
#                    Adresse des Gerätes ausgeben:
#                    -----------------------------
#                    print $gobjDevice->deviceid()."\n";
#                      >  <datapoint deviceid='itfl65552' />
#
#                    Typ des Gerätes ausgeben:
#                    -------------------------
#                    print $gobjDevice->devicetype()."\n";
#                      >  <datapoint deviceid='itfl65552' devicetype='TRADFRI bulb E27 CWS opal 600lm' />
#
#                    Version des Gerätes ausgeben:
#                    -----------------------------
#                    print $gobjDevice->version()."\n";
#                      > <datapoint deviceid='itfl65552' version='1.3.009' />
#
#                    Erreichbarkeit des Gerätes ausgeben:
#                    ------------------------------------
#                    print $gobjDevice->online()."\n";
#                      > <datapoint deviceid='itfl65552' online='1' />
#
#                    Power-Status des Gerätes ausgeben:
#                    ----------------------------------
#                    print $gobjDevice->status()."\n";
#                      > <datapoint deviceid='itfl65552' status='1' />
#
#                    Helligkeit des Gerätes ausgeben:
#                    --------------------------------
#                    print $gobjDevice->brightness()."\n";
#                      > <datapoint deviceid='itfl65552' brightness='66' />
#
#                    Farbemperatur des Gerätes ausgeben:
#                    -----------------------------------
#                    print $gobjDevice->temperature()."\n";
#                      > <datapoint deviceid='itfl65552' temperature='2' />
#
#                    Farbe über Farbwert des Gerätes ausgeben:
#                    -----------------------------------------
#                    print $gobjDevice->color()."\n";
#                      > <datapoint deviceid='itfl65552' color='5' />
#
#                    Farbemperatur über ct-Wert des Gerätes ausgeben:
#                    ------------------------------------------------
#                    print $gobjDevice->ct()."\n";
#                      > <datapoint deviceid='itfl65552' ct='153' />
#
#                    Farbe über xyY-Wert des Gerätes ausgeben:
#                    -----------------------------------------
#                    print $gobjDevice->xyy()."\n";
#                      > <datapoint deviceid='itfl65552' xyY='9830,3932,133' />
#
#                    Farbe über HSV-Wert des Gerätes ausgeben:
#                    -----------------------------------------
#                    print $gobjDevice->hsv()."\n";
#                      > <datapoint deviceid='itfl65552' hsv='65535,65279,75' />
#
#                    Batteriestand des Gerätes ausgeben:
#                    -----------------------------------
#                    print $gobjDevice->batterylevel()."\n";
#                      >  <datapoint deviceid='itfl65552' batterylevel='-1' />
#
#                    Gesamtstatus des Gerätes ausgeben:
#                    ----------------------------------
#                    print $gobjDevice->devicestate()."\n";
#                      > <datapoint deviceid='itfl65552' name='Stehlampe' devicetype='TRADFRI bulb E27 CWS opal 600lm' online='1' status='1' brightness='66' temperature='2' color='5' ct='153' xyY='9830,3932,133' hsv='65535,65279,75' />
#
#                    Alle Geräteinformationen neu einlesen:
#                    --------------------------------------
#                    my $gintResult=$gobjDevice->readDeviceInfo();
#                    if (! defined($gintResult)) { print "Befehl nicht erfolgreich! Fehler:\"".$gobjGateway->{"error"}."\"\n"; exit(1); }
#                    print $gobjDevice->devicestate()."\n";
#                      > <datapoint deviceid='itfl65552' name='Stehlampe' devicetype='TRADFRI bulb E27 CWS opal 600lm' online='1' status='1' brightness='66' temperature='2' color='5' ct='153' xyY='9830,3932,133' hsv='65535,65279,75' />
#
#                    Das Gerät aus-/einschalten:
#                    ---------------------------
#                    my $gstrResult=$gobjDevice->setPower(x); # 0=aus, 1=ein
#                    if (! defined($gstrResult)) { print "Befehl nicht erfolgreich! Fehler:\"".$gobjGateway->{"error"}."\"\n"; exit(1); }
#                    else { print "$gstrResult\n"; }
#                      > <datapoint deviceid='itfl65552' status='0' />
#
#                    Helligkeit des Gerätes ändern:
#                    ------------------------------
#                    my $gstrResult=$gobjDevice->setBrightness(x); # 0-254
#                    if (! defined($gstrResult)) { print "Befehl nicht erfolgreich! Fehler:\"".$gobjGateway->{"error"}."\"\n"; exit(1); }
#                    else { print "$gstrResult\n"; }
#                      > <datapoint deviceid='itfl65552' brightness='100' />
#
#                    Farbemperatur des Gerätes ändern:
#                    ---------------------------------
#                    my $gstrResult=$gobjDevice->setTemperature(x); # 1-3
#                    if (! defined($gstrResult)) { print "Befehl nicht erfolgreich! Fehler:\"".$gobjGateway->{"error"}."\"\n"; exit(1); }
#                    else { print "$gstrResult\n"; }
#                      > <datapoint deviceid='itfl65552' temperature='2' />
#
#                    Farbe des Gerätes über Farbwert ändern:
#                    ---------------------------------------
#                    my $gstrResult=$gobjDevice->setColor(x); # 1-20
#                    if (! defined($gstrResult)) { print "Befehl nicht erfolgreich! Fehler:\"".$gobjGateway->{"error"}."\"\n"; exit(1); }
#                    else { print "$gstrResult\n"; }
#                      > <datapoint deviceid='itfl65552' color='5' />
#
#                    Farbemperatur des Gerätes über ct-Wert ändern:
#                    ----------------------------------------------
#                    my $gstrResult=$gobjDevice->setCT(x); # 153-500
#                    if (! defined($gstrResult)) { print "Befehl nicht erfolgreich! Fehler:\"".$gobjGateway->{"error"}."\"\n"; exit(1); }
#                    else { print "$gstrResult\n"; }
#                      > <datapoint deviceid='itfl65552' ct='153' />
#
#                    Farbe des Gerätes über xyY-Wert ändern:
#                    ---------------------------------------
#                    my $gstrResult=$gobjDevice->setXYY(x); # 0-65535,0-65535,0-254
#                    if (! defined($gstrResult)) { print "Befehl nicht erfolgreich! Fehler:\"".$gobjGateway->{"error"}."\"\n"; exit(1); }
#                    else { print "$gstrResult\n"; }
#                      > <datapoint deviceid='itfl65552' xyY='9830,3932,133' />
#
#                    Farbe des Gerätes über HSV-Wert ändern:
#                    ---------------------------------------
#                    my $gstrResult=$gobjDevice->setHsv(x); # 0-65535,0-65279,0-254
#                    if (! defined($gstrResult)) { print "Befehl nicht erfolgreich! Fehler:\"".$gobjGateway->{"error"}."\"\n"; exit(1); }
#                    else { print "$gstrResult\n"; }
#                      > <datapoint deviceid='itfl65552' hsv='43690,65279,75' />
#
#
# Attribute        : Fehlertext              = $lobjSelf->{"error"}
#                    Gateway                 = $lobjSelf->{"gateway"} (Übergeordnetes Objekt)
#                    Gerätedaten JSON-String = $lobjSelf->{"devicedata"}
#
#                    Gerätedaten Gerätetyp unabhängig:
#                    Gerätetyp               = $lobjSelf->{"devicetype"} (Ikea Gerätebezeichnung)
#                    Name                    = $lobjSelf->{"name"}
#                    Anmeldedatum            = $lobjSelf->{"created"} (Unix Timestamp)
#                    Geräte-ID               = $lobjSelf->{"deviceid"}
#                    Onlinestatus            = $lobjSelf->{"online"} (0=offline, 1=online)
#                    Letzter kontakt         = $lobjSelf->{"lastseen"} (Unix Timestamp)
#                    Update Status           = $lobjSelf->{"updatestate"} (Bedeutung unbekannt)
#                    Zugriffstyp             = $lobjSelf->{"accessorytype"} (0=Fernbedienung, 1=Slave Fernbedienung, 2=Lampe, 3=Steckdose, 4=Bewegungsmelder, 6=Repeater, 7=Rollo)
#
#                    Geräteeigenschaften Gerätetyp unabhänig
#                    Hersteller              = $lobjSelf->{"manufactor"}
#                    Seriennummer            = $lobjSelf->{"serialno"} (immer leer)
#                    Firmwareversion         = $lobjSelf->{"version"}
#                    Stromquelle             = $lobjSelf->{"powersource"} (0=Unbekannt, 1=Netzteil, 2=Externe Batterie, 3=Batterie, 4=PowerOverEthernet, 5=USB, 6=AC_Power, 7=Solar)
#                    Batteriestand           = $lobjSelf->{"batterylevel"} (optional in %)
#
#                    Gerätestatus Lampen
#                    Power-Status            = $lobjSelf->{"status"} (0=off, 1=on)
#                    Helligkeit              = $lobjSelf->{"brightness"} (1 - 254)
#                    Farbton                 = $lobjSelf->{"hue"} (nur Zusammen mit Sättigung und Helligkeit, 0-65535)
#                    Sättigung               = $lobjSelf->{"saturation"} (nur Zusammen mit Farbton und Helligkeit, 0-65279)
#                    Farbe X                 = $lobjSelf->{"colorx"} (Nur zusammen mit Farbe Y, 0 to 65535 = CIE 1931)
#                    Farbe Y                 = $lobjSelf->{"colory"} (Nur zusammen mit Farbe X, 0 to 65535 = CIE 1931)
#                    Farbe in HEX            = $lobjSelf->{"colorhex"} (20 Fix-Farben)
#                    Subdevice-ID            = $lobjSelf->{"subdeviceid"} (Integer)
#
# Methoden         : Name ausgeben                        = $gobjDevice->name()
#                    Adresse ausgeben                     = $gobjDevice->deviceid()
#                    Typ ausgeben                         = $gobjDevice->devicetype()
#                    Version ausgeben                     = $gobjDevice->version()
#                    Erreichbarkeit ausgeben              = $gobjDevice->online()
#                    Power-Status ausgeben                = $gobjDevice->status()
#                    Helligkeit ausgeben                  = $gobjDevice->brightness()
#                    Farbemperatur ausgeben               = $gobjDevice->temperature()
#                    Farbe über Farbwert ausgeben         = $gobjDevice->color()
#                    Farbemperatur über ct-Wert ausgeben  = $gobjDevice->ct()
#                    Farbe über xyY-Wert ausgeben         = $gobjDevice->xyy()
#                    Farbe über HSV-Wert ausgeben         = $gobjDevice->hsv()
#                    Batteriestand ausgeben               = $gobjDevice->batterylevel()
#                    Gesamtstatus ausgeben                = $gobjDevice->devicestate()
#                    Geräteinformationen neu einlesen     = $gobjDevice->readDeviceInfo()
#                    Aus-/einschalten                     = $gobjDevice->setPower(<Status>)           -> <Status>     : 0=aus, 1=ein
#                    Helligkeit ändern                    = $gobjDevice->setBrightness(<Helligkeit>)  -> <Helligkeit> : 0-254=Helligkeit
#                    Farbemperatur ändern                 = $gobjDevice->setTemperature(<Temperatur>) -> <Temperatur> : 1-3=Temperatur
#                    Farbe über Farbwert ändern           = $gobjDevice->setColor(<Farbe>)            -> <Farbe>      : 1-20=Farbe
#                    Farbemperatur über ct-Wert ändern    = $gobjDevice->setCT(<Temperatur>)          -> <Temperatur> : 153-500=Temperatur
#                    Farbe über xyY-Wert ändern           = $gobjDevice->setXYY(<Farbe>)              -> <Farbe>      : 0-65535,0-65535,0-254=x,y,Y
#                    Farbe über HSV-Wert ändern           = $gobjDevice->setHSv(<Farbe>)              -> <Farbe>      : 0-65535,0-65279,0-254=H,S,V
#
# Farben           : 1             = "dcf0f8"
#                    2             = "eaf6fb"
#                    3             = "f5faf6" (coldwhite)
#                    4             = "f2eccf"
#                    5             = "f1e0b5" (normalwhite)
#                    6             = "efd275" (warmwhite)
#                    7             = "ebb63e"
#                    8             = "e78834"
#                    9             = "e57345"
#                    10             = "da5d41"
#                    11            = "dc4b31"
#                    12            = "e491af"
#                    13            = "e8bedd"
#                    14            = "d9337c"
#                    15            = "c984bb"
#                    16            = "8f2686"
#                    17            = "4a418a"
#                    18            = "6c83ba"
#                    19            = "a9d62b"
#                    20            = "d6e44b"
#
# Weißtöne         : 1 = "f5faf6" (coldwhite)
#                    2 = "f1e0b5" (normalwhite)
#                    3 = "efd275" (warmwhite)
#
# Gerätetypen      : "TRADFRI bulb E14 W op/ch 400lm"  = Lampe weiß fix, dimmbar
#                    "TRADFRI bulb E27 CWS opal 600lm" = Lampe farbe steuerbar, weiß steuerbar, dimmbar
#                    "TRADFRI bulb E14 CWS opal 600lm" = Lampe farbe steuerbar, weiß steuerbar, dimmbar
#                    "TRADFRI remote control"          = Fernbedinung rund 5 Tasten
#                    "TRADFRI on/off switch"           = Fernbedinung quadradisch 2 Tasten
#
# Zugriffstyp      : 0=Fernbedienung
#                    1=Slave Fernbedienung
#                    2=Lampe
#                    3=Steckdose
#                    4=Bewegungsmelder
#                    6=Repeater
#                    7=Rollo
#
# Stromquellen     : 0=Unbekannt
#                    1=Netzteil
#                    2=Externe Batterie
#                    3=Batterie
#                    4=PowerOverEthernet
#                    5=USB
#                    6=AC_Power
#                    7=Solar
#
# Präfixe Device-ID: itfb Rollos (b=blind)
#                    itfg Gruppen (g=group)
#                    itfl Leuchten (l=light)
#                    itfm Bewegungsmelder (m=motion)
#                    itfp Steckdosen (p=plug)
#                    itfr Fernbedienungen (r=Remote)
#                    itfs Szenen (s=scene)
#         
# Version          : 01.11.2019 v1.0.0 Initiale Version
#                    25.11.2019 v1.0.1 HSB-Farbsteuerung hinzugefügt
#                    16.12.2019 v2.0.0 HSB-Farbsteuerung entfernt, xyY-Farbsteuerung hinzugefügt
#                    19.12.2019 v3.0.0 Neue Version
#                    20.12.2019 v3.0.1 Namensangelichungen mit anderen Modulen
#                    08.01.2020 v3.0.2 Farbsteuerung über HSV
#                    13.01.2020 v3.0.3 Korrektur der Funktion ct und devicestate zur ansteuerung der Funktion _xy2ct
#                    05.02.2020 v3.0.4 Copyright und Warranty hinzugefügt
#
#
# Copyright & Warranty:
# =====================
#
# Copyright (C) 2019 Thomas Schütz-Schneider 
#
# This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. 
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 
#
# You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>. 
#
########################################################################################################################


# ========================
#  Package-Name
# ========================
package TSS::Ikea::Tradfri::Light;

# ========================
#  Definition der Pragmas
# ========================
use strict;
use warnings;
use JSON::Parse 'parse_json';
use TSS::Ikea::Tradfri::Common;

# ===============
#  Vererbung aus
# ===============
our @ISA = qw( TSS::Ikea::Tradfri::Common );

# ==================================
#  Definition der Versions-Variable
# ==================================
our $VERSION = "v3.0.4";

# ================================================
#  Überladung: Klassenattribute als Text ausgeben
# ================================================
use overload '""' => '_stringify';

########################################################################################################################
# Interne Variable
#-----------------------------------------------------------------------------------------------------------------------
my %ghshMapColorHex=(); # Tradfri-Farben
   $ghshMapColorHex{"0"}="";
   $ghshMapColorHex{"1"}="dcf0f8";
   $ghshMapColorHex{"2"}="eaf6fb";
   $ghshMapColorHex{"3"}="f5faf6";
   $ghshMapColorHex{"4"}="f2eccf";
   $ghshMapColorHex{"5"}="f1e0b5";
   $ghshMapColorHex{"6"}="efd275";
   $ghshMapColorHex{"7"}="ebb63e";
   $ghshMapColorHex{"8"}="e78834";
   $ghshMapColorHex{"9"}="e57345";
   $ghshMapColorHex{"10"}="da5d41";
   $ghshMapColorHex{"11"}="dc4b31";
   $ghshMapColorHex{"12"}="e491af";
   $ghshMapColorHex{"13"}="e8bedd";
   $ghshMapColorHex{"14"}="d9337c";
   $ghshMapColorHex{"15"}="c984bb";
   $ghshMapColorHex{"16"}="8f2686";
   $ghshMapColorHex{"17"}="4a418a";
   $ghshMapColorHex{"18"}="6c83ba";
   $ghshMapColorHex{"19"}="a9d62b";
   $ghshMapColorHex{"20"}="d6e44b";
   
my %ghshMapHexColor=(); # Tradfri-Farben
   $ghshMapHexColor{"dcf0f8"}="1";
   $ghshMapHexColor{"eaf6fb"}="2";
   $ghshMapHexColor{"f5faf6"}="3";
   $ghshMapHexColor{"f2eccf"}="4";
   $ghshMapHexColor{"f1e0b5"}="5";
   $ghshMapHexColor{"efd275"}="6";
   $ghshMapHexColor{"ebb63e"}="7";
   $ghshMapHexColor{"e78834"}="8";
   $ghshMapHexColor{"e57345"}="9";
   $ghshMapHexColor{"da5d41"}="10";
   $ghshMapHexColor{"dc4b31"}="11";
   $ghshMapHexColor{"e491af"}="12";
   $ghshMapHexColor{"e8bedd"}="13";
   $ghshMapHexColor{"d9337c"}="14";
   $ghshMapHexColor{"c984bb"}="15";
   $ghshMapHexColor{"8f2686"}="16";
   $ghshMapHexColor{"4a418a"}="17";
   $ghshMapHexColor{"6c83ba"}="18";
   $ghshMapHexColor{"a9d62b"}="19";
   $ghshMapHexColor{"d6e44b"}="20";
   
my %ghshMapWhiteHex=(); # Tradfri-Weißtöne
   $ghshMapWhiteHex{"0"}="";
   $ghshMapWhiteHex{"1"}="f5faf6"; # coldwhite
   $ghshMapWhiteHex{"2"}="f1e0b5"; # normalwhite
   $ghshMapWhiteHex{"3"}="efd275"; # warmwhite
   
my %ghshMapHexWhite=(); # Tradfri-Weißtöne
   $ghshMapHexWhite{"f5faf6"}="1"; # coldwhite
   $ghshMapHexWhite{"f1e0b5"}="2"; # normalwhite
   $ghshMapHexWhite{"efd275"}="3"; # warmwhite
########################################################################################################################


########################################################################################################################
# Gerätedaten aus JSON-String auswerten 
#-----------------------------------------------------------------------------------------------------------------------
# Aufruf  : $objSelf->_decodeDevicedata();
#
# Übergabe: -
#
# Rückgabe: -
#
#-----------------------------------------------------------------------------------------------------------------------
sub _decodeDevicedata {
  my $lobjSelf=shift;    # Klasse-Name abfangen
  my $lptrResult="";     # Zeiger auf ein Array, Hash oder Sclar eines dekodierten JSON-Strings
  my $lprtProperties=""; # Zeiger auf ein Array, Hash oder Sclar eines dekodierten JSON-Strings
  
  # JSON-String dekodieren
  $lptrResult=parse_json($lobjSelf->{'devicedata'});
  
  # Unerwaretetes Ergebnis?
  if (ref($lptrResult) ne "HASH") { $lobjSelf->{"error"}="_decodeDevicedata: Unerwartetes Ergebnisformat (".ref($lptrResult).") !"; return; }

  # Gerätedaten Gerätetyp unabhängig
  #---------------------------------
  # Name
  if (defined($lptrResult->{"9001"})) { $lobjSelf->{"name"}=$lptrResult->{"9001"}; } else { $lobjSelf->{"name"}=""; }
  # Anmeldedatum (Unix Timestamp)
  if (defined($lptrResult->{"9002"})) { $lobjSelf->{"created"}=$lptrResult->{"9002"}; } else { $lobjSelf->{"created"}=""; }
  # Geräte-ID-Lampen
  if (defined($lptrResult->{"9003"})) { $lobjSelf->{"deviceid"}="itfl".$lptrResult->{"9003"}; } else { $lobjSelf->{"deviceid"}=""; }
  # Onlinestatus (0=offline, 1=online)
  if (defined($lptrResult->{"9019"})) { $lobjSelf->{"online"}=$lptrResult->{"9019"}; } else { $lobjSelf->{"online"}=""; }
  # Letzter kontakt (Unix Timestamp)
  if (defined($lptrResult->{"9020"})) { $lobjSelf->{"lastseen"}=$lptrResult->{"9020"}; } else { $lobjSelf->{"lastseen"}=""; }
  # Update Status (Bedeutung unbekannt)
  if (defined($lptrResult->{"9054"})) { $lobjSelf->{"updatestate"}=$lptrResult->{"9054"}; } else { $lobjSelf->{"updatestate"}=""; }
  # Zugriffstyp (0=Fernbedienung, 1=Slave Fernbedienung, 2=Lampe, 3=Steckdose, 4=Bewegungsmelder, 6=Repeater, 7=Rollo)
  if (defined($lptrResult->{"5750"})) { $lobjSelf->{"accessorytype"}=$lptrResult->{"5750"}; } else { $lobjSelf->{"accessorytype"}=""; }
  
  # Geräteeigenschaften übernehmen
  $lprtProperties=$lptrResult->{"3"};
    
  # Unerwaretetes Ergebnis?
  if (ref($lprtProperties) ne "HASH") { $lobjSelf->{"error"}="_decodeDevicedata: Unerwartetes Ergebnisformat (".ref($lprtProperties).") !"; return; }

  # Geräteeigenschaften Gerätetyp unabhänig
  #----------------------------------------
  # Hersteller
  if (defined($lprtProperties->{"0"})) { $lobjSelf->{"manufactor"}=$lprtProperties->{"0"}; } else { $lobjSelf->{"manufactor"}=""; }
  # Gerätebezeichnung
  if (defined($lprtProperties->{"1"})) { $lobjSelf->{"devicetype"}=$lprtProperties->{"1"}; } else { $lobjSelf->{"devicetype"}=""; }
  # Seriennummer (immer leer)
  if (defined($lprtProperties->{"2"})) { $lobjSelf->{"serialno"}=$lprtProperties->{"2"}; } else { $lobjSelf->{"serialno"}=""; }
  # Firmwareversion
  if (defined($lprtProperties->{"3"})) { $lobjSelf->{"version"}=$lprtProperties->{"3"}; } else { $lobjSelf->{"version"}=""; }
  # Stromquelle (0=Unbekannt, 1=Netzteil, 2=Externe Batterie, 3=Batterie, 4=PowerOverEthernet, 5=USB, 6=AC_Power, 7=Solar)
  if (defined($lprtProperties->{"6"})) { $lobjSelf->{"powersource"}=$lprtProperties->{"6"}; } else { $lobjSelf->{"powersource"}=""; }
  # Batteriestand (optional in %)
  if (defined($lprtProperties->{"9"})) { $lobjSelf->{"batterylevel"}=$lprtProperties->{"9"}; }
  
  # Gerätestatus übernehmen
  $lprtProperties=$lptrResult->{"3311"}->[0];
    
  # Unerwaretetes Ergebnis?
  if (ref($lprtProperties) ne "HASH") { $lobjSelf->{"error"}="_decodeDevicedata: Unerwartetes Ergebnisformat (".ref($lprtProperties).") !"; return; }

  # Gerätestatus Lampen
  #--------------------
  # Power-Status (0=off, 1=on)
  if (defined($lprtProperties->{"5850"})) { $lobjSelf->{"status"}=$lprtProperties->{"5850"}; } else { $lobjSelf->{"status"}=0; }
  # Helligkeit (1 - 254)
  if (defined($lprtProperties->{"5851"})) { $lobjSelf->{"brightness"}=$lprtProperties->{"5851"}; } else { $lobjSelf->{"brightness"}=0; }
  # Farbton (nur Zusammen mit Sättigung und Helligkeit - wird nicht verwendet)
  if (defined($lprtProperties->{"5707"})) { $lobjSelf->{"hue"}=$lprtProperties->{"5707"}; }
  # Sättigung (nur Zusammen mit Farbton und Helligkeit - wird nicht verwendet)
  if (defined($lprtProperties->{"5708"})) { $lobjSelf->{"saturation"}=$lprtProperties->{"5708"}; }
  # Farbe X (Nur zusammen mit Farbe X, 0 to 65535 = CIE 1931)
  if (defined($lprtProperties->{"5709"})) { $lobjSelf->{"colorx"}=$lprtProperties->{"5709"}; }
  # Farbe Y (Nur zusammen mit Farbe Y, 0 to 65535 = CIE 1931)
  if (defined($lprtProperties->{"5710"})) { $lobjSelf->{"colory"}=$lprtProperties->{"5710"}; }
  # Farbe in HEX (20 Fix-Farben)
  if (defined($lprtProperties->{"5706"})) { $lobjSelf->{"colorhex"}=$lprtProperties->{"5706"}; }
  # Subdevice-ID (Integer)
  if (defined($lprtProperties->{"9003"})) { $lobjSelf->{"subdeviceid"}=$lprtProperties->{"9003"}; } else { $lobjSelf->{"subdeviceid"}=""; }

  # Erfolgreiche Rückmeldung
  return(0);
}
########################################################################################################################


########################################################################################################################
# Farbemperatur des Gerätes ausgeben
#-----------------------------------------------------------------------------------------------------------------------
# Aufruf  : $strResponse=$objDevice->temperature()
#
# Übergabe: -
#
# Rückgabe: $strResponse = Farbemperatur des Gerätes
#
#-----------------------------------------------------------------------------------------------------------------------
sub temperature {
  my $lobjSelf=shift;    # Klasse-Name abfangen
  my $lintTemperature=0; # Farbemperatur
  if (defined($lobjSelf->{"colorhex"})) {
    if (defined($ghshMapHexWhite{$lobjSelf->{"colorhex"}})) { $lintTemperature=$ghshMapHexWhite{$lobjSelf->{"colorhex"}}; }
  } else { $lintTemperature=-1; }
  return("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' temperature='".$lintTemperature."' />");
}
########################################################################################################################


########################################################################################################################
# Farbe über Farbwert des Gerätes ausgeben
#-----------------------------------------------------------------------------------------------------------------------
# Aufruf  : $strResponse=$objDevice->color()
#
# Übergabe: -
#
# Rückgabe: $strResponse = Farbe des Gerätes
#
#-----------------------------------------------------------------------------------------------------------------------
sub color {
  my $lobjSelf=shift; # Klasse-Name abfangen
  my $lintColor=0;    # Farbwert
  if (defined($lobjSelf->{"colorhex"})) {
    if (defined($ghshMapHexColor{$lobjSelf->{"colorhex"}})) { $lintColor=$ghshMapHexColor{$lobjSelf->{"colorhex"}}; }
  } else { $lintColor=-1; }
  return("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' color='".$lintColor."' />");
}
########################################################################################################################


########################################################################################################################
# Farbemperatur über ct-Wert des Gerätes ausgeben
#-----------------------------------------------------------------------------------------------------------------------
# Aufruf  : $strResponse=$objObject->ct()
#
# Übergabe: -
#
# Rückgabe: $strResponse = Farbemperatur des Gerätes
#
#-----------------------------------------------------------------------------------------------------------------------
sub ct {
  my $lobjSelf=shift;    # Klasse-Name abfangen
  # Kann am gerät eine Farbe eingestellt werden?
  if (defined($lobjSelf->{"colorx"})) {
    my $tstrValueXy=sprintf("%.4f,%.4f",($lobjSelf->{"colorx"}/65535),($lobjSelf->{"colory"}/65535));
    my $tstrValueCt=$lobjSelf->{"gateway"}->_xy2ct($tstrValueXy);
    return("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' ct='".$tstrValueCt."' />");
  }
  else { return("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' ct='-1' />"); }
}
########################################################################################################################


########################################################################################################################
# Farbe über xyY-Wert des Gerätes ausgeben
#-----------------------------------------------------------------------------------------------------------------------
# Aufruf  : $strResponse=$objDevice->xyy()
#
# Übergabe: -
#
# Rückgabe: $strResponse = Farbe des Gerätes
#
#-----------------------------------------------------------------------------------------------------------------------
sub xyy {
  my $lobjSelf=shift; # Klasse-Name abfangen
  my $lstrColorxyY=0; # xyY-Farbwert
  if (defined($lobjSelf->{"colorx"})) {
    $lstrColorxyY=$lobjSelf->{"colorx"}.",".$lobjSelf->{"colory"}.",".$lobjSelf->{"brightness"};
  } else { $lstrColorxyY="-1,-1,-1"; }
  return("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' xyY='".$lstrColorxyY."' />");
}
########################################################################################################################


########################################################################################################################
# Farbe über HSV-Wert des Gerätes ausgeben
#-----------------------------------------------------------------------------------------------------------------------
# Aufruf  : $strResponse=$objDevice->hsv()
#
# Übergabe: -
#
# Rückgabe: $strResponse = Farbe des Gerätes
#
#-----------------------------------------------------------------------------------------------------------------------
sub hsv {
  my $lobjSelf=shift; # Klasse-Name abfangen
  my $lstrColorxyY=0; # xyY-Farbwert
  if (defined($lobjSelf->{"colorx"})) {
    $lstrColorxyY=$lobjSelf->{"hue"}.",".$lobjSelf->{"saturation"}.",".$lobjSelf->{"brightness"};
  } else { $lstrColorxyY="-1,-1,-1"; }
  return("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' hsv='".$lstrColorxyY."' />");
}
########################################################################################################################


########################################################################################################################
# Gesamtstatus des Gerätes ausgeben
#-----------------------------------------------------------------------------------------------------------------------
# Aufruf  : $strResponse=$objDevice->devicestate()
#
# Übergabe: -
#
# Rückgabe: $strResponse = Gesamtstatus des Gerätes
#
#-----------------------------------------------------------------------------------------------------------------------
sub devicestate {
  my $lobjSelf=shift; # Klasse-Name abfangen
  my $lstrReturn="";  # Rückgabestring
  # Rückgabestring einleiten
  $lstrReturn="<datapoint deviceid='".$lobjSelf->{"deviceid"}."'";
  # Name des Gerätes
  $lstrReturn=$lstrReturn." name='".$lobjSelf->{"name"}."'";
  # Typ des Gerätes
  $lstrReturn=$lstrReturn." devicetype='".$lobjSelf->{"devicetype"}."'";
  # Erreichbarkeit des Gerätes
  $lstrReturn=$lstrReturn." online='".$lobjSelf->{"online"}."'";
  # Power-Status des Gerätes
   if (defined($lobjSelf->{"status"})) { $lstrReturn=$lstrReturn." status='".$lobjSelf->{"status"}."'"; }
  # Batteriestand des Gerätes
  if (defined($lobjSelf->{"batterylevel"})) { $lstrReturn=$lstrReturn." batterylevel='".$lobjSelf->{"batterylevel"}."'"; }
  # Helligkeit des Gerätes
  if (defined($lobjSelf->{"brightness"})) { $lstrReturn=$lstrReturn." brightness='".$lobjSelf->{"brightness"}."'"; }
  # Farbige Geräte
  if (defined($lobjSelf->{"colorhex"})) {
    # Farbtemperatur des Gerätes
	  my $tintTemperature=0;
	  if (defined($ghshMapHexWhite{$lobjSelf->{"colorhex"}})) { $tintTemperature=$ghshMapHexWhite{$lobjSelf->{"colorhex"}}; }
	  $lstrReturn=$lstrReturn." temperature='".$tintTemperature."'";
	  # Farbe über Farbwert des Gerätes
	  my $tintColor=0;
	  if (defined($ghshMapHexColor{$lobjSelf->{"colorhex"}})) { $tintColor=$ghshMapHexColor{$lobjSelf->{"colorhex"}}; }
	  $lstrReturn=$lstrReturn." color='".$tintColor."'";
  }
  # Farbige Geräte xyY
  if (defined($lobjSelf->{"colorx"})) {
    # Farbtemperatur
    my $tstrValueXy=sprintf("%.4f,%.4f",($lobjSelf->{"colorx"}/65535),($lobjSelf->{"colory"}/65535));
    my $tstrValueCt=$lobjSelf->{"gateway"}->_xy2ct($tstrValueXy);
    $lstrReturn=$lstrReturn." ct='".$tstrValueCt."'";
    # Farbe
    my $lstrColorxyY=""; # xyY-Farbwert
    $lstrColorxyY=$lobjSelf->{"colorx"}.",".$lobjSelf->{"colory"}.",".$lobjSelf->{"brightness"};
    $lstrReturn=$lstrReturn." xyY='".$lstrColorxyY."'";
  }  
  # Farbige Geräte HSV
  if (defined($lobjSelf->{"hue"})) {
    # Farbe
    my $lstrColorxyY=""; # xyY-Farbwert
    $lstrColorxyY=$lobjSelf->{"hue"}.",".$lobjSelf->{"saturation"}.",".$lobjSelf->{"brightness"};
    $lstrReturn=$lstrReturn." hsv='".$lstrColorxyY."'";
  }  
  # Rückgabestring abschließen
  $lstrReturn=$lstrReturn." />";
  return($lstrReturn);
}
########################################################################################################################


########################################################################################################################
# Farbtemperatur des Gerätes ändern
#-----------------------------------------------------------------------------------------------------------------------
# Aufruf  : $strResponse=$objDevice->setTemperature($intTemperature);
#
# Übergabe: $intTemperature = Neue Farbtemperatur (1-3)
#
# Rückgabe: $strResponse    = String=Erfolgreich, undef=Ein Fehler ist aufgetreten (Beschreibung in $objSelf->{"error"})
#
#-----------------------------------------------------------------------------------------------------------------------
sub setTemperature {
  my $lobjSelf=shift;        # Klasse-Name abfangen
  my $lintTemperature=shift; # Neue Farbtemperatur (1-3)
  my $lstrResponse="";       # Antwort des Tradfri Gateways
  my $lstrRealDeviceId="";   # Reale Geräte-ID-Lampen (ohne führendes itfl)
  my $lintResult=0;          # Ergebnisvariable
  
  # Kann an dem Gerät gar keine Farbtemeratur eingestellt werden?
  if (!defined($lobjSelf->{"colorhex"})) { return ("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' temperature='-1' />"); }
  
  # Ist das Gerät offline?
  if ($lobjSelf->{"online"} == 0) { return ("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' temperature='0' />"); }
  
  # Parameterprüfung
  if ($lintTemperature !~ /^[0-9]+$/) { $lintTemperature=2; }
  if ($lintTemperature < 1) { $lintTemperature=1; }
  if ($lintTemperature > 3) { $lintTemperature=3; }
  
  # Reale Geräte-ID-Lampen (ohne führendes itfl) erzeugen
  $lstrRealDeviceId=$lobjSelf->{"deviceid"};
  $lstrRealDeviceId=~s/^itfl//;
  
  # Kommunikation mit dem Tradfri Gateway -> Tradfri Gerät Farbe Hex ändern
  $lstrResponse=$lobjSelf->{"gateway"}->_requestGateway(1,"{ \"3311\": [{ \"5706\": \"".$ghshMapWhiteHex{$lintTemperature}."\" }] }","5684/15001/".$lstrRealDeviceId);

  # Ist ein Fehler aufgetreten?
  if (!defined($lstrResponse)) { return; }

  # Alle Geräteinformationen neu einlesen 
  $lintResult=$lobjSelf->readDeviceInfo();
  if (! defined($lintResult)) { return; }

  $lintTemperature=0;
  if (defined($lobjSelf->{"colorhex"})) {
    if (defined($ghshMapHexWhite{$lobjSelf->{"colorhex"}})) { $lintTemperature=$ghshMapHexWhite{$lobjSelf->{"colorhex"}}; }
  } else { $lintTemperature=-1; }

  # Erfolgreiche Rückmeldung
  return("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' temperature='".$lintTemperature."' />");
}
########################################################################################################################


########################################################################################################################
# Farbe des Gerätes über Farbwert ändern
#-----------------------------------------------------------------------------------------------------------------------
# Aufruf  : $strResponse=$objDevice->setColor($intColor);
#
# Übergabe: $intColor    = Neue Farbe (1-20)
#
# Rückgabe: $strResponse = String=Erfolgreich, undef=Ein Fehler ist aufgetreten (Beschreibung in $objSelf->{"error"})
#
#-----------------------------------------------------------------------------------------------------------------------
sub setColor {
  my $lobjSelf=shift;      # Klasse-Name abfangen
  my $lintColor=shift;     # Neue Farbe (1-20)
  my $lstrResponse="";     # Antwort des Tradfri Gateways
  my $lstrRealDeviceId=""; # Reale Geräte-ID-Lampen (ohne führendes itfl)
  my $lintResult=0;        # Ergebnisvariable
  
  # Kann an dem Gerät gar keine Farbe über Farbwert eingestellt werden?
  if (!defined($lobjSelf->{"colorhex"})) { return ("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' color='-1' />"); }
  
  # Ist das Gerät offline?
  if ($lobjSelf->{"online"} == 0) { return ("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' color='0' />"); }
  
  # Parameterprüfung
  if ($lintColor !~ /^[0-9]+$/) { $lintColor=1; }
  if ($lintColor < 1) { $lintColor=1; }
  if ($lintColor > 20) { $lintColor=20; }
  
  # Reale Geräte-ID-Lampen (ohne führendes itfl) erzeugen
  $lstrRealDeviceId=$lobjSelf->{"deviceid"};
  $lstrRealDeviceId=~s/^itfl//;
  
  # Kommunikation mit dem Tradfri Gateway -> Tradfri Gerät Farbe Hex ändern
  $lstrResponse=$lobjSelf->{"gateway"}->_requestGateway(1,"{ \"3311\": [{ \"5706\": \"".$ghshMapColorHex{$lintColor}."\" }] }","5684/15001/".$lstrRealDeviceId);

  # Ist ein Fehler aufgetreten?
  if (!defined($lstrResponse)) { return; }

  # Alle Geräteinformationen neu einlesen 
  $lintResult=$lobjSelf->readDeviceInfo();
  if (! defined($lintResult)) { return; }

  $lintColor=0;
  if (defined($lobjSelf->{"colorhex"})) {
    if (defined($ghshMapHexColor{$lobjSelf->{"colorhex"}})) { $lintColor=$ghshMapHexColor{$lobjSelf->{"colorhex"}}; }
  } else { $lintColor=-1; }

  # Erfolgreiche Rückmeldung
  return("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' color='".$lintColor."' />");
}
########################################################################################################################


########################################################################################################################
# Farbtemperatur des Gerätes über ct-Wert ändern
#-----------------------------------------------------------------------------------------------------------------------
# Aufruf  : $strResponse=$objDevice->setCT($intTemperature);
#
# Übergabe: $intTemperature = Neue Farbtemperatur (153 - 500)
#
# Rückgabe: $strResponse    = String=Erfolgreich, undef=Ein Fehler ist aufgetreten (Beschreibung in $objSelf->{"error"})
#
#-----------------------------------------------------------------------------------------------------------------------
sub setCT {
  my $lobjSelf=shift;        # Klasse-Name abfangen
  my $lintTemperature=shift; # Neue Farbtemperatur (153 - 500)
  my $lstrResponse="";       # Antwort des Tradfri Gateways
  my $lstrRealDeviceId="";   # Reale Geräte-ID-Lampen (ohne führendes itfl)
  my $lintResult=0;          # Ergebnisvariable
  
  # Kann an dem Gerät gar keine Farbe über xyY-Wert eingestellt werden?
  if (!defined($lobjSelf->{"colorx"})) { return ("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' xyY='-1,-1,-1' />"); }
  
  # Ist das Gerät offline?
  if ($lobjSelf->{"online"} == 0) { return ("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' xyY='0,0,0' />"); }
  
  # Parameterprüfung
  if ($lintTemperature !~ /^[0-9]+$/) { $lintTemperature=153; }
  if ($lintTemperature < 153) { $lintTemperature=153; }
  if ($lintTemperature > 500) { $lintTemperature=500; }
  
  # Reale Geräte-ID-Lampen (ohne führendes itfl) erzeugen
  $lstrRealDeviceId=$lobjSelf->{"deviceid"};
  $lstrRealDeviceId=~s/^itfl//;

  # xy-Wert der Farbtemperatur holen
  my $tstrValXyY=$lobjSelf->{"gateway"}->_ct2xy($lintTemperature);
  my ($tstrValX,$tstrValY)=split(/,/,$tstrValXyY);
  
  # Werteanpassung
  $tstrValX=int($tstrValX*65535);
  $tstrValY=int($tstrValY*65535);
  
  # Kommunikation mit dem Tradfri Gateway -> Tradfri Gerät Farbe Hex ändern
  $lstrResponse=$lobjSelf->{"gateway"}->_requestGateway(1,"{ \"3311\": [{ \"5709\": ".$tstrValX.", \"5710\": ".$tstrValY.", \"5851\":".$lobjSelf->{"brightness"}." }] }","5684/15001/".$lstrRealDeviceId);
                                                           
  # Ist ein Fehler aufgetreten?
  if (!defined($lstrResponse)) { return; }

  # Alle Geräteinformationen neu einlesen 
  $lintResult=$lobjSelf->readDeviceInfo();
  if (! defined($lintResult)) { return; }

  # Erfolgreiche Rückmeldung
  return("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' ct='".$lintTemperature."' />");
}
########################################################################################################################


########################################################################################################################
# Farbe des Gerätes über xyY-Wert ändern
#-----------------------------------------------------------------------------------------------------------------------
# Aufruf  : $strResponse=$objDevice->setXYY($strColor);
#
# Übergabe: $strColor    = Neue Farbe (0-65535,0-65535,0-254)
#
# Rückgabe: $strResponse = StringErfolgreich, undef=Ein Fehler ist aufgetreten (Beschreibung in $objSelf->{"error"})
#
#-----------------------------------------------------------------------------------------------------------------------
sub setXYY {
  my $lobjSelf=shift;      # Klasse-Name abfangen
  my $lstrColor=shift;     # Neue Farbe (0-65535,0-65535,0-254)
  my $lstrResponse="";     # Antwort des Tradfri Gateways
  my $lstrRealDeviceId=""; # Reale Geräte-ID-Lampen (ohne führendes itfl)
  my $lintResult=0;        # Ergebnisvariable
  
  # Kann an dem Gerät gar keine Farbe über xyY-Wert eingestellt werden?
  if (!defined($lobjSelf->{"colorx"})) { return ("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' xyY='-1,-1,-1' />"); }
  
  # Ist das Gerät offline?
  if ($lobjSelf->{"online"} == 0) { return ("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' xyY='0,0,0' />"); }
  
  # Parameterprüfung
  my ($tintX,$tintY,$tintBri)=split(/,/,$lstrColor,3);
  if ($tintX !~ /^[0-9]+$/) { $tintX=0; }
  if ($tintX < 0) { $tintX=0; }
  if ($tintX > 65535) { $tintX=65535; }
  if ($tintY !~ /^[0-9]+$/) { $tintY=0; }
  if ($tintY < 0) { $tintY=0; }
  if ($tintY > 65535) { $tintY=65535; }
  if ($tintBri !~ /^[0-9]+$/) { $tintBri=0; }
  if ($tintBri < 0) { $tintBri=0; }
  if ($tintBri > 254) { $tintBri=254; }
  
  # Reale Geräte-ID-Lampen (ohne führendes itfl) erzeugen
  $lstrRealDeviceId=$lobjSelf->{"deviceid"};
  $lstrRealDeviceId=~s/^itfl//;
  
  # Kommunikation mit dem Tradfri Gateway -> Tradfri Gerät Farbe Hex ändern
  $lstrResponse=$lobjSelf->{"gateway"}->_requestGateway(1,"{ \"3311\": [{ \"5709\": ".$tintX.", \"5710\": ".$tintY.", \"5851\":".$tintBri." }] }","5684/15001/".$lstrRealDeviceId);
                                                           
  # Ist ein Fehler aufgetreten?
  if (!defined($lstrResponse)) { return; }

  # Alle Geräteinformationen neu einlesen 
  $lintResult=$lobjSelf->readDeviceInfo();
  if (! defined($lintResult)) { return; }

  $lstrColor="";
  if (defined($lobjSelf->{"colorx"})) {
    $lstrColor=$lobjSelf->{"colorx"}.",".$lobjSelf->{"colory"}.",".$lobjSelf->{"brightness"}
  } else { $lstrColor="-1,-1,-1"; }

  # Erfolgreiche Rückmeldung
  return("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' xyY='".$lstrColor."' />");
}
########################################################################################################################


########################################################################################################################
# Farbe des Gerätes über HSV-Wert ändern
#-----------------------------------------------------------------------------------------------------------------------
# Aufruf  : $strResponse=$objDevice->setHsv($strColor);
#
# Übergabe: $strColor    = Neue Farbe (0-65535,0-65279,0-254)
#
# Rückgabe: $strResponse = StringErfolgreich, undef=Ein Fehler ist aufgetreten (Beschreibung in $objSelf->{"error"})
#
#-----------------------------------------------------------------------------------------------------------------------
sub setHsv {
  my $lobjSelf=shift;      # Klasse-Name abfangen
  my $lstrColor=shift;     # Neue Farbe (0-65535,0-65279,0-254)
  my $lstrResponse="";     # Antwort des Tradfri Gateways
  my $lstrRealDeviceId=""; # Reale Geräte-ID-Lampen (ohne führendes itfl)
  my $lintResult=0;        # Ergebnisvariable
  
  # Kann an dem Gerät gar keine Farbe über HSV-Wert eingestellt werden?
  if (!defined($lobjSelf->{"hue"})) { return ("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' hsv='-1,-1,-1' />"); }
  
  # Ist das Gerät offline?
  if ($lobjSelf->{"online"} == 0) { return ("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' hsv='0,0,0' />"); }
  
  # Parameterprüfung
  my ($tintH,$tintS,$tintBri)=split(/,/,$lstrColor,3);
  if ($tintH !~ /^[0-9]+$/) { $tintH=0; }
  if ($tintH < 0) { $tintH=0; }
  if ($tintH > 65535) { $tintH=65535; }
  if ($tintS !~ /^[0-9]+$/) { $tintS=0; }
  if ($tintS < 0) { $tintS=0; }
  if ($tintS > 65279) { $tintS=65279; }
  if ($tintBri !~ /^[0-9]+$/) { $tintBri=0; }
  if ($tintBri < 0) { $tintBri=0; }
  if ($tintBri > 254) { $tintBri=254; }
  
  # Reale Geräte-ID-Lampen (ohne führendes itfl) erzeugen
  $lstrRealDeviceId=$lobjSelf->{"deviceid"};
  $lstrRealDeviceId=~s/^itfl//;
  
  # Kommunikation mit dem Tradfri Gateway -> Tradfri Gerät Farbe Hex ändern
  $lstrResponse=$lobjSelf->{"gateway"}->_requestGateway(1,"{ \"3311\": [{ \"5707\": ".$tintH.", \"5708\": ".$tintS.", \"5851\":".$tintBri." }] }","5684/15001/".$lstrRealDeviceId);
                                                           
  # Ist ein Fehler aufgetreten?
  if (!defined($lstrResponse)) { return; }

  # Alle Geräteinformationen neu einlesen 
  $lintResult=$lobjSelf->readDeviceInfo();
  if (! defined($lintResult)) { return; }

  $lstrColor="";
  if (defined($lobjSelf->{"hue"})) {
    $lstrColor=$lobjSelf->{"hue"}.",".$lobjSelf->{"saturation"}.",".$lobjSelf->{"brightness"}
  } else { $lstrColor="-1,-1,-1"; }

  # Erfolgreiche Rückmeldung
  return("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' hsv='".$lstrColor."' />");
}
########################################################################################################################


########################################################################################################################
# Modul Aufräumen
#-----------------------------------------------------------------------------------------------------------------------
1;
########################################################################################################################
