Skip to content

Instantly share code, notes, and snippets.

@yobud
Last active September 19, 2020 01:09
Show Gist options
  • Save yobud/b7fd3995255cf3fd7da2c12f90e33266 to your computer and use it in GitHub Desktop.
Save yobud/b7fd3995255cf3fd7da2c12f90e33266 to your computer and use it in GitHub Desktop.
À lancer en console depuis la page https://alexa.amazon.fr/api/behaviors/automations
let humanReadable = {
'Volet Cuisine': 'volet de la cuisine',
'Volet Salon': 'volet du salon',
'Volet Salle à manger': 'volet de la salle à manger',
'Volets Pièce à vivre': 'volets de la pièce à vivre',
'Volet Chambre de Léo': 'volet de la chambre de Léo',
'Volet Chambre': 'volet de la chambre'
};
// Delete all routines
function deleteIndex(index) {
var routinesToDelete = JSON.parse(document.body.innerText.split('\n')[0]).filter(v => v.name.startsWith('[AUTO] '));
var csrf = document.cookie.match(/ csrf=(.*?);/)[1];
const request = new Request(`https://alexa.amazon.fr/api/behaviors/automations/${routinesToDelete[index].automationId}`, {
method: 'DELETE',
headers: new Headers({ 'csrf': csrf }),
});
return fetch(request)
.then((response) => {
if (routinesToDelete.length > index+1) {
deleteIndex(index+1);
}
});
}
function deleteAllRoutines() {
deleteIndex(0);
}
var payload = JSON.parse(document.body.innerText.split('\n')[0])[0].triggers[0].payload;
var marketplaceId = payload.marketplaceId;
var customerId = payload.customerId;
function addRoutinesForAllMyBlinds() {
const request = new Request(`https://alexa.amazon.fr/api/phoenix?includeRelationships=true`, {
method: 'GET'
});
return fetch(request)
.then((response) => {
response.json().then(data => {
var items = Object.values(JSON.parse(data.networkDetail).locationDetails.locationDetails.Default_Location.amazonBridgeDetails.amazonBridgeDetails);
items.forEach(v => {
Object.values(v.applianceDetails.applianceDetails).forEach(item => {
if (item.applianceTypes && item.applianceTypes[0] === 'EXTERIOR_BLIND') {
generateRoutinesFor(item);
}
});
});
});
});
}
const routineTemplate = {"triggerJson":"{\"@type\":\"com.amazon.alexa.behaviors.model.Trigger\",\"skillId\":\"amzn1.ask.1p.customutterance\",\"type\":\"CustomUtterance\",\"payload\":\"{\\\"locale\\\":\\\"fr-FR\\\",\\\"marketplaceId\\\":\\\"__MAKETPLACE_ID__\\\",\\\"utterance\\\":\\\"__UTTERANCE__\\\",\\\"customerId\\\":\\\"__CUSTOMER_ID__\\\",\\\"@type\\\":\\\"com.amazon.alexa.behaviors.model.CustomUtteranceTriggerPayload\\\"}\"}","sequenceJson":"{\"@type\":\"com.amazon.alexa.behaviors.model.Sequence\",\"startNode\":{\"@type\":\"com.amazon.alexa.behaviors.model.SerialNode\",\"nodesToExecute\":[{\"@type\":\"com.amazon.alexa.behaviors.model.OpaquePayloadOperationNode\",\"type\":\"Alexa.SmartHome.Batch\",\"operationPayload\":{\"target\":\"__TARGET__\",\"customerId\":\"__CUSTOMER_ID__\",\"operations\":[{\"instance\":\"Blind.Lift\",\"rangeValue\":{\"value\":__RANGE_VALUE__,\"unitOfMeasure\":\"\"},\"type\":\"setRangeValue\"}]},\"skillId\":\"amzn1.ask.1p.smarthome\"}]}}","status":"ENABLED","name":"__NAME__"};
// const routineTemplate = {"triggerJson":"{\"@type\":\"com.amazon.alexa.behaviors.model.Trigger\",\"skillId\":\"amzn1.ask.1p.customutterance\",\"type\":\"CustomUtterance\",\"payload\":\"{\\\"locale\\\":\\\"fr-FR\\\",\\\"marketplaceId\\\":\\\"A13V1IB3VIYZZH\\\",\\\"utterance\\\":\\\"ouvre le volet de la cuisine\\\",\\\"customerId\\\":\\\"AVXRGHVGLT3BP\\\",\\\"@type\\\":\\\"com.amazon.alexa.behaviors.model.CustomUtteranceTriggerPayload\\\"}\"}","sequenceJson":"{\"@type\":\"com.amazon.alexa.behaviors.model.Sequence\",\"startNode\":{\"@type\":\"com.amazon.alexa.behaviors.model.SerialNode\",\"nodesToExecute\":[{\"@type\":\"com.amazon.alexa.behaviors.model.OpaquePayloadOperationNode\",\"type\":\"Alexa.SmartHome.Batch\",\"operationPayload\":{\"target\":\"44f2ce8c-dc60-441c-bd24-f6d4e59b914b\",\"customerId\":\"AVXRGHVGLT3BP\",\"operations\":[{\"instance\":\"Blind.Lift\",\"rangeValue\":{\"value\":100,\"unitOfMeasure\":\"\"},\"type\":\"setRangeValue\"}]},\"skillId\":\"amzn1.ask.1p.smarthome\"}]}}","status":"ENABLED","name":"Ouvrir volet cuisine"}
var someUuids = document.body.innerText.match(/amzn1.alexa.sequence.(.*?)\"/mg).map(v => v.match(/(amz.*)\"/)[1]);
function generateRoutinesFor(item) {
let params = {
__MAKETPLACE_ID__: marketplaceId,
__CUSTOMER_ID__: customerId,
__TARGET__: item.entityId,
__UTTERANCE__: `ouvre le ${humanReadable[item.friendlyName]}`,
__RANGE_VALUE__: 100,
__NAME__: `[AUTO] Ouvrir ${item.friendlyName}`,
}
var csrf = document.cookie.match(/ csrf=(.*?);/)[1];
let request = new Request(`https://alexa.amazon.fr/api/behaviors/automations`, {
method: 'POST',
headers: new Headers({
'csrf': csrf,
'Content-type': 'application/json; charset=utf-8',
// 'Routines-Version': '3.0.45305',
// 'x-amzn-RequestId': someUuids[0]
}),
body: JSON.stringify(routineTemplate).replace(RegExp(Object.keys(params).join('|'), 'gi'), (matched) => params[matched])
});
fetch(request)
.then((response) => {
response.json().then(_ => {
console.log(`Routine créée : ${params.__NAME__}`);
});
});
params = {
...params,
__UTTERANCE__: `ferme le ${humanReadable[item.friendlyName]}`,
__RANGE_VALUE__: 0,
__NAME__: `[AUTO] Fermer ${item.friendlyName}`,
}
var csrf = document.cookie.match(/ csrf=(.*?);/)[1];
request = new Request(`https://alexa.amazon.fr/api/behaviors/automations`, {
method: 'POST',
headers: new Headers({
'csrf': csrf,
'Content-type': 'application/json; charset=utf-8',
// 'Routines-Version': '3.0.45305',
// 'x-amzn-RequestId': someUuids[0]
}),
body: JSON.stringify(routineTemplate).replace(RegExp(Object.keys(params).join('|'), 'gi'), (matched) => params[matched])
});
// console.log(JSON.stringify({triggerJson: routineTemplate.triggerJson}));
// console.log(JSON.stringify({...routineTemplate, ...{triggerJson: routineTemplate.triggerJson.replace(RegExp(Object.keys(params).join('|'), 'gi'), (matched) => params[matched])}}));
fetch(request)
.then((response) => {
response.json().then(_ => {
console.log(`Routine créée : ${params.__NAME__}`);
});
});
}
const routines = {
add: addRoutinesForAllMyBlinds,
delete: deleteAllRoutines
}
console.error(`IL FAUT LIRE ICI !`);
console.warn(`IL FAUT LIRE ICI !`);
console.error(`IL FAUT LIRE ICI !`);
console.log(`n'oublie pas de faire tes associations, en clé, le friendlyName défini sur ton script serveur, en valeur, ce que tu veux dire à voix haute ! Voici tes entrées :`);
console.dir(humanReadable);
console.log(`Maintenant tu peux lancer deux méthodes :`)
console.log(`routines.add() et routines.delete()`);
console.log(`routines.add() boucle sur tous les éléments EXTERIOR_BLIND et fait une routine d'ouverture et une de fermeture !`);
console.log(`routines.delete() supprime toutes les routines commençant par [AUTO] (celles créées par ce script)`);
console.log(`Des bisous`);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment