Amazon Echo an Symcon anbinden inklusive Proxy

Sorry war mein Fehler, es geht doch !!!

Hilft uns das eventuell weiter mit einem eigenen Smarthome Skill?

What’s an easy way to setup Oauth for an Amazon Alexa Connected Home skill? - Stack Overflow

Login mit Amazon funktioniert…

Gruß Stephan

also, wie in dem vorherigen Link gezeigt funktioniert die Oaut2 Anmeldung über Amazon. Man kann dann auch einen Smarthome-Skill anlegen (Amazon AWS, Lambda). Samplecode für ein Virtuelles Gerät eingetragen -> läuft. Alexa erkennt den Smarthome-Skill und das virtuelle Gerät.

Jetzt bin ich aber mangels Phytonprogrammierskills leider raus :mad:

Viele Grüße
Stephan

Dazu müsste paresy höchstens mal Rückmeldung geben wie weit sie damit sind das IP-Symcon generell Oauth über IP-Symcon Connect unterstützt. Dann würde es ausreichen einen Skill zu bauen wenn sich IP-Symcon grundsätzlich als Software authentifizieren kann.

Das wäre der richtige Weg. Warum sollte sich jeder Nutzer mit dem Amazon geraffel rumplagen :frowning:

hängt ja davon ab wie schnell eine entsprechende Funktion bereitgestellt wird. Als IPS User ist man hier ja leider nicht gerade verwöhnt wenn es um die Integration von neuen Techniken geht :rolleyes:

Und bevor ich jetzt noch 6 Montage warte mach ich es lieber selber…

Viele Grüße
Stephan

Wenn man sich anschaut wie schnell die Smarthomeskills in der Liste anwachsen …

HALLO, IPS TEAM… den Zug hier unbedingt besteigen !

Das wäre schön, wenn Symcon endlich mal zeitnah eine Technik unterstützen würde, ich weis nicht wie lange es her ist, das Symcon mal neue Hardware unterstützt !

Da ich auch derzeit überlege wie ich meine Dot in IPS integriere interessiert mich natürlich auch das weitere Vorgehen, gerade im Bezug auf eine native Unterstützung des Alex SmartHome Skills mit IPS…

@parsey: Vielleicht könntest du dich mal äussern ob hier das IPS Team überhaupt in diese Richtung gehen will/wird…

Sorry für das OT,

aber ich schaue gerade „2001 Odysee im Weltraum“ …

Man das Echo macht mit seinem EIgenleben der Spracherkennung und Auswertng selbiger, genau so viele Probleme wie HAL…

kosmische Grüße :slight_smile:
Thomas

…das sich das IPS-Team zu diesem Thema noch gar nicht geäußert hat ist ja auch eine Aussage…:smiley:

Nein, ganz im Ernst: Ich würde mir schon wünschen, dass hierzu mal eine Stellungnahme erfolgt.
Das was man hier mitlesen könnte macht nicht so richtig viel Mut und erinnert mich sehr an die Diskussion zur Homebridge.

Joachim

Homebridge ist meiner Meinung nach ein andere Fall weil Apple da ziemlich den Daumen drauf hat und eine Software nicht mal eben von Apple zertifiziert wird. Beim Echo liegt der Fall ganz anders. Jeder kann kostenlos ein HomeKit erstellen und von Amazon zertifizieren lassen. Und ganz erheblich: ein Smart Home skill zu erstellen ist wirklich keine Hexerei!

Gesendet von iPhone mit Tapatalk

Es scheint sich was zu tun :D:D

Hat es mitlerweile jemand mit einen echten Smart-Home-Skill zum laufen gebracht?
Die Voraussetzungen sind ja dank dem „Login über Amazon“ gegeben. Da braucht IPS keine oauth Funktionalität.

Ich hab es testweise mit sehr rudimentäten Funktionen ans laufen gebracht… kurz ich kann eine Lampe schalten :rolleyes:… der Rest übersteigt leider meine copy and past Fähigkeiten :banghead:

Viele Grüße
Stephan

Leider nicht, finde nix was ich verstehe :rolleyes:

Poste doch mal was du bis jetzt hinbekommen hast, vielleicht kommt dann endlich bei mir der Geistesblitz :banghead:

Also ich bin jetzt wie folgt vorgegangen:

Smart-Home Skill wie in dieser Anleitung inklusive Login mit Amazon einrichten:
Alexa-Fhem – FHEMWiki

Mein Coderumgemurkse :
(Originalcode stammt von hier: particle-alexa-smart-home-skill/lambda.js at master · krvarma/particle-alexa-smart-home-skill · GitHub)

 var https = require('https');

var kitchenLightApplianceId = "A146-3456-b31d-7ec4c146c5ea";
var bedroomLightApplianceId = "A146-3456-b31d-7ec4c146c5eb";
var wohnzimmerLightApplianceId = "A146-3456-b31d-7ec4c146c5ec";

var particleServer = "Deine Symcon Connect URL";
//Pfad zum Webhook in IPS
var particlePath = "/hook/alexa";

/**
 * Main entry point.
 * Incoming events from Alexa Lighting APIs are processed via this method.
 */
exports.handler = function(event, context) {

    log('Input', event);

    switch (event.header.namespace) {
        
        /**
         * The namespace of "Discovery" indicates a request is being made to the lambda for
         * discovering all appliances associated with the customer's appliance cloud account.
         * can use the accessToken that is made available as part of the payload to determine
         * the customer.
         */
        case 'Alexa.ConnectedHome.Discovery':
            handleDiscovery(event, context);
            break;

            /**
             * The namespace of "Control" indicates a request is being made to us to turn a
             * given device on, off or brighten. This message comes with the "appliance"
             * parameter which indicates the appliance that needs to be acted on.
             */
        case 'Alexa.ConnectedHome.Control':
            handleControl(event, context);
            break;

            /**
             * We received an unexpected message
             */
        default:
            log('Err', 'No supported namespace: ' + event.header.namespace);
            context.fail('Something went wrong');
            break;
    }
};

/**
 * This method is invoked when we receive a "Discovery" message from Alexa Connected Home Skill.
 * We are expected to respond back with a list of appliances that we have discovered for a given
 * customer. 
 */
function handleDiscovery(accessToken, context) {

    /**
     * Crafting the response header
     */
    var headers = {
        namespace: 'Alexa.ConnectedHome.Discovery',
        name: 'DiscoverAppliancesResponse',
        payloadVersion: '2'
    };

    /**
     * Response body will be an array of discovered devices.
     */
    var appliances = [];

    var kitchenLight = {
        applianceId: kitchenLightApplianceId,
        manufacturerName: 'KRV',
        modelName: 'ParticleLight',
        version: 'VER01',
        friendlyName: 'Licht Küche',
        friendlyDescription: 'Lampe in der Küche',
        isReachable: true,
        actions:[
            "incrementPercentage",
            "decrementPercentage",
            "setPercentage",
            "turnOn",
            "turnOff"
        ],
        additionalApplianceDetails: {
            /**
             * OPTIONAL:
             * We can use this to persist any appliance specific metadata.
             * This information will be returned back to the driver when user requests
             * action on this appliance.
             */
            fullApplianceId: '2cd6b650-c0h0-4062-b31d-7ec2c146c5ea',
            deviceId: "39003d000447343232363230"
        }
    };
    
    var bedroomLight = {
        applianceId: bedroomLightApplianceId,
        manufacturerName: 'KRV',
        modelName: 'ParticleLight',
        version: 'VER01',
        friendlyName: 'Licht Schlafzimmer',
        friendlyDescription: 'Lampe im Schlafzimmer',
        isReachable: true,
        actions:[
            "incrementPercentage",
            "decrementPercentage",
            "setPercentage",
            "turnOn",
            "turnOff"
        ],
        additionalApplianceDetails: {
            /**
             * OPTIONAL:
             * We can use this to persist any appliance specific metadata.
             * This information will be returned back to the driver when user requests
             * action on this appliance.
             */
            fullApplianceId: '2cd6b650-c0h0-4062-b31d-7ec2c146c5eb',
            deviceId: "39003d000447343232363231"
        }
    };


    var wohnzimmerLight = {
        applianceId: wohnzimmerLightApplianceId,
        manufacturerName: 'KRV',
        modelName: 'ParticleLight',
        version: 'VER01',
        friendlyName: 'Licht Wohnzimmer',
        friendlyDescription: 'Lampe im Wohnzimmer',
        isReachable: true,
        actions:[
            "incrementPercentage",
            "decrementPercentage",
            "setPercentage",
            "turnOn",
            "turnOff"
        ],
        additionalApplianceDetails: {
            /**
             * OPTIONAL:
             * We can use this to persist any appliance specific metadata.
             * This information will be returned back to the driver when user requests
             * action on this appliance.
             */
            fullApplianceId: '2cd6b650-c0h0-4062-b31d-7ec2c146c5ec',
            deviceId: "39003d000447343232363232"
        }
    };
    
    appliances.push(kitchenLight);
    appliances.push(bedroomLight);
    appliances.push(wohnzimmerLight);
    
    /**
     * Craft the final response back to Alexa Connected Home Skill. This will include all the 
     * discoverd appliances.
     */
    var payloads = {
        discoveredAppliances: appliances
    };
    var result = {
        header: headers,
        payload: payloads
    };

    log('Discovery', result);

    context.succeed(result);
}

/**
 * Control events are processed here.
 * This is called when Alexa requests an action (IE turn off appliance).
 */
function handleControl(event, context) {
    if (event.header.namespace === 'Alexa.ConnectedHome.Control') {

        /**
         * Retrieve the appliance id and accessToken from the incoming message.
         */
        var accessToken = event.payload.accessToken;
        var applianceId = event.payload.appliance.applianceId;
        var deviceid = event.payload.appliance.additionalApplianceDetails.deviceId;
        var message_id = event.header.messageId;
        var param = "";
        var index = "0";
        var state = 0;
        var confirmation;
        var funcName;
        
        log("Access Token: ", accessToken);
        log("DeviceID: ", deviceid);

        if(event.header.name == "TurnOnRequest"){
            state = 1;
            confirmation = "TurnOnConfirmation";
            funcName = "on";
        }
        else if(event.header.name == "TurnOffRequest"){
            state = 0;            
            confirmation = "TurnOffConfirmation";
            funcName = "off";
        }
        else if(event.header.name == "SetPercentageRequest"){
            state = event.payload.percentageState.value;
            confirmation = "SetPercentageConfirmation";
            funcName = "dimmen";
        }
        else if(event.header.name == "IncrementPercentageRequest"){
            var increment = event.payload.deltaPercentage.value;
            
            state += increment;
            
            if(state > 100){
                state = 100;
            }
            
            confirmation = "IncrementPercentageConfirmation";
            funcName = "setvalue";
        }
        else if(event.header.name == "DecrementPercentageRequest"){
            var decrement = event.payload.deltaPercentage.value;
            
            state -= decrement;
            
            if(state < 0){
                state = 0;
            }
            
            confirmation = "DecrementPercentageConfirmation";
            funcName = "setvalue";
        }
        
        log('applianceId', applianceId);
        
        if(applianceId == kitchenLightApplianceId){
            index = "0";
        }
        else if(applianceId == bedroomLightApplianceId){
            index = "1";
        }
        else if(applianceId == wohnzimmerLightApplianceId){
            index = "2";
        }        
        param = index + "&status=" + state + "&funktion=" + funcName + "&id=" +applianceId;
        
        var options = {
            hostname: particleServer,
            port: 443,
            //path: particlePath,
            path: particlePath + deviceid + "/" + funcName,
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            }
        };
        
        log(options);
        
      //  var data = "access_token=" + accessToken + "&" + "args=" + param;
    var data = "device=" + param;       
        log(data);

        var serverError = function (e) {
            log('Error', e.message);
            context.fail(generateControlError('TurnOnRequest', 'DEPENDENT_SERVICE_UNAVAILABLE', 'Unable to connect to server'));
        };

        var callback = function(response) {
            var str = '';

            response.on('data', function(chunk) {
                str += chunk.toString('utf-8');
            });

            response.on('end', function() {
                log('Return Value');
                log(str);
                
                var headers = {
                    namespace: 'Alexa.ConnectedHome.Control',
                    name: confirmation,
                    payloadVersion: '2',
                    messageId: message_id
                };
                var payloads = {
                    
                };
                var result = {
                    header: headers,
                    payload: payloads
                };

                context.succeed(result);
            });

            response.on('error', serverError);
        };

        var req = https.request(options, callback);
            
        req.on('error', serverError);
        
        req.write(data);
        req.end();
    }
}

/**
 * Utility functions.
 */
function log(title, msg) {
    console.log(title + ": " + msg);
}

function generateControlError(name, code, description) {
    var headers = {
        namespace: 'Control',
        name: name,
        payloadVersion: '1'
    };

    var payload = {
        exception: {
            code: code,
            description: description
        }
    };

    var result = {
        header: headers,
        payload: payload
    };

    return result;
}

Mein Webhook Script:



<?

IPS_LogMessage("WebHook GET", print_r($_GET, true));
IPS_LogMessage("WebHook POST", print_r($_POST, true));
IPS_LogMessage("WebHook IPS", print_r($_IPS, true));
IPS_LogMessage("WebHook RAW", file_get_contents("php://input"));

$device = $_POST['device']; //Gerätenummer
$status = $_POST['status']; //1 oder 0 oder Prozentwert zum Dimmen
$funktion = $_POST['funktion']; (on, off oder dimmen
$id = $_POST['id']; //Geräte-ID vom Skill

//hier wird aktuell nur das Gerät mit der Nummer 0 gesteuert!
if($device== "0")
{
if ($funktion == "on")
{

//Befehl um dein Gerät einzuschalten
}
if ($funktion == "off")
{
//Befehl um dein Gerät auszuschalten
}

if ($funktion == "dimmen")
{
//Befehl um dein Gerät zu dimmen
}
}
?>

wie gesagt, da ist nichts sauber und viel Zeug drin was da aktuell keinen Sinn macht. Aber hey! ich kann ne Lampe schalten ohne einen dämlichen Skill-Namen aufrufen zu müssen (Alexa, sag Angela Merkel schalte das Licht in der Küche ein) :smiley:

Viele Grüße
Stephan

Was soll das denn anderes sein als OAuth2?

Das soll nichts anderes als oaut2 sein. Aber du musst nichts damit in IPS machen. Das ist nur für die Skill Aktivierung in der Alexa App da…

Gesendet von iPhone mit Tapatalk

Ah ok, aber dennoch muss bei dem beschriebenen Weg sich ja jeder User als Developer anmelden. Das ist also kein richtiger Ersatz dafür für einen fertigen Skill wo sich der User dann nur noch von IP-Symcon aus authentifizieren muss. Also hoffen wir mal das das dann bald auch ohne sich durch Anleitungen zu quälen funktioniert.

Korrekt, der einzige Vorteil zu der vorherigen Lösung ist der echte Smart Home skill. Den muss aber jeder selber als Developer bei Amazon erstellen.

Gesendet von iPhone mit Tapatalk