NEWS
Warteschlange für das senden von 433mhz Codes
-
Hallo Zusammen,
ich habe drei 433mhz Steckdosen im Einsatz.
Das schalten dieser Steckdosen funktioniert übern einen RaspberryPi.
Dort setzte ich einen Befehl via SSH ab der über einen Sender den jeweiligen Code verschickt.
Nun kommt mein Problem.
Für die Steckdosen habe ich jeweils einen State im angelegt.
bei True wird der Code für "Einschalten" gesendet und bei False für "ausschalten".Wen ich alle drei Steckdosen gleichzeitig schalte, zum Beispiel weil eine Szene schaltet, funktioniert das ganze nicht da der Raspberry nicht alle drei Codes gleichzeitig senden kann.
Hier müsste ich eine Art Warteschlange bauen damit die Codes nacheinander abgearbeitet werden.
Ich habe bereits eine Lösung implementiert die zwar funktioniert aber extrem unsauber ist.
Hier wird einfach alle 3 Sekunden abgefragt ob der Zustand einer Steckdose sich in den letzten 10 Sekunden geändert hat und wenn ja wird der Code versendet.
Wenn sich mehrere geändert haben gibt es einen Timeout von einer Sekunde.Das Problem dabei ist natürlich, das der Code völlig unnötig alle 3 Sekunden getriggert wird.
Es muss doch eine elegantere Lösung geben.
Weiß jemand was?Danke und Gruß
T//************************ Schedules ********************* //Prüft alle 3 Sekunden ob sich der Zustand einer 433Mhz Steckdose in den letzten 10 Sekunden geändert hat. //Wenn ja wird der Befehl zum schalten der Steckdose gesendet //Wenn sich mehrere geändert haben wird ein Timeout gesetzt. schedule("*/3 * * * * *", function () { var Plugs = ['OwnDevices.0.433mhzPlugs.10011.PlugA', 'OwnDevices.0.433mhzPlugs.10011.PlugB', 'OwnDevices.0.433mhzPlugs.10011.PlugC']; var Timeout = 0; Plugs.forEach(function (plugId) { var PlugLastChange = getState(plugId).lc; var actualTime = new Date().getTime(); var PossibleTime = toInt(PlugLastChange) + 20000; //10 Sekunden if (actualTime < PossibleTime) { var PlugState = getState(plugId).val; setTimeout(function () { SendCommand(plugId, PlugState); }, Timeout); Timeout += 1000; }; }); }); //************************ Schedules ********************* //************************ Functions ********************* //Sendet perr SSH den Befehl zum Schalten der 433mhz Steckdosen function SendCommand(plugId, state) { var ssh = 'ssh pi@***.***.***.*** -p **** "'; var path = '/home/pi/programs/433Utils/RPi_utils/./codesend '; if (state) { var Code = getState(plugId + '.CodeOn').val; } else { var Code = getState(plugId + '.CodeOff').val; }; var command = ssh + path + Code + '"'; exec(command); }; //************************ Functions *********************
-
@DerT du könntest mit einer queue arbeiten .. oder du erzeugst dir ein wait
https://www.heise.de/tipps-tricks/JavaScript-Sleep-und-setTimeout-4060840.htmloder
function sleep(milliseconds) { var start = new Date().getTime(); for (var i = 0; i < 1e7; i++) { if ((new Date().getTime() - start) > milliseconds){ break; } } }
von hier https://stackoverflow.com/questions/16873323/javascript-sleep-wait-before-continuing/16873849
-
Ich würde eine Variable setzen wenn gesendet wird.
Am Anfang der function dann überprüfen ob gesendet wird = true? Wenn ja -> in 3 Sekunden noch mal probieren && return.
Wenn nein -> fortfahren..Gruß