Hi,
ich habe folgendes Problem.
Ich nutze yahka für homekit.
Meine ganzen Skripte steuern Lampen über eine globale funktion "ansteuern" an, nicht direkt durch setState. in der Funktion wird nach Timeout der Ack-Zustand abgefragt, bei Fehler bekomme ich eine Mitteilung dass die Lampe nicht reagiert. Funzt top.
Bisher hatte ich in Yahka meine ganzen Geräte erstellt und direkt die Lampen-States geschalten.
Ich möchte ein Skript, mit dem ich einen selbst generierten Alias über yahka schalte, und durch diesen dann die globale Funktion zum Lampe schalten aufrufe.
Hier mal die global verfügbaren Skripte:
defines: hier werden meine globalen Variablen definiert.
const raum = {
flur: {
TreppeLichterkette: {
STATE: 'zigbee.0.804b50fffeb72a3b.state',
DESCRIPTION: 'Flur Treppe Lichterkette'
},
WandlampenUnten: {
STATE: 'zigbee.0.84fd27fffe70e192.state',
BRIGHTNESS: 'zigbee.0.84fd27fffe70e192.brightness',
DESCRIPTION: 'Flur Wandlampen Unten'
},
WandlampenOben: {
STATE: 'zigbee.0.680ae2fffea535cf.state',
BRIGHTNESS: 'zigbee.0.680ae2fffea535cf.brightness',
DESCRIPTION: 'Flur Wandlampen Oben'
},
Tischlampe: {
STATE: 'hue-extended.0.lights.032-tischlampe.action.on',
BRIGHTNESS: 'hue-extended.0.lights.032-tischlampe.action.level',
DESCRIPTION: 'Flur Tischlampe'
}
},
kueche: {
Arbeitslicht: {
STATE: 'zigbee.0.680ae2fffea44ad6.state',
BRIGHTNESS: 'zigbee.0.680ae2fffea44ad6.brightness',
DESCRIPTION: 'Küche Arbeitslicht'
},
Deckenlampe: {
STATE: 'zigbee.0.84fd27fffe70cf16.state',
DESCRIPTION: 'Küche Deckenlampe'
},
Indirekt: {
STATE: 'hue-extended.0.lights.026-kuecheindirekt.action.on',
BRIGHTNESS: 'hue-extended.0.lights.026-kuecheindirekt.action.level',
XY: 'hue-extended.0.lights.026-kuecheindirekt.action.xy',
COLORTEMP: 'hue-extended.0.lights.026-kuecheindirekt.action.colorTemperature',
DESCRIPTION: 'Küche indirekte Beleuchtung'
},
SteckdoseFenster: {
STATE: 'shelly.0.SHSW-1#C45BBE564DF9#1.Relay0.Switch',
DESCRIPTION: 'Küche Steckdose am Fenster'
},
ButtonZirkulation: {
CLICK: 'zigbee.0.00124b0029198d06.click',
LongCLICK: 'zigbee.0.00124b0029198d06.long_click',
DoubleCLICK: 'zigbee.0.00124b0029198d06.double_click',
DESCRIPTION: 'Küche Button über der Spüle'
}
},
esszimmer: {
deckenlampe: {
STATE: 'zigbee.0.804b50fffeb73d1c.state',
BRIGHTNESS: 'zigbee.0.804b50fffeb73d1c.brightness',
DESCRIPTION: 'Esszimmer Deckenlampe'
},
barlampe: {
STATE: 'zigbee.0.804b50fffeb72408.state',
DESCRIPTION: 'Esszimmer Barlampe'
},
stehlampe: {
STATE: 'hue-extended.0.lights.027-esszimmerstehlampe.action.on',
BRIGHTNESS: 'hue-extended.0.lights.027-esszimmerstehlampe.action.level',
XY: 'hue-extended.0.lights.027-esszimmerstehlampe.action.xy',
COLORTEMP: 'hue-extended.0.lights.027-esszimmerstehlampe.action.colorTemperature',
DESCRIPTION: 'Esszimmer Stehlampe'
},
steckdoseFenster: {
STATE: 'shelly.0.SHSW-1#98CDAC24595B#1.Relay0.Switch',
DESCRIPTION: 'Esszimmer Steckdose am Fenster'
},
heizung: {
VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D844E.ValveTappet.position',
SET:'bshb.0.roomClimateControl_hz_2.RoomClimateControl.setpointTemperature',
SET_COMFORT: 'bshb.0.roomClimateControl_hz_2.RoomClimateControl.setpointTemperatureForLevelComfort',
SET_ECO: 'bshb.0.roomClimateControl_hz_2.RoomClimateControl.setpointTemperatureForLevelEco',
SUMMER: 'bshb.0.roomClimateControl_hz_2.RoomClimateControl.summerMode',
DESCRIPTION: 'Esszimmer Heizthermostat'
}
},
wintergarten: {
wandlampen: {
STATE: 'zigbee.0.804b50fffeb72672.state',
DESCRIPTION: 'Wintergarten Wandlampen'
},
fensteroeffner: {
POSITION: 'shelly.0.SHSW-25#3C6105E4E872#1.Shutter.Position',
DESCRIPTION: 'Wintergarten Fensteröffner'
},
markise: {
EINFAHREN: 'sonoff.0.Markise.POWER1',
AUSFAHREN: 'sonoff.0.Markise.POWER2',
DESCRIPTION: 'Wintergarten Markise'
},
automatik: {
STATE: 'yahka.meta.eigene_Datenpunkte.FreigabeWintergartenAutomatik',
DESCRIPTION: 'Wintergarten Automatikfreigabe für Markise und Fenster'
},
heizung: {
VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E52CD.ValveTappet.position',
SET:'bshb.0.roomClimateControl_hz_3.RoomClimateControl.setpointTemperature',
SET_COMFORT: 'bshb.0.roomClimateControl_hz_3.RoomClimateControl.setpointTemperatureForLevelComfort',
SET_ECO: 'bshb.0.roomClimateControl_hz_3.RoomClimateControl.setpointTemperatureForLevelEco',
SUMMER: 'bshb.0.roomClimateControl_hz_3.RoomClimateControl.summerMode',
DESCRIPTION: 'Wintergarten Heizthermostat'
}
},
wohnzimmer: {
Deckenlampe: {
STATE: 'zigbee.0.680ae2fffea520fe.state',
BRIGHTNESS: 'zigbee.0.680ae2fffea520fe.brightness',
DESCRIPTION: 'Wohnzimmer Deckenlampe'
},
StehlampeVorn: {
STATE: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.on',
BRIGHTNESS: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.level',
XY: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.xy',
COLORTEMP: 'hue-extended.0.lights.018-wohnzimmerstehlampevorne.action.colorTemperature',
DESCRIPTION: 'Wohnzimmer Stehlampe vorne'
},
StehlampeSofa: {
STATE: 'hue-extended.0.lights.019-wohnzimmersofastehlampe.action.on',
BRIGHTNESS: 'hue-extended.0.lights.019-wohnzimmersofastehlampe.action.level',
COLORTEMP: 'hue-extended.0.lights.019-wohnzimmersofastehlampe.action.colorTemperature',
DESCRIPTION: 'Wohnzimmer Stehlampe hinterm Sofa'
},
StromFernseher: {
STATE: 'shelly.0.SHSW-1#C45BBE778068#1.Relay0.Switch',
DESCRIPTION: 'Wohnzimmer Steckdosenschalter Fernseher'
},
SteckdoseFenster: {
STATE: 'shelly.0.SHSW-1#483FDAA24004#1.Relay0.Switch',
DESCRIPTION: 'Wohnzimmer Steckdose am Fenster'
},
heizung: {
VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D8437.ValveTappet.position',
SET:'bshb.0.roomClimateControl_hz_1.RoomClimateControl.setpointTemperature',
SET_COMFORT: 'bshb.0.roomClimateControl_hz_1.RoomClimateControl.setpointTemperatureForLevelComfort',
SET_ECO: 'bshb.0.roomClimateControl_hz_1.RoomClimateControl.setpointTemperatureForLevelEco',
SUMMER: 'bshb.0.roomClimateControl_hz_1.RoomClimateControl.summerMode',
DESCRIPTION: 'Wohnzimmer Heizthermostat'
}
},
bad: {
deckenlampe: {
STATE: 'zigbee.0.804b50fffeb34cf4.state',
DESCRIPTION: 'Bad Deckenlampe'
},
heizung: {
VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E590C.ValveTappet.position',
SET:'bshb.0.roomClimateControl_hz_5.RoomClimateControl.setpointTemperature',
SET_COMFORT: 'bshb.0.roomClimateControl_hz_5.RoomClimateControl.setpointTemperatureForLevelComfort',
SET_ECO: 'bshb.0.roomClimateControl_hz_5.RoomClimateControl.setpointTemperatureForLevelEco',
SUMMER: 'bshb.0.roomClimateControl_hz_5.RoomClimateControl.summerMode',
DESCRIPTION: 'Bad Heizthermostat'
}
},
buero: {
deckenlampe: {
STATE: 'zigbee.0.804b50fffeb34cf4.state',
DESCRIPTION: 'Büro Deckenlampe'
},
heizung: {
VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E504F.ValveTappet.position',
SET:'bshb.0.roomClimateControl_hz_6.RoomClimateControl.setpointTemperature',
SET_COMFORT: 'bshb.0.roomClimateControl_hz_6.RoomClimateControl.setpointTemperatureForLevelComfort',
SET_ECO: 'bshb.0.roomClimateControl_hz_6.RoomClimateControl.setpointTemperatureForLevelEco',
SUMMER: 'bshb.0.roomClimateControl_hz_6.RoomClimateControl.summerMode',
DESCRIPTION: 'Büro Heizthermostat'
}
},
ankleide: {
deckenlampe: {
STATE: 'zigbee.0.804b50fffeb3550c.state',
DESCRIPTION: 'Ankleidezimmer Deckenlampe'
},
heizung: {
VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D5C17.ValveTappet.position',
SET:'bshb.0.roomClimateControl_hz_7.RoomClimateControl.setpointTemperature',
SET_COMFORT: 'bshb.0.roomClimateControl_hz_7.RoomClimateControl.setpointTemperatureForLevelComfort',
SET_ECO: 'bshb.0.roomClimateControl_hz_7.RoomClimateControl.setpointTemperatureForLevelEco',
SUMMER: 'bshb.0.roomClimateControl_hz_7.RoomClimateControl.summerMode',
DESCRIPTION: 'Ankleidezimmer Heizthermostat'
}
},
schlafzimmer: {
deckenlampe: {
STATE: 'zigbee.0.680ae2fffea535c4.state',
BRIGHTNESS: 'zigbee.0.680ae2fffea535c4.brightness',
DESCRIPTION: 'Schlafzimmer Deckenlampe'
},
schranklicht: {
STATE: 'zigbee.0.0c4314fffee932d8.state',
DESCRIPTION: 'Schlafzimmer Schranklicht'
},
buttonTuer: {
CLICK: 'zigbee.0.00124b002919bc6a.click',
LongCLICK: 'zigbee.0.00124b002919bc6a.long_click',
DoubleCLICK: 'zigbee.0.00124b002919bc6a.double_click',
DESCRIPTION: 'Schlafzimmer Button an der Tür'
},
heizung: {
VENTILPOS_BALKON: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E504C.ValveTappet.position',
VENTILPOS_FENSTER: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85D59FD.ValveTappet.position',
SET:'bshb.0.roomClimateControl_hz_8.RoomClimateControl.setpointTemperature',
SET_COMFORT: 'bshb.0.roomClimateControl_hz_8.RoomClimateControl.setpointTemperatureForLevelComfort',
SET_ECO: 'bshb.0.roomClimateControl_hz_8.RoomClimateControl.setpointTemperatureForLevelEco',
SUMMER: 'bshb.0.roomClimateControl_hz_8.RoomClimateControl.summerMode',
DESCRIPTION: 'Schlafzimmer Heizthermostat'
}
},
hobbyraum: {
deckenlampe: {
STATE: 'zigbee.0.804b50fffeb0d4ee.state',
DESCRIPTION: 'Hobbyraum Deckenlampe'
},
heizung: {
VENTILPOS: 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85DFE77.ValveTappet.position',
SET:'bshb.0.roomClimateControl_hz_9.RoomClimateControl.setpointTemperature',
SET_COMFORT: 'bshb.0.roomClimateControl_hz_9.RoomClimateControl.setpointTemperatureForLevelComfort',
SET_ECO: 'bshb.0.roomClimateControl_hz_9.RoomClimateControl.setpointTemperatureForLevelEco',
SUMMER: 'bshb.0.roomClimateControl_hz_9.RoomClimateControl.summerMode',
DESCRIPTION: 'Hobbyraum Heizthermostat'
}
},
keller: {
deckenlampen: {
STATE: 'zigbee.0.804b50fffeb72695.state',
DESCRIPTION: 'Keller Deckenlampen'
}
},
garage: {
deckenlampe: {
STATE: 'shelly.0.SHSW-1#E8DB84D24E26#1.Relay0.Switch',
INPUT: 'shelly.0.SHSW-1#E8DB84D24E26#1.Relay0.Input',
DESCRIPTION: 'Garage Deckenlampe'
},
fluter: {
STATE: 'shelly.0.SHSW-1#E8DB84D61FFB#1.Relay0.Switch',
INPUT: 'shelly.0.SHSW-1#E8DB84D61FFB#1.Relay0.Input',
DESCRIPTION: 'Garage Fluter'
},
bwMelder: {
PRESENCE: 'zigbee.0.001788010649aa21.occupancy',
LIGHT: 'zigbee.0.001788010649aa21.illuminance',
TEMP: 'zigbee.0.001788010649aa21.temperature',
DESCRIPTION: 'Garage Bewegungsmelder'
}
},
aussen: {
heckenlicht: {
STATE: 'zigbee.0.804b50fffeb0d7fa.state',
DESCRIPTION: 'Aussen Heckenbeleuchtung'
},
haustuerBwMelder: {
STATE: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.Switch',
CLICK: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.Input',
LongCLICK: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.longpush',
EVENT: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.Event',
EVENTCOUNT: 'shelly.0.SHSW-1#E8DB84D32B70#1.Relay0.EventCount',
DESCRIPTION: 'Aussen Bewegungsmelder an der Haustür'
}
}
}
die funktion Ansteuern: das ist die global verfügbare funktion, mit der ich Lampen ansteuere
//Eingangsvariablen sind Object-IDs, die angesteuert werden sollen und der Schaltzustand
//Variablendeklaration
let ansteuern_ID;
let ansteuern_Value;
let ansteuern_oldValue;
let ansteuern_desc; //Beschreibung für die Push-Mitteilung
//Funktion
function ansteuern (ansteuern_ID, ansteuern_Value, ansteuern_oldValue, ansteuern_desc) {
var push_desc;
if (ansteuern_desc == undefined) {
push_desc = ansteuern_ID;
} else {
push_desc = ansteuern_desc;
};
if (getState(ansteuern_ID).val != ansteuern_Value ||
getState(ansteuern_ID).ack == false ) {
setState(ansteuern_ID, ansteuern_Value);
var timeout = setTimeout(async function() {
if (getState(ansteuern_ID).ack == false ) {
setState(ansteuern_ID, ansteuern_oldValue);
var secondtryTimeout = setTimeout(async function(){
setState(ansteuern_ID, ansteuern_Value);
}, 30);
var innerTimeout = setTimeout(async function(){
if (getState(ansteuern_ID).ack == false ) {
sendTo("pushover.0", {
title: "Gerät reagiert nicht.",
message: "Bitte nochmal schalten oder prüfen: " + push_desc
});
setState(ansteuern_ID, ansteuern_oldValue);
};
},3000);
};
},3000);
};
};
nun zu meinem neuen Skript und damit auch Problem:
//es werden States erzeugt, die für die Homeapp genutzt werden
var roomindex;
var deviceindex;
var statindex;
var homeKitobjectAlias = {};
for (roomindex in raum){
for (deviceindex in raum[roomindex]){
if (deviceindex != "haustuerBwMelder"){
for (statindex in raum[roomindex][deviceindex]){
if (statindex == "STATE" ||
statindex == "BRIGHTNESS" ||
statindex == "SET" ) {
var objectName = "javascript.0.eigeneDatenpunkte.HomeKit.lamplist." + roomindex + "_" + deviceindex + "_" + statindex;
var objectValue = getState(eval("raum." + roomindex + "." + deviceindex + "." + statindex)).val;
var objectType = getObject(eval("raum." + roomindex + "." + deviceindex + "." + statindex)).common.type;
if (!existsState(objectName)) {
createState(objectName, objectValue, {
name: roomindex + "_" + deviceindex + "_" + statindex,
type: objectType,
read: true,
write: true
});
} else {
setState(objectName, objectValue);
};
var flagName = "flag_" + objectName;
homeKitobjectAlias[roomindex + "_" + deviceindex + "_" + statindex] = {
orig: "raum." + roomindex + "." + deviceindex + "." + statindex,
alias: objectName,
flag: flagName
};
}
}
}
}
}
var flags = {};
for (var key in homeKitobjectAlias) {
var origID = eval(homeKitobjectAlias[key].orig);
var aliasID = homeKitobjectAlias[key].alias;
var flagID = homeKitobjectAlias[key].flag;
on({id: aliasID, change: "ne"}, function (obj) {
if (flags[flagName]) {
flags[flagName] = false;
} else {
flags[flagName] = true;
ansteuern(origID, obj.state.val, obj.oldState.val, aliasID);
}
});
on({id: origID, change: "ne", ack: true}, function (obj) {
if (flags[flagName]) {
flags[flagName] = false;
} else {
flags[flagName] = true;
setState(aliasID, obj.state.val, true);
}
});
}
grundsätzlich funktioniert alles soweit. die Aliase werden erzeugt, das Object homeKitObjectAlias wird auch sauber beschrieben. Habe ich über console.log schon ausgelesen. läuft.
allerdings werden scheinbar die on-funktionen nicht sauber geschrieben.
egal, welche Lampe ich schalte (egal ob über Lichtschalter oder in der Object-Liste), wird immer nur auf aussen_Heckenlicht_STATE geschrieben. Die on-Funktionen reagieren auf alle Lampen, schalten aber nur dieses eine State.
Mir gehen langsam die Ideen aus, ausser mühevoll und umständlich für jeden state eine eigene on-funktion zu schreiben. Das müsste doch so irgendwie gehen?
Wenn ich mir den homeKitaliasObject[key].orig per console ausgeben lasse, steht auch immer nur aussen_Heckenlicht_STATE drin. obwohl auf eine andere Lampe reagiert wurde.
Kann jemand weiterhelfen?
Vielen Dank schonmal, liebe Grüße
Benni