Hallo Tom,
für die Anwesenheitserkennung habe ich das AddOn "Radar" in ioBroker laufen.
Sobald mein Handy in Reichweite ist, wird es somit von Radar erkannt (Bluetooth).
In Radar kann für jedes Bluetooth-Gerät bereits einen Namen vergeben werden… also z.B. "Person1", deshalb wollte ich ungern weitere Variablen (Person1-Anwesend) erstellen.
Ich habe es in JS wie folgt gelöst:
function diffArray(arr1, arr2) {
return arr1.concat(arr2).filter(function (val) {
if (!(arr1.includes(val) && arr2.includes(val)))
return val;
});
}
on({id: 'radar.0.whoHere', change: "ne"}, function (obj) {
console.log('+++++++++ Anwesenheit +++++++++++ ');
var newState = '',
oldState ='',
newStateArray = [],
oldStateArray = [],
changedPerson = '',
sayString = "",
delay=0;
newState = (obj.newState.val ? obj.newState.val : "");
oldState = (obj.oldState.val ? obj.oldState.val : "");
console.log('newState: ' + newState);
console.log('oldState: ' + oldState);
if(newState.length>0){
newStateArray = (newState.split(", ") ? newState.split(", ") : newStateArray.push(newState) );
}
if(oldState.length>0){
oldStateArray = (oldState.split(", ") ? oldState.split(", ") : oldStateArray.push(oldState) );
}
// console.log('newStateArray.length: ' + newStateArray.length);
// console.log('oldStateArray.length: ' + oldStateArray.length);
changedPerson = diffArray(newStateArray, oldStateArray).toString();
changedPerson = changedPerson.replace(',',' und ');
console.log('changedPerson: ' + changedPerson);
if (newStateArray.length > oldStateArray.length){
// Person neu hinzugekommen
sayString = "Willkommen zuhause " +changedPerson;
delay =5000;
} else {
// Person hat den Bereich verlassen
sayString = "Tschüss " + changedPerson;
delay =0;
}
//Alexa ansteuern
setState("alexa2.0.Echo-Devices.G000Jxxx.Commands.speak-volume"/*volume*/, 35);
setStateDelayed("alexa2.0.Echo-Devices.G000xxx.Commands.speak"/*controlNext*/, sayString, delay, false);
});
Grüße
Markus
Edit: code angepasst