Variable Zeitsteuerung

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Fonzo
Beiträge: 6812
Registriert: 22.05.2012, 08:40
System: CCU
Hat sich bedankt: 25 Mal
Danksagung erhalten: 497 Mal

Re: Variable Zeitsteuerung

Beitrag von Fonzo » 07.05.2024, 19:36

K_Media hat geschrieben:
07.05.2024, 19:27
wie kann ich aus drei verschiedenen Systemvariablen (Stunde/Minute/Sekunde) die via Slider in Mediola erstellt wurden
eine generieren im cuxd relevantem format hh:mm:ss
Kann ich Dir zumindest nicht beantworten, da ich persönlich auch kein CuxD installiert habe und daher dies auch nicht benutze.

Ich würde so was wenn alternativ mit einem Javascipt lösen, das Dir wie gesagt aus Stunde/Minute/Sekunden in einen Unix Timestamp umrechnet, diesen kannst Du dann einfach mit der aktuellen Uhrzeit vergleichen.

Ich habe gerade kein Rechner vor mir, daher kann ich das selber nicht testen. Wenn ich Zeit finde kann ich Dir später mal ein Code zum anpassen posten.

K_Media
Beiträge: 304
Registriert: 18.05.2013, 19:42
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Variable Zeitsteuerung

Beitrag von K_Media » 07.05.2024, 19:39

wäre toll...
schöne Grüße aus dem Bergischen.....

CCU3mit FHZ 2000 , Homeputer Studio 4 CL, Mediola Gateway V2. und jede Menge HM Aktoren und Sensoren

Fonzo
Beiträge: 6812
Registriert: 22.05.2012, 08:40
System: CCU
Hat sich bedankt: 25 Mal
Danksagung erhalten: 497 Mal

Re: Variable Zeitsteuerung

Beitrag von Fonzo » 07.05.2024, 21:49

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
Aktion einfügen.png (9.17 KiB) 173 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
Skript Intervall.png (13.9 KiB) 173 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.

K_Media
Beiträge: 304
Registriert: 18.05.2013, 19:42
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Variable Zeitsteuerung

Beitrag von K_Media » 07.05.2024, 22:52

Vielen Dank.. aber leider nicht das was ich möchte. Ist viel zu komplex

Die Spühlmaschine wird gestartet, sobald unsere PV Anlage anfängt Strom ins Stromnetz einzuspeist, also wenn die Akkus geladen sind.
um diese Energie sinnvoller zu nutzen starte ich dann im vorfeld festgelegte Geräte (Spühlmaschine/Waschmaschine …)
Mein Gedanke war eine Uhrzeit zu generieren, zu der das Gerät dann trotzdem startet obwohl kein Strom eigespeist wird.

Da das einstellen der Uhrzeit scheinbar zu komplex ist, werde ich es mit einer fixen Uhrzeit lösen.
Also, wenn Gerät his zB. 15 Uhr nicht an dann starten.

Die Lösung mit einer Zeiteinstellung wäre natürlich viel cooler

Wenn also jemand eine Idee hat, wie ich aus drei Variable eine neue schreiben kann, gerne die Info dazu

Ansonsten vielen Dank an alle, die bisher versucht haben zu helfen..
schöne Grüße aus dem Bergischen.....

CCU3mit FHZ 2000 , Homeputer Studio 4 CL, Mediola Gateway V2. und jede Menge HM Aktoren und Sensoren

Fonzo
Beiträge: 6812
Registriert: 22.05.2012, 08:40
System: CCU
Hat sich bedankt: 25 Mal
Danksagung erhalten: 497 Mal

Re: Variable Zeitsteuerung

Beitrag von Fonzo » 07.05.2024, 23:09

K_Media hat geschrieben:
07.05.2024, 22:52
Die Spühlmaschine wird gestartet, sobald unsere PV Anlage anfängt Strom ins Stromnetz einzuspeist, also wenn die Akkus geladen sind.
Das ist aber auch nicht einfach zu automatisieren. Du bist dann zumindest immer darauf angewiesen die Spülmaschine ständig zu beladen und nutzt das saubere Geschirr nicht dann, wenn Du das unbedingt brauchst. Den Strom einer PV Anlage kann man an sich, wenn vorhanden, auch sinnvoller gebrauchen z.B. zum aufladen eines E Autos.
K_Media hat geschrieben:
07.05.2024, 22:52
um diese Energie sinnvoller zu nutzen starte ich dann im vorfeld festgelegte Geräte (Spühlmaschine/Waschmaschine …)
Abhängig davon was Du denn nun genau verbaut hast und was die Geräte verbrauchen, macht so was eigentlich ein zertifiziertes EMS (Energie Management System) in Kombination mit dem SMGW (Smart Meter Gateway).
K_Media hat geschrieben:
07.05.2024, 22:52
Mein Gedanke war eine Uhrzeit zu generieren, zu der das Gerät dann trotzdem startet obwohl kein Strom eigespeist wird.
Generieren wäre aber zumindest dies einfach automatisch von einem System zu erstellen und das Gegenteil davon das manuell in einer Visualisierung eingeben zu müssen.

K_Media
Beiträge: 304
Registriert: 18.05.2013, 19:42
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Variable Zeitsteuerung

Beitrag von K_Media » 08.05.2024, 08:43

Na ja, alles ausser die Uhrzeit vorzugeben ist einfach und funktioniert auch schon für alle Geräte…

Auf der CCU ist eine Variable (Spühlmaschine PV start)
diese wird mit einem Schalter in Mediola auf wahr oder falsch gesetzt(an/aus).

Das Gerät HmIP ESI überwacht den Stromzähler. Wenn der Verbrauch am Stromzähler kleiner 0Watt ist, wird ein Programm auf der CCU
ausfelöst. Dieses prüft, ob die Sys Variable auf an oder aus ist.

Wenn diese auf an ist, dann schaltet das Programm einen virtuellen Cuxd Schalter auf an. Dieser ist dann der Trigger für iobroker.
Dort wird dann ein Blockly Skript gestartet, welches meine zb. Spühlmaschine (Miele) einschaltet, das Programm auswählt und startet.

Dies läuft also nur durch, wenn ich es möchte und nicht immer…..
Außerdem kann ich so wählen, was eingeschaltet werden soll (Spühlmaschine/Waschmaschine/laden E-Auto, usw…)
schöne Grüße aus dem Bergischen.....

CCU3mit FHZ 2000 , Homeputer Studio 4 CL, Mediola Gateway V2. und jede Menge HM Aktoren und Sensoren

Fonzo
Beiträge: 6812
Registriert: 22.05.2012, 08:40
System: CCU
Hat sich bedankt: 25 Mal
Danksagung erhalten: 497 Mal

Re: Variable Zeitsteuerung

Beitrag von Fonzo » 08.05.2024, 17:14

K_Media hat geschrieben:
08.05.2024, 08:43
Na ja, alles ausser die Uhrzeit vorzugeben ist einfach und funktioniert auch schon für alle Geräte…
Grundsätzlich ist auch das einstellen einer Startzeit für ein Event einfach, das hängt eben von dem System ab, an das man den Wert aus NEO übergibt.
Da ich die Möglichkeiten von Deinem genutzten Homeputer CL Studio persönlich nicht kenne, musst Du halt mal prüfen, was mit dem System grundsätzlich an Timern / Events in Kombination mit Homematic IP möglich ist.

Ich habe das Vorgehen bei mir so umgesetzt, es gibt ein Gerät mit einer Variable Stunde, Minute, Sekunde im Gerätemanager. Die Variablen habe ich jeweils einem Textfeld zugeordnet, über dem Textfeld liegt ein transparenter Button, der jeweils ein Popup zur Einstellung öffnet. Im Popup Fenster gibt es dann einen Slider neben dem angezeigten Wert um diesen zu ändern.

In meinem Zielsystem prüfe ich dann lediglich auf Variablenänderung dieser drei Variablen des Geräts, sollte sich eine Variable geändert haben, wird eine neue Event Startzeit gesetzt. Zusätzlich habe ich noch eine Variable vom Typ Bool um den Timer bei Bedarf ganz ausschalten zu können.

Das Event dann zu aktualisieren ist bei meinem benutzten System nur ein paar Zeilen um die Variablen, die aus NEO verändert wurden, auszulesen und dann die Startzeit zu setzen.

Code: Alles auswählen

<?php

$hour = GetValue(34069);
$minute = GetValue(14276);
$seconds = GetValue(36456);

// Timer setzten
//Als Startzeit dem Ereignis zuordnen
IPS_SetEventCyclicTimeFrom(47926, $hour, $minute, $seconds);
Kannst ja mal bei Deinem benutzten Homeputer CL Studio prüfen, ob es nicht einfach eine ähnliche Funktion gibt, um bei Variablenänderung einfach ein Event zu setzen.

K_Media
Beiträge: 304
Registriert: 18.05.2013, 19:42
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Variable Zeitsteuerung

Beitrag von K_Media » 08.05.2024, 17:24

Homeputer nutze ich in dieser Steuerung nicht. Das Programm ist eher ein Rlikt alter Zeiten😊
schöne Grüße aus dem Bergischen.....

CCU3mit FHZ 2000 , Homeputer Studio 4 CL, Mediola Gateway V2. und jede Menge HM Aktoren und Sensoren

Fonzo
Beiträge: 6812
Registriert: 22.05.2012, 08:40
System: CCU
Hat sich bedankt: 25 Mal
Danksagung erhalten: 497 Mal

Re: Variable Zeitsteuerung

Beitrag von Fonzo » 08.05.2024, 17:30

K_Media hat geschrieben:
08.05.2024, 17:24
Homeputer nutze ich in dieser Steuerung nicht. Das Programm ist eher ein Rlikt alter Zeiten😊
Wenn Du zusätzlich auch noch ioBroker benutzt, dann schaue halt mal ob das nicht auf dem Weg auch zu lösen geht. Du musst ja nur die Datenpunkte Stunde, Minute, Sekunden von einem Gerät aus NEO aktualisieren. Sobald sich eine dieser Variablen geändert hat, muss dann halt automatisch ein Timer / Event gesetzt werden, der letztlich die Spülmaschine zu der eingestellten Zeit einschaltet.

Benutzeravatar
Black
Beiträge: 5520
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 430 Mal
Danksagung erhalten: 1093 Mal
Kontaktdaten:

Re: Variable Zeitsteuerung

Beitrag von Black » 08.05.2024, 17:54

Startzeitpunkt zusammenzubauen in IOB ist keine Rakenwissenschaft.

Ich benutze derartige über Vis einstellbare Events bei mir auch, da brauche ich natürlich nicht den Umweg über eine oder mehrere CCU Sysvars gehen, sonden schreibe in vis direkt auf freie Variablen in 0_userdata.0.xxx

Ansatz wäre dann folgender:

Code: Alles auswählen

var vHour= 'NameStundenVariablen'
var vMinute='Nameder Minutenvariablen'
var vSekunde= 'namederSekundenvariablen'

on ({"id": [vHour,vMinute,vSekunde], "change": 'ne'}, function(obj) {
  // Hier Zusammenführen der des benötigeten Variablenstrings
  // Und setzen bzw Aufrufen des Timer Blocklys
})
Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“