K_Media hat geschrieben: ↑07.05.2024, 19:39
wäre toll...
Also hier mal ein Ansatz zum ausprobieren. Ich persönlich nutzte das so nicht, da zumindest im NEO Server das Aktualisierungsintervall nur auf min. 10 Sekunden gesetzt werden kann. Daher werden bei mir persönlich Zeiten aus NEO über IP-Symcon geregelt, das den Wert aus NEO entgegen nimmt, da geht das auf die Millisekunde genau auszuführen.
Wenn Du mit 10 Sekunden max. Versatz leben kannst bei Deiner Spülmaschine, hier das vorgehen zum Testen.
Den NEO Server auf der HmIP-CCU3 aktivieren und entsprechend der Dokumentation im AIO CREATOR NEO im Gerätemanager einrichten. Den Testmodus aktivieren um den Menü Punkt
NEO Automation Manager... eingeblendet zu bekommen.
Im NEO Server der HmIP-CCU3 dann ein neues Skript anlegen, das Dir die Variablen ausliest und diese mit der aktuellen Uhrzeit vergleicht. Dieses Skript wird dann alle 10 Sekunden von einem Task ausgeführt.
Hier eine Vorlage zum bearbeiten:
Code: Alles auswählen
let actionExecuted = false; // Globale Variable, um den Status der Aktion zu verfolgen
let lastExecutionDate = null; // Variable zur Speicherung des Datums des letzten Ausführungszeitpunkts
// Funktion zur Überprüfung und Ausführung der Aktion
function checkAndExecuteAction(targetTimestamp) {
const currentDate = new Date();
const currentDay = currentDate.getDate();
// Überprüfen, ob der aktuelle Tag anders als der Tag des letzten Ausführungszeitpunkts ist
if (!lastExecutionDate || lastExecutionDate.getDate() !== currentDay) {
// Zurücksetzen der actionExecuted-Variable und Aktualisieren des letzten Ausführungszeitpunkts
actionExecuted = false;
lastExecutionDate = currentDate;
}
// Überprüfen und Ausführen der Aktion, falls noch nicht ausgeführt und Bedingung erfüllt
if (!actionExecuted && compareTimestamps(targetTimestamp)) {
// Hier den Code zum Schalten des Geräts einfügen
console.log("Gerät wird geschaltet!");
// Aktion ausführen
actionExecuted = true; // Setze den Status auf true, um anzuzeigen, dass die Aktion bereits ausgeführt wurde
} else {
console.log("Es ist noch nicht Zeit, das Gerät zu schalten.");
}
}
// Funktion zur Berechnung des Unix-Timestamps aus Stunden und Minuten
function calculateTimestamp(hours, minutes) {
const now = new Date();
const targetDate = new Date(
now.getFullYear(),
now.getMonth(),
now.getDate(),
hours,
minutes,
0,
0
);
return targetDate.getTime() / 1000; // Teile durch 1000, um Millisekunden in Sekunden umzuwandeln
}
// Funktion zum Vergleich des aktuellen Zeitstempels mit dem Zielzeitstempel
function compareTimestamps(targetTimestamp) {
const currentTimestamp = Math.floor(Date.now() / 1000); // Aktueller Unix-Zeitstempel in Sekunden
console.log("Aktueller Timestamp");
console.log(currentTimestamp);
// Zeitzone setzen
const timezoneOffset = new Date().getTimezoneOffset(); // Zeitunterschied zur UTC in Minuten
const timezoneOffsetMilliseconds = -timezoneOffset * 60 * 1000; // Umrechnung in Millisekunden und Umkehrung des Vorzeichens
const currentTimestampWithTimezone = currentTimestamp * 1000 + timezoneOffsetMilliseconds;
// Konvertierung in Stunden und Minuten unter Berücksichtigung der Zeitzone
const dateObj = new Date(currentTimestampWithTimezone);
const hours = dateObj.getHours();
const minutes = dateObj.getMinutes();
console.log("Aktuelles Datum und Uhrzeit:");
console.log(`Stunden: ${hours}`);
console.log(`Minuten: ${minutes}`);
return currentTimestampWithTimezone >= targetTimestamp;
}
// Variable Stunde auslesen
getDeviceStatus(
"NEO Server CCU3",
"Uhrzeit Stunde",
{"value":"state","extMeta":"-2147483648-2147483647"},
function(err, targetHours) {
if (err) {
console.error(err.message);
return;
}
console.log(targetHours);
// Variable Minute auslesen
getDeviceStatus(
"NEO Server CCU3",
"Uhrzeit Minuten",
{"value":"state","extMeta":"-2147483648-2147483647"},
function(err, targetMinutes) {
if (err) {
console.error(err.message);
return;
}
console.log(targetMinutes);
// Berechnung des Zielzeitstempels
const targetTimestamp = calculateTimestamp(targetHours, targetMinutes);
console.log("Gesetzter Timestamp");
console.log(targetTimestamp);
// Überprüfen und Ausführen der Aktion
checkAndExecuteAction(targetTimestamp);
}
);
}
);
Sollte die aktuelle Uhrzeit später sein, als Deine eingestellte Uhrzeit, wird das Gerät eingeschaltet, ansonsten eben nicht. Zusätzlich brauchst Du noch zwei weitere Variablen um festzulegen, dass die Spülmaschine nur ein einziges mal geschaltet wird, wenn die Bedingung das erste mal zutrifft. Du kannst das mit globalen Variablen ausprobieren, ich weis aber ehrlich gesagt nicht, ob das auch funktioniert, da ich das selber wie gesagt so nicht nutze. Falls das mit globalen Variablen nicht funktionieren sollte, müsstest Du Dir eben zwei Variablen auf dem NEO Server anlegen, eine vom Typ Boolesche Variable (actionExecuted) und eine vom Typ Integer (lastExecutionDate) und diese statt den globalen Variablen nutzen bzw. beschreiben.
Bei
// Aktion ausführen musst Du noch mit
Aktion einfügen
- Aktion einfügen.png (9.17 KiB) 175 mal betrachtet
den Code für das einschalten der Spülmaschine ergänzen.
Nachdem Du das Skript geprüft hast, erstellst Du Dir dann einen Task, der das Skript alle 10 Sekunden ausführt
- Skript Intervall.png (13.9 KiB) 175 mal betrachtet
Wenn das so weit funktioniert, nicht vergessen anschließend den Testmodus wieder auszuschalten, es sei denn Du besitzt eine Lizenz für den NEO Automation Manager, der Task sollte dann selbstständig im Hintergrund laufen. Vielleicht solltest Du auch noch eine weitere Variable ergänzen und prüfen mit der Du das manuell ausschalten kannst. Es soll ja auch Zeiträume geben, in denen Du eben nicht willst das die Spülmaschine automatisch startet, wie bei Abwesenheit bzw. im Urlaub.