@Homoran
Die Doku hat mir echt geholfen .
Mit dem iobroker-Sonos-Adapter funktioniert bei mir TTS nicht.
Ich habe festgestellt, wenn man mit Schleifen in Kombination mit Requests und deren Results oder Timeouts arbeitet, dann ist Blockly nicht nutzbar, da alle Skript-Variablen global für das gesamte Skript angelegt werden. Mit Callbacks läuft man dann schnell in die Situation, dass die sich überschreiben.
Ich habe noch eine Prüfung auf mute eingebaut, da sonst kein Ton raus kommt, wenn das Gerät gerade stumm geschaltet ist.
Wegen der Probleme mit Blockly hab ich es mit JS gelöst:
var klangbefehl;
var timeout;
// Einzelnen Sonos-Raum verarbeiten
function handleRoom(room) {
var url = [getState("0_userdata.0.sonos_server").val,room,'/state'].join('');
console.log(url);
try {
require("request")(url, function (error, response, result) {
console.debug(result);
var muted = false;
if (result.indexOf('\"mute\":true') >= 0) {
muted = true;
muteOrUnmuteRoom(room, false);
}
url = [getState("0_userdata.0.sonos_server").val,room,klangbefehl].join('');
console.log(url);
try {
require("request")(url, function (error, response, result) {
console.log(result);
}).on("error", function (e) {console.error(e);});
} catch (e) { console.error(e); }
if (muted) {
setTimeout(function () {
muteOrUnmuteRoom(room, true);
}, timeout);
}
}).on("error", function (e) {console.error(e);});
} catch (e) { console.error(e); }
console.log("request: " + url);
}
// Sonos stumm oder laut schalten
function muteOrUnmuteRoom(room, doMute) {
var url = String(getState("0_userdata.0.sonos_server").val) + String(room);
if (doMute) {
url += '/mute';
} else {
url += '/unmute';
}
console.log(url);
try {
require("request")(url, function (error, response, result) {
console.debug(result);
}).on("error", function (e) {console.error(e);});
} catch (e) { console.error(e); }
}
on({id: new RegExp('hm-rpc\\.1\\.0026DA49A82A4C\\.1\\.PRESS_LONG' + "|" + 'hm-rpc\\.1\\.0026DA49A82A4C\\.1\\.PRESS_SHORT' + "|" +
'0_userdata.0.klingel.klingeltest'), change: "any"}, function (obj) {
var value = obj.state.val;
var oldValue = obj.oldState.val;
if (getState("0_userdata.0.klingel.clipOrTts").val == "clip") {
klangbefehl = ['/clip/',getState("0_userdata.0.klingel.clip").val,'/',getState("0_userdata.0.klingel.lautstaerke_0_bis_100").val].join('');
}
else {
klangbefehl = ['/say/',getState("0_userdata.0.klingel.ansagetext").val,'/de/',getState("0_userdata.0.klingel.lautstaerke_0_bis_100").val].join('');
}
timeout = Number(getState("0_userdata.0.klingel.playTimeout").val) * 1000;
var rooms = ['Flur', 'Küche', 'Wohnzimmer'];
//var rooms = ['Küche'];
if (getState("0_userdata.0.klingel.klingeln_garten").val == true) {
rooms.push('Garten');
}
if (getState("0_userdata.0.klingel.klingeln_garage").val == true) {
rooms.push('Garage');
}
for (var room_index in rooms) {
var room = rooms[room_index];
handleRoom(room);
}
});