Alexa / Controlicz

Forum dédié aux questions concernant la configuration de votre serveur sous Linux
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: Alexa / Controlicz

Message par rimram31 »

Jeff a écrit :C'est bon :) ...
Génial!

Mais j'en ai profité ce matin pour nettoyer et ajouter quelques logs (mode debug) pour aider "au cas". Si vous mettez a jour la lambda, vous verrez un parametre "debug" dans la conf, si a true, c'est verbeux (trace de tous les appels entre autre) mais ça pourrait aider (note: la modif debug true peut se faire directement dans la console si on veut faire un test "ponctuel").

Pour la doc, j'attends le retour de mulot35 avant de la pousser sous git.

Edit: Pour les plus motivés qui veulent se lancer dans le dev de skills, on peut faire pas mal de choses directement en ligne de commande via la commande en ligne aws -> https://developer.amazon.com/fr/blogs/p ... -Interface. Dans le principe on créé un user (qui a le droit de modifier les lambdas) via IAM, on installe aws cli sur son poste (demande python+boto) + configuration avec le user IAM créé et ensuite on peut se passer de la console pour les commandes.
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
ledouble33
Messages : 286
Inscription : 07 févr. 2015, 07:45

Re: Alexa / Controlicz

Message par ledouble33 »

super tuto merci
j ai une erreur , j ai loupé quelque chose?

Capture6666.PNG
Capture6666.PNG (44.74 Kio) Consulté 6152 fois
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: Alexa / Controlicz

Message par rimram31 »

ledouble33 a écrit :...j ai une erreur , j ai loupé quelque chose?
Peut etre la partie ou je met Attention en gras ici http://easydomoticz.com/forum/viewtopic ... =60#p58171 'Web settings' ?
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
ledouble33
Messages : 286
Inscription : 07 févr. 2015, 07:45

Re: Alexa / Controlicz

Message par ledouble33 »

rimram31 a écrit :
ledouble33 a écrit :...j ai une erreur , j ai loupé quelque chose?
Peut etre la partie ou je met Attention en gras ici http://easydomoticz.com/forum/viewtopic ... =60#p58171 'Web settings' ?
non je l ai fais
Pièces jointes
Capture666666.PNG
Capture666666.PNG (11.2 Kio) Consulté 6146 fois
Damsee
Messages : 87
Inscription : 26 déc. 2016, 22:21

Re: Alexa / Controlicz

Message par Damsee »

Hello,

Un peu de test ce matin... et c'est KO. Alexa ne découvre aucun device alors j'ai testé directement depuis AWS dont voici le résultat :

Code : Tout sélectionner

START RequestId: 31625c2a-aea0-11e8-b08f-4ddd05261815 Version: $LATEST
Traceback (most recent call last):
  File "/var/task/AlexaSmartHome.py", line 315, in invoke
    return operator.attrgetter(name)(self)(request)
  File "/var/task/AlexaSmartHome.py", line 326, in Discover
    endpoints = self.handler.getEndpoints()
  File "/var/task/DomoticzHandler.py", line 227, in getEndpoints
    response = self.api('type=devices&used=true')
  File "/var/task/DomoticzHandler.py", line 205, in api
    payload = urlopen(Request(url, None, headers)).read()
  File "/var/lang/lib/python3.6/urllib/request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "/var/lang/lib/python3.6/urllib/request.py", line 532, in open
    response = meth(req, response)
  File "/var/lang/lib/python3.6/urllib/request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "/var/lang/lib/python3.6/urllib/request.py", line 570, in error
    return self._call_chain(*args)
  File "/var/lang/lib/python3.6/urllib/request.py", line 504, in _call_chain
    result = func(*args)
  File "/var/lang/lib/python3.6/urllib/request.py", line 650, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found
END RequestId: 31625c2a-aea0-11e8-b08f-4ddd05261815
REPORT RequestId: 31625c2a-aea0-11e8-b08f-4ddd05261815	Duration: 419.30 ms	Billed Duration: 500 ms 	Memory Size: 128 MB	Max Memory Used: 25 MB
@RR31, tu n'as pas changé qchse en ajoutant le debug ? (je n'avais pas testé la version précédente sans debug)
Merci pour tes lumières.

PS : En regardant le code, il y a une erreur avec la gestion des volets roulants... tu fais référence à RFI dans DomoticzHandler.py alors qu'il faut mettre RFY. Je pourrai faire le test puisque j'ai des volets en RFY justement.
Damsee
Messages : 87
Inscription : 26 déc. 2016, 22:21

Re: Alexa / Controlicz

Message par Damsee »

Re,

Grâce à Jeff, j'ai trouvé l'erreur, j'avais aussi un / dans mon URL comme j'ai pris l'exemple du template :

Code : Tout sélectionner

{
    "url": "https://zzzz.ddns.net:51243/",
    "username": "xxxx",
    "password": "yyyy",
    "debug": false
}
Du coup, le skill fonctionne :D

RR31 :
- Il faudrait faire un test si l'URL comprend un "/" à la fin et le supprimer... à défaut, modifier le template pour qu"il soit correct.
- Je confirme que la découverte des volets RFY ne fonctionne pas ^^
Damsee
Messages : 87
Inscription : 26 déc. 2016, 22:21

Re: Alexa / Controlicz

Message par Damsee »

Correction du code et mes volets RFY fonctionnent :

Code : Tout sélectionner

import json, urllib, ssl, base64
from urllib.request import urlopen, Request
import re
from AlexaSmartHome import *

import math, colorsys
import logging

ENDPOINT_ADAPTERS = Registry()

_LOGGER = logging.getLogger(__name__)

class DomoticzEndpoint(AlexaEndpoint):

    _device_ = None
    def getDevice(self):
        if self._device_ is None:
            self._device_ = self.handler.getDevice(self._endpointId)
        return self._device_

    def setHandler(self, handler):
        self.handler = handler
    
    def getProperty(self, name):
        #device = self.handler.getDevice(self._endpointId)
        device = self.getDevice()
        if   name == 'powerState':
            if device['Status'] == 'On':
                return 'ON'
            else:
                return 'OFF'
        elif name == 'lockState':
            if device['Status'] == 'On':
                return 'LOCKED'
            else:
                return 'UNLOCKED'
            return 'JAMMED'
        elif name == 'brightness':
            level = device['Level']
            maxLevel = device['MaxDimLevel']
            return int((float(level) * 100) / float(maxLevel))
            #return round(self.entity.attributes['brightness'] / 255.0 * 100)
        elif name == 'percentage':
            level = device['Level']
            maxLevel = device['MaxDimLevel']
            return int((float(level) * 100) / float(maxLevel))
        elif name == 'temperature':
            if isinstance(self, ThermostatAlexaEndpoint):
                temp = device['SetPoint']
            else:
                temp = device['Temp']
            return {
                'value': float(temp),
                'scale': 'CELSIUS',
            }
        elif name == 'targetSetpoint':
            setPoint = device['SetPoint']
            return {
                'value': float(setPoint),
                'scale': 'CELSIUS',
            }
        elif name == 'thermostatMode':
            if isinstance(self, SelectorThermostatAlexaEndpoint):
                ilevel = int(device['Level']/device['LevelInt'])
                levels = device['LevelNames'].split("|")
                mode = levels[ilevel].upper()
                return mode

        return None

class OnOffAlexaEndpoint(DomoticzEndpoint):

    def __init__(self, endpointId, friendlyName="", description="", manufacturerName=""):
        super().__init__(endpointId, friendlyName, description, manufacturerName)
        self.addCapability(AlexaPowerController(self, 'Alexa.PowerController',[{'name': 'powerState'}]))

    def turnOn(self):
        self.handler.setSwitch(self._endpointId, 'On')

    def turnOff(self):
        self.handler.setSwitch(self._endpointId, 'Off')

@ENDPOINT_ADAPTERS.register('Scene')
class SceneAlexaEndpoint(OnOffAlexaEndpoint):

    def turnOn(self):
        self.handler.setSceneSwitch(self._endpointId, 'On')

    def turnOff(self):
        self.handler.setSceneSwitch(self._endpointId, 'Off')

@ENDPOINT_ADAPTERS.register('Group')
class GroupAlexaEndpoint(OnOffAlexaEndpoint):

    def turnOn(self):
        self.handler.setSceneSwitch(self._endpointId, 'On')

    def turnOff(self):
        self.handler.setSceneSwitch(self._endpointId, 'Off')

@ENDPOINT_ADAPTERS.register('SwitchLight')
class SwitchLightAlexaEndpoint(OnOffAlexaEndpoint):

    def setPercentage(self, percentage):
        self.handler.setLevel(self._endpointId, percentage)

    def setBrightness(self, brightness):
        self.handler.setLevel(self._endpointId, brightness)

    def setColor(self, hue, saturation, brigthness):
        rgb = color_hsb_to_RGB(hue, saturation, brigthness)
        self.handler.setColor(self._endpointId, rgb, int (100*brigthness))

    def setColorTemperature(self, kelvin):
        # !! Convert 1000 to 10000 => 0..100 for dz :-) 
        dzKelvin = ((kelvin - 1000) * 100) / 10000
        self.handler.setKelvinLevel(self._endpointId, dzKelvin)

@ENDPOINT_ADAPTERS.register('Blind')
class BlindAlexaEndpoint(OnOffAlexaEndpoint):

    def turnOn(self):
        self.handler.setSwitch(self._endpointId, 'Off')

    def turnOff(self):
        self.handler.setSwitch(self._endpointId, 'On')

@ENDPOINT_ADAPTERS.register('RFY')
class RFIAlexaEndpoint(OnOffAlexaEndpoint):

    def turnOn(self):
        self.handler.setSwitch(self._endpointId, 'Off')

    def turnOff(self):
        self.handler.setSwitch(self._endpointId, 'On')

class LockableAlexaEndpoint(DomoticzEndpoint):
    def __init__(self, endpointId, friendlyName="", description="", manufacturerName=""):
        super().__init__(endpointId, friendlyName, description, manufacturerName)
        self.addCapability(AlexaLockController(self, 'Alexa.LockController',[{'name': 'lockState'}]))              

@ENDPOINT_ADAPTERS.register('Lock')
class LockAlexaEndpoint(LockableAlexaEndpoint):
    pass

@ENDPOINT_ADAPTERS.register('Contact')
class ContactAlexaEndpoint(LockableAlexaEndpoint):
    pass

@ENDPOINT_ADAPTERS.register('TemperatureSensor')
class TemperatureSensorAlexaEndpoint(DomoticzEndpoint):
    
    def __init__(self, endpointId, friendlyName="", description="", manufacturerName=""):
        super().__init__(endpointId, friendlyName, description, manufacturerName)
        self.addCapability(AlexaTemperatureSensor(self, 'Alexa.TemperatureSensor',[{'name': 'temperature'}]))

    def setTargetSetPoint(self, targetSetPoint):
        pass

    def setThermostatMode(self, mode):
        pass

@ENDPOINT_ADAPTERS.register('Thermostat')
class ThermostatAlexaEndpoint(DomoticzEndpoint):

    def __init__(self, endpointId, friendlyName="", description="", manufacturerName=""):
        super().__init__(endpointId, friendlyName, description, manufacturerName)
        self.addCapability(AlexaTemperatureSensor(self, 'Alexa.TemperatureSensor',[{'name': 'temperature'}]))
        thermostatCapability = AlexaThermostatController(self, 'Alexa.ThermostatController',[{'name': 'targetSetpoint'}, {'name': 'thermostatMode'}])
        thermostatCapability.setModesSupported(["HEAT","COOL","AUTO","ECO","OFF"])
        self.addCapability(thermostatCapability)

    def setTargetSetPoint(self, targetSetPoint):
        self.handler.setTemp(self._endpointId, targetSetPoint)

    def setThermostatMode(self, mode):
        pass

@ENDPOINT_ADAPTERS.register('SelectorThermostat')
class SelectorThermostatAlexaEndpoint(DomoticzEndpoint):

    def setTargetSetPoint(self, targetSetPoint):
        #self.handler.setTemp(self._endpointId, targetSetPoint)
        pass

    def setThermostatMode(self, mode):
        self.handler.setLevelByName(self._endpointId, mode)


class Domoticz(object):

    def __init__(self,url,username=None,password=None):
        self.url = url

        if url.startswith("https"):
            context = ssl.create_default_context()
            context.check_hostname = False
            context.verify_mode = ssl.CERT_NONE
            httpsHandler = urllib.request.HTTPSHandler(context = context)
            opener = urllib.request.build_opener(httpsHandler)
            urllib.request.install_opener(opener)

        self.authorization = None
        if username is not None:
            credentials = '%s:%s' % (username, password)
            encoded_credentials = base64.b64encode(credentials.encode())
            self.authorization = b'Basic ' + encoded_credentials

    def api(self, query):
        url = self.url + "/json.htm?" + query
        _LOGGER.debug("Domoticz API call %s", url)
        headers = { 'Content-Type': 'application/json' }
        if self.authorization is not None:
            headers['Authorization'] = self.authorization
        payload = urlopen(Request(url, None, headers)).read()
        return json.loads(payload.decode('utf-8'))

    def getEndpoint(self, request):
        endpointId = request['endpoint']['endpointId']
        items = endpointId.split("-")
        className = items[0]
        id = items[1]
        endpoint = ENDPOINT_ADAPTERS[className](id)
        if className == 'SwitchLight':
            endpoint.addCapability(AlexaPercentageController(endpoint, 'Alexa.PercentageController',[{'name': 'percentage'}]))
            endpoint.addCapability(AlexaBrightnessController(endpoint, 'Alexa.BrightnessController',[{'name': 'brightness'}]))
            endpoint.addCapability(AlexaColorController(endpoint, 'Alexa.ColorController'))
            endpoint.addCapability(AlexaColorTemperatureController(endpoint, 'Alexa.ColorTemperatureController'))
        cookies = request['endpoint']['cookie']
        if cookies is not None:
            endpoint.addCookie(cookies)
        endpoint.setHandler(self)
        return endpoint

    def getEndpoints(self):
        endpoints = []
        response = self.api('type=devices&used=true')
        devices= response['result']
        for device in devices:
            endpoint = None
            if (device['PlanID'] == "0" or device['PlanID'] == ""): continue

            devType = device['Type']

            friendlyName = device['Name']
            endpointId = device['idx']
            manufacturerName = device['HardwareName']
            description = devType

            matchObj = re.match( r'.*Alexa_Name:\s*([^\n]*)', device['Description'], re.M|re.I|re.DOTALL)
            if matchObj:  friendlyName = matchObj.group(1)

            matchObj = re.match( r'.*Alexa_Description:\s*([^\n]*)', device['Description'], re.M|re.I|re.DOTALL)
            if matchObj:  description = matchObj.group(1)

            extra = None
            matchObj = re.match( r'.*Alexa_extra:\s*([^\n]*)', device['Description'], re.M|re.I|re.DOTALL)
            if matchObj:  extra = matchObj.group(1)

            if (devType.startswith('Scene') or devType.startswith('Group')):
                if devType.startswith('Scene')  : endpoint = SceneAlexaEndpoint('Scene-'+endpointId, friendlyName, description, manufacturerName)
                elif devType.startswith('Group'): endpoint = GroupAlexaEndpoint('Group-'+endpointId, friendlyName, description, manufacturerName)
                endpoint.addDisplayCategories("SCENE_TRIGGER")

            elif (devType.startswith('Light')):
                switchType = device['SwitchType']
                # Special case to implement a "virtual thermostat"
                if switchType == 'Selector' and (extra is not None):
                    # extra must contain { "OFF": 0, CONFORT": idx, "ECONOMIE"; idx...}
                    endpoint = ThermostatAlexaEndpoint("SelectorThermostat-"+endpointId, friendlyName, description, manufacturerName)
                    endpoint.addDisplayCategories("THERMOSTAT")
                elif (switchType.startswith('Door') or switchType.startswith('Contact')):
                    if   switchType.startswith('Door'):    endpoint = LockAlexaEndpoint("Lock-"+endpointId, friendlyName, description, manufacturerName)
                    elif switchType.startswith('Contact'): endpoint = ContactAlexaEndpoint("Contact-"+endpointId, friendlyName, description, manufacturerName)
                    if endpoint is not None:
                        endpoint.addDisplayCategories("SWITCH")
                else:
                    # Usual switch case
                    endpoint = SwitchLightAlexaEndpoint("SwitchLight-"+endpointId, friendlyName, description, manufacturerName)
                    endpoint.addDisplayCategories("SWITCH")
                    hasDimmer = device['HaveDimmer']
                    if (hasDimmer):
                        endpoint.addCapability(AlexaPercentageController(self, 'Alexa.PercentageController',[{'name': 'percentage'}]))
                        endpoint.addCapability(AlexaBrightnessController(self, 'Alexa.BrightnessController',[{'name': 'brightness'}]))              
                    subType = device['SubType']
                    if (subType.startswith("RGB")):
                        endpoint.addDisplayCategories("LIGHT")
                        endpoint.addCapability(AlexaColorController(self, 'Alexa.ColorController'))              
                        endpoint.addCapability(AlexaColorTemperatureController(self, 'Alexa.ColorTemperatureController'))              

            elif (devType.startswith('Blind') or devType.startswith('RFY')):
                if   devType.startswith('Blind'): endpoint = BlindAlexaEndpoint("Blind-"+endpointId, friendlyName, description, manufacturerName)
                elif devType.startswith('RFY'):   endpoint = RFIAlexaEndpoint("RFY-"+endpointId, friendlyName, description, manufacturerName)
                endpoint.addDisplayCategories("SWITCH")

            elif (devType.startswith('Lock') or devType.startswith('Contact')):
                if   devType.startswith('Lock'):    endpoint = LockAlexaEndpoint("Lock-"+endpointId, friendlyName, description, manufacturerName)
                elif devType.startswith('Contact'): endpoint = ContactAlexaEndpoint("Contact-"+endpointId, friendlyName, description, manufacturerName)
                endpoint.addDisplayCategories("SWITCH")

            elif (devType.startswith('Temp')):
                endpoint = TemperatureSensorAlexaEndpoint("TemperatureSensor-"+endpointId, friendlyName, description, manufacturerName)
                endpoint.addDisplayCategories("TEMPERATURE_SENSOR")

            elif (devType.startswith('Therm')):
                endpoint = ThermostatAlexaEndpoint("Thermostat-"+endpointId, friendlyName, description, manufacturerName)
                endpoint.addDisplayCategories("THERMOSTAT")
                endpoint.addDisplayCategories("TEMPERATURE_SENSOR")

            if (endpoint is not None):
                if extra is not None:
                    endpoint.addCookie({ "extra": extra} )
                #print(endpoint.displayCategories())
                endpoints.append(endpoint)

        return endpoints

    #
    #  Domoticz API
    #
    def getDevice(self, idx):
        return self.api('type=devices&rid=%s'%idx)['result'][0]

    def setTemp(self, idx, value):
        # Ignore exception ???
        try:
            self.api('type=command&param=udevice&idx=%s&nvalue=0&svalue=%s'%(idx,value))
        except Exception:
            pass

    def setLevel(self, idx, level):
        self.api('type=command&param=switchlight&idx=%s&switchcmd=Set%%20Level&level=%s'%(idx,level))

    def setLevelByName(self, idx, levelName):
        device = self.getDevice(idx)
        levels = device['LevelNames'].upper().split("|")
        ilevel = levels.index(levelName.upper())
        self.setLevel(idx,ilevel*int(device['LevelInt']))

    def setColor(self, idx, rgb, brightness):
        #self.api('type=command&param=setcolbrightnessvalue&idx=%s&hex=%s&brightness=%s&iswhite=false'%(idx,hue,brightness))
        self.api('type=command&param=setcolbrightnessvalue&idx=%s&hex=%0.2X%0.2X%0.2X&brightness=%s&iswhite=false'%(idx,rgb[0],rgb[1],rgb[2],brightness))
        #self.api('type=command&param=setcolbrightnessvalue&idx=%s&color={"m":3,"r":%s,"g":%s,"b":%s}&brightness=%s'%(idx,rgb[0],rgb[1],rgb[2],brightness))

    def setKelvinLevel(self, idx, kelvin):
        self.api('type=command&param=setkelvinlevel&idx=%s&kelvin=%s'%(idx,kelvin))

    def setSwitch(self, idx, value):
        self.api('type=command&param=switchlight&idx=%s&switchcmd=%s'%(idx,value))

    def setSceneSwitch(self, idx, value):
        self.api('type=command&param=switchscene&idx=%s&switchcmd=%s'%(idx,value))

def color_hsb_to_RGB(fH: float, fS: float, fB: float) -> Tuple[int, int, int]:
    """Convert a hsb into its rgb representation."""
    if fS == 0:
        fV = int(fB * 255)
        return fV, fV, fV

    r = g = b = 0
    h = fH / 60
    f = h - float(math.floor(h))
    p = fB * (1 - fS)
    q = fB * (1 - fS * f)
    t = fB * (1 - (fS * (1 - f)))

    if int(h) == 0:
        r = int(fB * 255)
        g = int(t * 255)
        b = int(p * 255)
    elif int(h) == 1:
        r = int(q * 255)
        g = int(fB * 255)
        b = int(p * 255)
    elif int(h) == 2:
        r = int(p * 255)
        g = int(fB * 255)
        b = int(t * 255)
    elif int(h) == 3:
        r = int(p * 255)
        g = int(q * 255)
        b = int(fB * 255)
    elif int(h) == 4:
        r = int(t * 255)
        g = int(p * 255)
        b = int(fB * 255)
    elif int(h) == 5:
        r = int(fB * 255)
        g = int(p * 255)
        b = int(q * 255)

    return (r, g, b)
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: Alexa / Controlicz

Message par rimram31 »

Super, j'avoue que j'ai repris certaines parties de madgeni un peu "a l'aveugle". J'ai intégré tes modifs sur le github (et modifié le template!)

Tu as raison pour le contrôle de la conf, j'ai pas du tout blindé le contrôle des erreurs, je voulais avant tout mettre a dispo qque chose ... mais cool que certains se soient pris au jeu.
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
le belge
Messages : 346
Inscription : 12 déc. 2016, 19:02

Re: Alexa / Controlicz

Message par le belge »

'soir ,

vous êtes des ouf !!!!

va falloir que je me penche la dessus , mais vu mon niveau ça va pas être simple !!!
Damsee
Messages : 87
Inscription : 26 déc. 2016, 22:21

Re: Alexa / Controlicz

Message par Damsee »

le belge a écrit :vous êtes des ouf !!!!
Plus on est de fou et plus on rit et on avance lol
rimram31 a écrit :Super, j'avoue que j'ai repris certaines parties de madgeni un peu "a l'aveugle". J'ai intégré tes modifs sur le github (et modifié le template!)

Tu as raison pour le contrôle de la conf, j'ai pas du tout blindé le contrôle des erreurs, je voulais avant tout mettre a dispo qque chose ... mais cool que certains se soient pris au jeu.
Pas de souci. Il faudrait qu'on arrive à tester toutes les Interfaces et Directives dispo à la fois dans Alexa et Domoticz pk je ne vois pas la partie "Cooking" dans Domoticz...
Par contre tu n'as pas intégré sur le github mes modifs sur les volets RFY ? ^^


INTERFACE ---------------------------------- DIRECTIVE
---------------------------------------------------------------------------
Alexa ----------------------------------------- ReportState => Statut OK
Alexa.TemperatureSensor ---------------- ReportState => Statut OK
Alexa.PowerController -------------------- TurnOn/TurnOff => Statut OK
Alexa.PowerLevelController ------------- SetPowerLevel/AdjustPowerLevel
Alexa.LockController --------------------- Lock/Unlock
Alexa.ThermostatController ------------- SetTargetTemperature/AdjustTargetTemperature/SetThermostatMode/ResumeSchedule
Alexa.PercentageController ------------- SetPercentage/AdjustPercentage
Alexa.BrightnessController -------------- AdjustBrightness/SetBrightness
Alexa.ColorController -------------------- SetColor
Alexa.ColorTemperatureController ----- DecreaseColorTemperature/IncreaseColorTemperature/SetColorTemperature
Alexa.CameraStreamController --------- InitializeCameraStreams
Alexa.ChannelController ----------------- ChangeChannel/SkipChannels
Alexa.InputController --------------------- SelectInput
Alexa.PlaybackController ---------------- FastForward/Next/Pause/Play/Previous/Rewind/StartOver/Stop
Alexa.StepSpeaker ------------------------ AdjustVolume/SetMute
Alexa.Speaker ------------------------------ SetVolume/AdjustVolume/SetMute
Alexa.Cooking ------------------------------ SetCookingMode
Alexa.Cooking.TimeController ---------- CookByTime/AdjustCookTime
Alexa.Cooking.PresetController --------- CookByPreset
Alexa.TimeHoldController --------------- Hold/Resume

Je vous laisse compléter ce que vous avez pu tester :D
Répondre