Hallo liebe Pi Freunde,
habe das Forum vor ein paar Stunden gefunden und hab auch gleich eine Frage an euch, hoffentlich kennen sich hier welche mit Node.js aus
Also, erstmal die Hintergrunddaten:
Es geht um eine Heimautomation, vom Client wird via socket.io ein Befehl gesendet, der Server bearbeitet dann diesen Befehl, dazu gibt es folgenden Code:
socket.on("call scene", function(msg){
db.get("SELECT * FROM scenes WHERE id=" + msg, function (err, row) {
sceneId = row["id"];
sceneName = row["name"];
sceneDCtrl = row["devicectrl"];
sceneECtrl = row["extractrl"];
if(sceneDCtrl.indexOf("|") > -1){
sceneD = sceneDCtrl.split("|");
for(var i=0; i<sceneD.length; i++){
s = sceneD[i].split("=");
devId = s[0];
if(s[1] == 0){
if(mode[devId] == 0){continue;}
exec(offcmd[devId]);
io.emit("turned off", devId);
db.run("UPDATE devices SET mode=0 WHERE id=" + devId);
mode[devId] = 0;
}else if(s[1] == 1){
if(mode[devId] == 1){continue;}
exec(oncmd[devId]);
io.emit("turned on", devId);
db.run("UPDATE devices SET mode=1 WHERE id=" + devId);
mode[devId] = 1;
}
}
if(sceneECtrl.indexOf("|") > -1){
sceneE = sceneECtrl.split("|");
for(var i=0; i<sceneE.length; i++){
var e = sceneE[i];
log("DEBUG", "e/sceneE[i] = " + sceneE[i] + ", ecmd[e] = " + ecmd[e], 3);
setTimeout(function () {
exec(ecmd[e]);
}, 1000);
}
}else{
setTimeout(function () {
exec(ecmd[sceneECtrl]);
}, 1000);
}
}else{
s = sceneDCtrl.split("=");
devId = d[0];
if(s[1] == 0){
if(mode[devId] == 1){
exec(offcmd[devId]);
io.emit("turned off", devId);
db.run("UPDATE devices SET mode=0 WHERE id=" + devId);
mode[devId] = 0;
}
}else if(s[1] == 1){
if(mode[devId] == 0){
exec(oncmd[devId]);
io.emit("turned on", devId);
db.run("UPDATE devices SET mode=1 WHERE id=" + devId);
mode[devId] = 1;
}
}
if(sceneECtrl.indexOf("|") > -1){
sceneE = sceneECtrl.split("|");
for(var i=0; i<sceneE.length; i++){
var e = sceneE[i];
setTimeout(function () {
exec(ecmd[e]);
}, 1000);
}
}
}
});
log("SCENE", "SceneID " + msg + " was called.", 5);
});
Alles anzeigen
Nun habe ich folgendes Problem: Ich habe ja schon die ecmd[e] exec so geschrieben, dass sie erst nach einer Sekunde ausgeführt wird, nun gibts folgendes:
Es wird immer nur der erste exec Befehl jeweils von ecmd und von on/offcmd ausgeführt, obwohl eigentlich alles ausgeführt werden sollte.
Die Daten sind so gespeichert: sceneECtrl: 4|2|3 etc. -> ID von einer anderen Tabelle, worin zusätzliche Befehle drin stehen.
sceneDCtrl: 1=1|2=0|3=0|4=1 etc -> GeräteID 1 & 4 sollen an gehen, ID 2 & 3 sollen aus gehen.
Alles andere Funktioniert bisher perfekt, nur eben das nicht richtig.
Die Konsole spuckt mir dann folgendes aus:
Hoffe jemand von euch versteht mein Problem und kann mir dabei helfen! Vielen Dank schonmal im Voraus! :thumbs1: