########################################################################################################################
# Light.pm
#-----------------------------------------------------------------------------------------------------------------------
#
# Steuerung von Philips Hue Lampen und Steckdosen
#
# Alle zum Zeitpunkt bekannten Werte der Konfiguration wurden umgesetzt. Nicht alle davon sind aktiv, diese sind 
# mit "PREDEFINED" gekennzeichnet.
# Bei farbige Lampen, welche Bauart bedingt keine Einstellung der Farbtemperatur zulassen kann trozdem die
# Farbtemperatur eingestellt werden. Hierzu wurde ein Mapping der Temperaturangabe auf die xy-Farbskala integriert.
#
#
# Getestete Geräte:
# Philips LCA001 White and Color ambiance
# Ikea TRADFRI bulb E27 CWS opal 600lm (Color)
# Ikea TRADFRI bulb E14 CWS opal 600lm (Color)
# Osram CLA 60 RGBW
# Osram CLB 40 Tunable White
# Innr RB 250 C (RGBW)
# FLAIR VIYU-C35-470-CCT-10011722 (Tunable White)
# Ledvance Smart+ Outdoor Plug EU
#
#
# Aufruf           : use TSS::Philips::Hue::Light;
#                    my $gobjDevice = TSS::Philips::Hue::Light->new( gateway => <Gateway>, deviceid => <Geräte-ID>, devicedata => <Gerätedaten> );
#                    my $gobjDevice=$gobjGateway->getDeviceInfo("phl65544"); # phl65544=Geräte-ID-Lampen
#                    print $gobjDevice."\n";
#                      > <datapoint deviceid='phl1' name='Ikea Lampe' devicetype='TRADFRI bulb E27 CWS opal 600lm' online='0' status='0' brightness='131' ct='347' xyY='0.3358,0.3463,131' hsv='8418,140,254' />
#                      > <datapoint deviceid='phl2' name='Hue color lamp 1' devicetype='LCA001' online='1' status='0' brightness='131' ct='347' xyY='0.4452,0.4068,131' hsv='8418,140,254' />
#
#                    Version ausgeben:
#                    -----------------
#                    print "Version: ".$TSS::Philips::Hue::Light::VERSION."\n";
#                      > Version: v1.0.0
#
#                    Name des Gerätes ausgeben:
#                    --------------------------
#                    print $gobjDevice->name()."\n";
#                      > <datapoint deviceid='phl2' name='Hue color lamp 1' />
#
#                    Adresse des Gerätes ausgeben:
#                    -----------------------------
#                    print $gobjDevice->deviceid()."\n";
#                      > <datapoint deviceid='phl2' />
#
#                    Typ des Gerätes ausgeben:
#                    -------------------------
#                    print $gobjDevice->devicetype()."\n";
#                      > <datapoint deviceid='phl2' devicetype='LCA001' />
#
#                    Version des Gerätes ausgeben:
#                    -----------------------------
#                    print $gobjDevice->version()."\n";
#                      > <datapoint deviceid='phl2' version='1.53.3_r27175' />
#
#                    Erreichbarkeit des Gerätes ausgeben:
#                    ------------------------------------
#                    print $gobjDevice->online()."\n";
#                      > <datapoint deviceid='phl2' online='1' />
#
#                    Power-Status des Gerätes ausgeben:
#                    ----------------------------------
#                    print $gobjDevice->status()."\n";
#                      > <datapoint deviceid='phl2' status='0' />
#
#                    Helligkeit der Lampe ausgeben:
#                    ------------------------------
#                    print $gobjDevice->brightness()."\n";
#                      > <datapoint deviceid='phl2' brightness='131' />
#
#                    Farbemperatur der Lampe ausgeben:
#                    ---------------------------------
#                    print $gobjDevice->ct()."\n";
#                      > <datapoint deviceid='phl2' ct='347' />
#
#                    Farbe über xyY-Wert der Lampe ausgeben:
#                    ---------------------------------------
#                    print $gobjDevice->xyy()."\n";
#                      > <datapoint deviceid='phl2' xyY='0.4452,0.4068,131' />
#
#                    Farbe über HSV-Wert der Lampe ausgeben:
#                    ---------------------------------------
#                    print $gobjDevice->hsv()."\n";
#                      > <datapoint deviceid='phl2' hsv='8418,140,254' />
#
#                    Gesamtstatus des Gerätes ausgeben:
#                    ----------------------------------
#                    print $gobjDevice->devicestate()."\n";
#                      > <datapoint deviceid='phl2' name='Hue color lamp 1' devicetype='LCA001' online='1' status='0' brightness='131' ct='347' xyY='0.4452,0.4068,131' hsv='8418,140,254' />
#
#                    Alle Geräteinformationen neu einlesen:
#                    --------------------------------------
#                    my $gobjDevice=$gobjDevice->readDeviceInfo();
#                    if (! defined($gobjDevice)) { print "Befehl nicht erfolgreich! Fehler:\"".$gobjGateway->{"error"}."\"\n"; exit(1); }
#                    print $gobjDevice->devicestate()."\n";
#                      > <datapoint deviceid='phl2' name='Hue color lamp 1' devicetype='LCA001' online='1' status='0' brightness='131' ct='347' xyY='0.4452,0.4068,131' hsv='8418,140,254' />
#
#                    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='phl2' 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='phl2' brightness='131' />
#
#                    Farbemperatur der Lampe ä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='phl2' ct='347' />
#
#                    Farbe der Lampe über xyY-Wert ändern:
#                    -------------------------------------
#                    my $gstrResult=$gobjDevice->setXYY(x); # 0 - 1,0 - 1,0 - 254
#                    if (! defined($gstrResult)) { print "Befehl nicht erfolgreich! Fehler:\"".$gobjGateway->{"error"}."\"\n"; exit(1); }
#                    else { print "$gstrResult\n"; }
#                      > <datapoint deviceid='phl2' xyY='0.4452,0.4068,131' />
#
#                    Farbe der Lampe über HSV-Wert ändern:
#                    -------------------------------------
#                    my $gstrResult=$gobjDevice->setHsv(x); # 0 - 65535,0 - 254,0 - 254
#                    if (! defined($gstrResult)) { print "Befehl nicht erfolgreich! Fehler:\"".$gobjGateway->{"error"}."\"\n"; exit(1); }
#                    else { print "$gstrResult\n"; }
#                      > <datapoint deviceid='phl2' hsv='0,254,63' />
#
# Attribute        : Allgemein
#                      Fehlertext                = $lobjSelf->{"error"}
#                      Gateway                   = $lobjSelf->{"gateway"} (Übergeordnetes Objekt)
#                    Geräteinformationen:
#                      Geräte-ID                 = $lobjSelf->{"deviceid"}
#                      Gerätedaten JSON-String   = $lobjSelf->{"devicedata"}
#                      Gerätetyp                 = $lobjSelf->{"type"} (On/off light, Dimmable light, Color ct light, Color light, Extended Color light)
#                      Gerätename                = $lobjSelf->{"name"}
#                      Gerätebezeichnung         = $lobjSelf->{"devicetype"}
#                      Hersteller                = $lobjSelf->{"manufacturername"}
#                      Produktname               = $lobjSelf->{"productname"}
#                      Eindeutige ID             = $lobjSelf->{"uniqueid"}
#                      Softwareversion           = $lobjSelf->{"version"}
# PREDEFINED           Softwarekonfigurations ID = $lobjSelf->{"swconfigid"} (Optional)
# PREDEFINED           Produkt ID                = $lobjSelf->{"productid"} (Optional)
#                    Gerätestatus:
#                      Onlinestatus              = $lobjSelf->{"online"} (0=offline, 1=online)
#                      Power-Status              = $lobjSelf->{"status"} (0=off, 1=on)
#                      Helligkeit                = $lobjSelf->{"brightness"} (Optional, 0 - 254)
#                      Farbton                   = $lobjSelf->{"hue"} (Optional, 0 - 65535, nur Zusammen mit Sättigung und Helligkeit - wird nicht verwendet)
#                      Sättigung                 = $lobjSelf->{"saturation"} (Optional, 0 - 254, nur Zusammen mit Farbton und Helligkeit - wird nicht verwendet)
#                      Effekt                    = $lobjSelf->{"effect"} (Optional, none, colorloop)
#                      Alarm                     = $lobjSelf->{"alert"} (Optional, none, select, lselect)
#                      Modus                     = $lobjSelf->{"mode"} (Optional, homeautomation)
#                      Farbe X                   = $lobjSelf->{"colorx"} (Optional, 0 - 1, 4 Stellen hinter dem Komma, nur zusammen mit Farbe Y)
#                      Farbe Y                   = $lobjSelf->{"colory"} (Optional, 0 - 1, 4 Stellen hinter dem Komma,nur zusammen mit Farbe X)
#                      Farbtempeatur             = $lobjSelf->{"ct"} (Optional, 153 - 500 )
#                      Letzte Farbeinstellung    = $lobjSelf->{"colormode"} (Optional, hs, xy, ct)
# PREDEFINED         Softwareupdate:
# PREDEFINED           Sw Update Status          = $lobjSelf->{"swupdatestate"} (unknown, noupdates, transferring, anyreadytoinstall, allreadytoinstall, installing)
# PREDEFINED           Sw letztes Update         = $lobjSelf->{"swupdatelast"}
# PREDEFINED         Gerätekonfiguration:
# PREDEFINED           Geräteart                 = $lobjSelf->{"cfgarchetype"}
# PREDEFINED           Einsatzart                = $lobjSelf->{"cfgfunction"} (functional, decorative, mixed, unknownfunction)
# PREDEFINED           Abstrahlung               = $lobjSelf->{"cfgdirection"} (omnidirectional, upwards, downwards, horizontal, vertical, unknowndirection)
# PREDEFINED           Einschaltverhalten        = $lobjSelf->{"cfgstartupmode"} (Optional, safety, powerfail, lastonstate, custom, unknown)
# PREDEFINED           Konfiguration aktiv       = $lobjSelf->{"cfgstartupconfigured"} (Optional, 0=nicht aktiv, 1=aktiv)
# PREDEFINED         Geräteeigenschaften:
# PREDEFINED           Zertifiziertes Hue Gerät  = $lobjSelf->{"cabcertified"} (0=nicht zertifiziert, 1=zertifiziert)
# PREDEFINED           Streaming-Renderer        = $lobjSelf->{"cabstreamrenderer"} (0=kein Renderer, 1=Renderer)
# PREDEFINED           Streaming-Proxy           = $lobjSelf->{"cabstreamproxy"} (0=kein Proxy, 1=Proxy)
# PREDEFINED           Farbskala                 = $lobjSelf->{"cabcolorgamuttype"} (A,B,C, other)
# PREDEFINED           Minimaler Dimm-Level      = $lobjSelf->{"cabmindimlevel"} (Optional)
# PREDEFINED           Maximale Lumen            = $lobjSelf->{"cabmaxlumen"} (Optional)
# PREDEFINED           Farbskala rot             = $lobjSelf->{"cabcolorgamutr"} (Optional, 0-1 vier Stellen hinter Komma)
# PREDEFINED           Farbskala grün            = $lobjSelf->{"cabcolorgamutg"} (Optional, 0-1 vier Stellen hinter Komma)
# PREDEFINED           Farbskala blau            = $lobjSelf->{"cabcolorgamutb"} (Optional, 0-1 vier Stellen hinter Komma)
# PREDEFINED           Farbtemperatur min        = $lobjSelf->{"cabctmin"} (Optional, 153 - 500)
# PREDEFINED           Farbtemperatur max        = $lobjSelf->{"cabctmin"} (Optional, 153 - 500)
#
# 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 über ct-Wert ausgeben  = $gobjDevice->ct()
#                    Farbe über xyY-Wert ausgeben         = $gobjDevice->xyy()
#                    Farbe über HSV-Wert ausgeben         = $gobjGroup->hsv()
#                    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 über ct-Wert ändern    = $gobjDevice->setCT(<Temperatur>)          -> <Temperatur> : 153-500=Temperatur
#                    Farbe über xyY-Wert ändern           = $gobjDevice->setXYY(<Farbe>)              -> <Farbe>      : 0-1,0-1,0-254=x,y,Y
#                    Farbe über HSV-Wert ändern           = $gobjDevice->setHsv(<Farbe>)              -> <Farbe>      : 0-65535,0-254,0-254=H,S,V
#
# Präfixe Device-ID: phl Leuchten   (l=light)
#                    php Steckdosen (p=Plug)
#                    phg Gruppen    (g=group)
#
# Version          : 17.12.2019 v1.0.0 Initiale Version
#                    20.12.2019 v1.0.1 Namensangelichungen mit anderen Modulen
#                    07.01.2020 v1.0.2 Erweiterung um Steckdosen
#                    04.02.2020 v1.0.3 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::Philips::Hue::Light;

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

# ===============
#  Vererbung aus
# ===============
our @ISA = qw( TSS::Philips::Hue::Common );

# ==================================
#  Definition der Versions-Variable
# ==================================
our $VERSION = "v1.0.3";

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

########################################################################################################################
# Interne Variable
#-----------------------------------------------------------------------------------------------------------------------
########################################################################################################################


########################################################################################################################
# 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
  
  # Json-String dekodieren
  $lptrResult=parse_json($lobjSelf->{'devicedata'});
  
  # Unerwaretetes Ergebnis?
  if (ref($lptrResult) ne "HASH") { $lobjSelf->{"error"}="_decodeDevicedata: Unerwartetes Ergebnisformat (".ref($lptrResult).") !"; return; }

  # Geräteinformationen
  # Gerätetyp (On/off light, Dimmable light, Color ct light, Color light, Extended Color light)
  if (defined($lptrResult->{"type"})) { $lobjSelf->{"type"}=$lptrResult->{"type"}; } else { $lobjSelf->{"type"}=""; }
  # Gerätename
  if (defined($lptrResult->{"name"})) { $lobjSelf->{"name"}=$lptrResult->{"name"}; } else { $lobjSelf->{"name"}=""; }
  # Gerätebezeichnung
  if (defined($lptrResult->{"modelid"})) { $lobjSelf->{"devicetype"}=$lptrResult->{"modelid"}; } else { $lobjSelf->{"devicetype"}=""; }
  # Hersteller
  if (defined($lptrResult->{"manufacturername"})) { $lobjSelf->{"manufacturername"}=$lptrResult->{"manufacturername"}; } else { $lobjSelf->{"manufacturername"}=""; }
  # Produktname
  if (defined($lptrResult->{"productname"})) { $lobjSelf->{"productname"}=$lptrResult->{"productname"}; } else { $lobjSelf->{"productname"}=""; }
  # Eindeutige ID
  if (defined($lptrResult->{"uniqueid"})) { $lobjSelf->{"uniqueid"}=$lptrResult->{"uniqueid"}; } else { $lobjSelf->{"uniqueid"}=""; }
  # Softwareversion
  if (defined($lptrResult->{"swversion"})) { $lobjSelf->{"version"}=$lptrResult->{"swversion"}; } else { $lobjSelf->{"version"}=""; }
#PREDEFINED  # Softwarekonfigurations ID (Optional)
#PREDEFINED  if (defined($lptrResult->{"swconfigid"})) { $lobjSelf->{"swconfigid"}=$lptrResult->{"swconfigid"}; }
#PREDEFINED  # Produkt ID (Optional)
#PREDEFINED  if (defined($lptrResult->{"productid"})) { $lobjSelf->{"productid"}=$lptrResult->{"productid"}; }

  # Gerätestatus
  # Onlinestatus (0=offline, 1=online)
  if (defined($lptrResult->{"state"}{"reachable"})) {
    if ($lptrResult->{"state"}{"reachable"} == 1) { $lobjSelf->{"online"}=1; }
    else  { $lobjSelf->{"online"}=0; }
  }
  else { $lobjSelf->{"online"}=0; }
  # Power-Status (0=off, 1=on)
  if (defined($lptrResult->{"state"}{"on"})) {
    if ($lptrResult->{"state"}{"on"} == 1) { $lobjSelf->{"status"}=1; }
    else  { $lobjSelf->{"status"}=0; }
  }
  else { $lobjSelf->{"status"}=0; }
  # Helligkeit (Optional, 0 - 254)
  if (defined($lptrResult->{"state"}{"bri"})) { $lobjSelf->{"brightness"}=$lptrResult->{"state"}{"bri"}; }
  # Farbton (Optional, 0 - 65535, nur Zusammen mit Sättigung und Helligkeit - wird nicht verwendet)
  if (defined($lptrResult->{"state"}{"hue"})) { $lobjSelf->{"hue"}=$lptrResult->{"state"}{"hue"}; }
  # Sättigung (Optional, 0 - 254, nur Zusammen mit Farbton und Helligkeit - wird nicht verwendet)
  if (defined($lptrResult->{"state"}{"sat"})) { $lobjSelf->{"saturation"}=$lptrResult->{"state"}{"sat"}; }
  # Effekt (Optional, none, colorloop)
  if (defined($lptrResult->{"state"}{"effect"})) { $lobjSelf->{"effect"}=$lptrResult->{"state"}{"effect"}; }
  # Alarm (Optional, none, select, lselect)
  if (defined($lptrResult->{"state"}{"alert"})) { $lobjSelf->{"alert"}=$lptrResult->{"state"}{"alert"}; }
  # Modus (Optional, homeautomation)
  if (defined($lptrResult->{"state"}{"mode"})) { $lobjSelf->{"mode"}=$lptrResult->{"state"}{"mode"}; }
  # Farbe X (0 - 1, 4 Stellen hinter dem Komma, nur zusammen mit Farbe Y)
  if (defined($lptrResult->{"state"}{"xy"}[0])) { $lobjSelf->{"colorx"}=$lptrResult->{"state"}{"xy"}[0]; }
  # Farbe Y (0 - 1, 4 Stellen hinter dem Komma,nur zusammen mit Farbe X)
  if (defined($lptrResult->{"state"}{"xy"}[1])) { $lobjSelf->{"colory"}=$lptrResult->{"state"}{"xy"}[1]; }
  # Farbtempeatur (153 - 500 )
  if (defined($lptrResult->{"state"}{"ct"})) { $lobjSelf->{"ct"}=$lptrResult->{"state"}{"ct"}; }
  # Letzte Farbeinstellung (Optional, hs, xy, ct)
  if (defined($lptrResult->{"state"}{"colormode"})) { $lobjSelf->{"colormode"}=$lptrResult->{"state"}{"colormode"}; }

#PREDEFINED  # Softwareupdate
#PREDEFINED  # Sw Update Status (unknown, noupdates, transferring, anyreadytoinstall, allreadytoinstall, installing)
#PREDEFINED  if (defined($lptrResult->{"swupdate"}{"state"}))  { $lobjSelf->{"swupdatestate"}=$lptrResult->{"swupdate"}{"state"}; } else { $lobjSelf->{"swupdatestate"}=""; }
#PREDEFINED  # Sw letztes Update
#PREDEFINED  if (defined($lptrResult->{"swupdate"}{"lastinstall"}))  { $lobjSelf->{"swupdatelast"}=$lptrResult->{"swupdate"}{"lastinstall"}; } else { $lobjSelf->{"swupdatelast"}=""; }

#PREDEFINED  # Gerätekonfiguration
#PREDEFINED  # Geräteart
#PREDEFINED  if (defined($lptrResult->{"config"}{"archetype"}))  { $lobjSelf->{"cfgarchetype"}=$lptrResult->{"config"}{"archetype"}; } else { $lobjSelf->{"cfgarchetype"}=""; }
#PREDEFINED  # Einsatzart (functional, decorative, mixed, unknownfunction)
#PREDEFINED  if (defined($lptrResult->{"config"}{"function"}))  { $lobjSelf->{"cfgfunction"}=$lptrResult->{"config"}{"function"}; } else { $lobjSelf->{"cfgfunction"}=""; }
#PREDEFINED  # Abstrahlung (omnidirectional, upwards, downwards, horizontal, vertical, unknowndirection)
#PREDEFINED  if (defined($lptrResult->{"config"}{"direction"}))  { $lobjSelf->{"cfgdirection"}=$lptrResult->{"config"}{"direction"}; } else { $lobjSelf->{"cfgdirection"}=""; }
#PREDEFINED  # Einschaltverhalten (afety, powerfail, lastonstate, custom, unknown)
#PREDEFINED  if (defined($lptrResult->{"config"}{"startup"}{"mode"}))  { $lobjSelf->{"cfgstartupmode"}=$lptrResult->{"config"}{"startup"}{"mode"}; }
#PREDEFINED  # Konfiguration aktiv (Optional, 0=nicht aktiv, 1=aktiv)
#PREDEFINED  if (defined($lptrResult->{"config"}{"startup"}{"configured"})) {
#PREDEFINED    if ($lptrResult->{"config"}{"startup"}{"configured"} == 1) { $lobjSelf->{"cfgstartupconfigured"}=1; }
#PREDEFINED    else  { $lobjSelf->{"cfgstartupconfigured"}=0; }
#PREDEFINED  }

#PREDEFINED  # Geräteeigenschaften
#PREDEFINED  # Zertifiziertes Hue Gerät (0=nicht zertifiziert, 1=zertifiziert)
#PREDEFINED  if (defined($lptrResult->{"capabilities"}{"certified"})) {
#PREDEFINED    if ($lptrResult->{"capabilities"}{"certified"} == 1) { $lobjSelf->{"cabcertified"}=1; }
#PREDEFINED    else  { $lobjSelf->{"cabcertified"}=0; }
#PREDEFINED  }
#PREDEFINED  else { $lobjSelf->{"cabcertified"}=0; }
#PREDEFINED  # Streaming-Renderer (0=kein Renderer, 1=Renderer)
#PREDEFINED  if (defined($lptrResult->{"capabilities"}{"streaming"}{"renderer"})) {
#PREDEFINED    if ($lptrResult->{"capabilities"}{"streaming"}{"renderer"} == 1) { $lobjSelf->{"cabstreamrenderer"}=1; }
#PREDEFINED    else  { $lobjSelf->{"cabstreamrenderer"}=0; }
#PREDEFINED  }
#PREDEFINED  else  { $lobjSelf->{"cabstreamrenderer"}=0; }
#PREDEFINED  # Streaming-Proxy (0=kein Proxy, 1=Proxy)
#PREDEFINED  if (defined($lptrResult->{"capabilities"}{"streaming"}{"proxy"})) {
#PREDEFINED    if ($lptrResult->{"capabilities"}{"streaming"}{"proxy"} == 1) { $lobjSelf->{"cabstreamproxy"}=1; }
#PREDEFINED    else  { $lobjSelf->{"cabstreamproxy"}=0; }
#PREDEFINED  }
#PREDEFINED  else  { $lobjSelf->{"cabstreamproxy"}=0; }
#PREDEFINED  # Farbskala (A,B,C, other)
#PREDEFINED  if (defined($lptrResult->{"capabilities"}{"control"}{"colorgamuttype"}))  { $lobjSelf->{"cabcolorgamuttype"}=$lptrResult->{"capabilities"}{"control"}{"colorgamuttype"}; } else { $lobjSelf->{"cabcolorgamuttype"}=""; }
#PREDEFINED  # Minimaler Dimm-Level (Optional)
#PREDEFINED  if (defined($lptrResult->{"capabilities"}{"control"}{"mindimlevel"})) { $lobjSelf->{"cabmindimlevel"}=$lptrResult->{"capabilities"}{"control"}{"mindimlevel"}; }
#PREDEFINED  # Maximale Lumen (Optional)
#PREDEFINED  if (defined($lptrResult->{"capabilities"}{"control"}{"maxlumen"})) { $lobjSelf->{"cabmaxlumen"}=$lptrResult->{"capabilities"}{"control"}{"maxlumen"}; }
#PREDEFINED  # Farbskala rot, grün, blau (Optional, 0-1 vier Stellen hinter Komma)
#PREDEFINED  if (defined($lptrResult->{"capabilities"}{"control"}{"colorgamut"})) {
#PREDEFINED    $lobjSelf->{"cabcolorgamutr"}=$lptrResult->{"capabilities"}{"control"}{"colorgamut"}[0][0].",".$lptrResult->{"capabilities"}{"control"}{"colorgamut"}[0][1];
#PREDEFINED    $lobjSelf->{"cabcolorgamutg"}=$lptrResult->{"capabilities"}{"control"}{"colorgamut"}[1][0].",".$lptrResult->{"capabilities"}{"control"}{"colorgamut"}[1][1];
#PREDEFINED    $lobjSelf->{"cabcolorgamutb"}=$lptrResult->{"capabilities"}{"control"}{"colorgamut"}[2][0].",".$lptrResult->{"capabilities"}{"control"}{"colorgamut"}[2][1];
#PREDEFINED  }
#PREDEFINED#PREDEFINED  # Farbtemperatur min/max (Optional, 153 - 500)
#PREDEFINED  if (defined($lptrResult->{"capabilities"}{"control"}{"ct"}{"min"})) { $lobjSelf->{"cabctmin"}=$lptrResult->{"capabilities"}{"control"}{"ct"}{"min"}; }
#PREDEFINED  if (defined($lptrResult->{"capabilities"}{"control"}{"ct"}{"min"})) { $lobjSelf->{"cabctmin"}=$lptrResult->{"capabilities"}{"control"}{"ct"}{"min"}; }
  
  # Erfolgreiche Rückmeldung
  return(0);
}
########################################################################################################################


########################################################################################################################
# Firmware-Version des Gerätes ausgeben
#-----------------------------------------------------------------------------------------------------------------------
# Aufruf  : $strResponse=$objDevice->version()
#
# Übergabe: -
#
# Rückgabe: $strResponse = Firmware-Version des Gerätes
#
#-----------------------------------------------------------------------------------------------------------------------
sub version {
  my $lobjSelf=shift; # Klasse-Name abfangen
  return("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' version='".$lobjSelf->{"version"}."' />");
}
########################################################################################################################


########################################################################################################################
# Online-Status des Gerätes ausgeben
#-----------------------------------------------------------------------------------------------------------------------
# Aufruf  : $strResponse=$objDevice->online()
#
# Übergabe: -
#
# Rückgabe: $strResponse = Online-Status des Gerätes
#
#-----------------------------------------------------------------------------------------------------------------------
sub online {
  my $lobjSelf=shift; # Klasse-Name abfangen
  return("<datapoint deviceid='".$lobjSelf->{"deviceid"}."' online='".$lobjSelf->{"online"}."' />");
}
########################################################################################################################


########################################################################################################################
# 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"}."'"; }
  # Helligkeit des Gerätes
  if (defined($lobjSelf->{"brightness"})) { $lstrReturn=$lstrReturn." brightness='".$lobjSelf->{"brightness"}."'"; }
  # Farbtemperatur des Gerätes
  if (defined($lobjSelf->{"ct"})) { $lstrReturn=$lstrReturn." ct='".$lobjSelf->{"ct"}."'"; }
  elsif (defined($lobjSelf->{"colorx"})) {
    my $tstrValueXy=$lobjSelf->{"colorx"}.",".$lobjSelf->{"colory"};
    my $tstrValueCt=$lobjSelf->{"gateway"}->_xy2ct($tstrValueXy);
    $lstrReturn=$lstrReturn." ct='".$tstrValueCt."'";
  }
  # Farbige Geräte xyY
  if (defined($lobjSelf->{"colorx"})) {
    my $lstrColorxyY=""; # xyY-Farbwert
    $lstrColorxyY=$lobjSelf->{"colorx"}.",".$lobjSelf->{"colory"}.",".$lobjSelf->{"brightness"};
    $lstrReturn=$lstrReturn." xyY='".$lstrColorxyY."'";
  }  
  # Farbige Geräte HSV
  if (defined($lobjSelf->{"colorx"})) {
    my $lstrColorHsv=""; # xyY-Farbwert
    $lstrColorHsv=$lobjSelf->{"hue"}.",".$lobjSelf->{"saturation"}.",".$lobjSelf->{"brightness"};
    $lstrReturn=$lstrReturn." hsv='".$lstrColorHsv."'";
  }  
  # Rückgabestring abschließen
  $lstrReturn=$lstrReturn." />";
  return($lstrReturn);
}
########################################################################################################################


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