[GELÖST] CUxD - Übergabe Systemzustand mit der WebUI

Anbindung von FS20-Komponenten, ELV-Wetterstationen, EnOcean und DMX an HomeMatic

Moderator: Co-Administratoren

wolwin
Beiträge: 350
Registriert: 06.06.2018, 12:27
Hat sich bedankt: 22 Mal
Danksagung erhalten: 64 Mal

[GELÖST] CUxD - Übergabe Systemzustand mit der WebUI

Beitrag von wolwin » 16.07.2026, 15:21

Hallo zusamen,
mit CUxD 2.13 und aktueller OCCU 3.87.6.20260614 ist mir folgendes aufgefallen:

Über einen CUxD Timer starte ich ein Skript, das aus einem Textstring die Zeiten der HT / NT Tarif-Stromumschaltungen und den Tarif ausliest und dann als Systemvariablen für andere Zwecke bereitstellt. Hier wird dann auch der Zeitpunkt als String für den CUxD-Timer in der Systemvariablen 'sys_TStrom_Tarif_Timer' abgespeichert. Wenn ich nun den CUxD-Timer in der WebUI wie im Snapshot gezeigt zuweise und dabei die Systemvariable benutze, wird der Timer NICHT gesetzt.

Clipboard_01.jpg

Setze ich den CUxD-Timer direkt im Skript, funktioniert alles wie es soll: der Timer wird gesetzt.

Clipboard_02.jpg

Ich kann jetzt nicht ausmachen, wo sich der Fehler befindet ... Ich benutze zwar nun die zweite Variante, aber es würde mich interessieren, ob da eine Fehler beim Zusammenwirken CUxD / OCCU besteht, oder, ob ich etwas falsch aufgesetzt habe.
Zuletzt geändert von wolwin am 17.07.2026, 12:29, insgesamt 1-mal geändert.


Benutzeravatar
MichaelN
Beiträge: 13170
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 876 Mal
Danksagung erhalten: 2266 Mal

Re: CUxD - Übergabe Systemzustand mit der WebUI

Beitrag von MichaelN » 16.07.2026, 16:00

und geht es ohne Verzögerung?

wolwin
Beiträge: 350
Registriert: 06.06.2018, 12:27
Hat sich bedankt: 22 Mal
Danksagung erhalten: 64 Mal

Re: CUxD - Übergabe Systemzustand mit der WebUI

Beitrag von wolwin » 16.07.2026, 17:25

Baxxy hat geschrieben: ↑
16.07.2026, 15:39
Meine erste Frage wäre: Ging das früher mal, und wenn ja mit welchen Versionen?
Habe das erst neu aufgesetzt und lange debugged, da die Werteübergabe über Systemvariablen bei anderen Skripten funktioniert.
MichaelN hat geschrieben: ↑
16.07.2026, 16:00
und geht es ohne Verzögerung?
Habe ich nicht getestet - hatte vorher 1 Sekunde eingestellt, um sicher zu gehen, dass die Systemvariable im Skript gesetzt wurde.

Benutzeravatar
Baxxy
Beiträge: 15079
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Berlin
Hat sich bedankt: 972 Mal
Danksagung erhalten: 3449 Mal

Re: CUxD - Übergabe Systemzustand mit der WebUI

Beitrag von Baxxy » 16.07.2026, 18:17

Nicht sehr aufschlussreich. :roll:

Ich kann das erstmal nicht reproduzieren.
Eine Text-SysVar gefüllt mit...

Code: Alles auswählen

20:00:00
...wird hier problemlos in einen CUxD-Timer geschrieben.
RM_CUxD_Timer_mit_Text_SysVar.JPG

wolwin
Beiträge: 350
Registriert: 06.06.2018, 12:27
Hat sich bedankt: 22 Mal
Danksagung erhalten: 64 Mal

Re: CUxD - Übergabe Systemzustand mit der WebUI

Beitrag von wolwin » 16.07.2026, 19:57

Baxxy hat geschrieben: ↑
16.07.2026, 18:17
Nicht sehr aufschlussreich. :roll:
Siehe ersten Snapshot :mrgreen: ... das Ganze nach einem TiMER_GET <= 0 Sprung in das Skript - dort wird der nächste Zeitpunkt eines Timer-Events in die Systemvariable geschrieben - dann Rücksprung aus dem Skript - Timer setzen mit Systemvariable

Benutzeravatar
MichaelN
Beiträge: 13170
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 876 Mal
Danksagung erhalten: 2266 Mal

Re: CUxD - Übergabe Systemzustand mit der WebUI

Beitrag von MichaelN » 16.07.2026, 20:05

liegt vermutlich am rest des Skriptes. Bitte als Code </> einfügen!

Benutzeravatar
Baxxy
Beiträge: 15079
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Berlin
Hat sich bedankt: 972 Mal
Danksagung erhalten: 3449 Mal

Re: CUxD - Übergabe Systemzustand mit der WebUI

Beitrag von Baxxy » 16.07.2026, 20:12

wolwin hat geschrieben: ↑
16.07.2026, 19:57
Siehe ersten Snapshot
Was du vorhast und wie es umgesetzt ist, ist mir schon klar.
Und die üblichen Debugging-Tipps sind dir auch gebräuchlich würde ich sagen.

- Triggert das Programm überhaupt durch den Timer?
- wie sieht es aus wenn du das Programm händisch (nur 1. dann) ausführst?
- was passiert wenn du die SysVar über die WebUI (statt mit dem unbekannten Script) beschreibst
- usw.

wolwin
Beiträge: 350
Registriert: 06.06.2018, 12:27
Hat sich bedankt: 22 Mal
Danksagung erhalten: 64 Mal

Re: CUxD - Übergabe Systemzustand mit der WebUI

Beitrag von wolwin » 17.07.2026, 11:23

Baxxy hat geschrieben: ↑
16.07.2026, 20:12
Und die üblichen Debugging-Tipps sind dir auch gebräuchlich würde ich sagen.
Yep ... 8)

Also hier das benutzte Skript - es stammt aus meinem globalen Energieskript (Strom, Gas, Wasser), in dem die NT / HT Umschaltung bei jedem Stromzähler Event abgefragt wird - daher die vielleicht umständlich erscheinenden Namenskonventionen.

Es werden folgende Systemvariablen (Text) benötigt (das Feiertagsskript muss nicht installiert sein):

Code: Alles auswählen

sKosten_Tarif_Flag = "sys_TStrom_Tarif_Flag";
sKosten_Tarif_Zeiten = "sys_TStrom_Tarif_Zeiten";
sKosten_Tarif_Timer = "sys_TStrom_Tarif_Timer";
sKosten_Tarif_Debug = "sys_TStrom_Tarif_Debug";
In 'sKosten_Tarif_Zeiten' sind die Schaltzeiten abgelegt:

Code: Alles auswählen

00:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT
Clipboard_07-17-2026_01.jpg
In 'sKosten_Tarif_Timer' wird die nächste Timer Umschaltzeit abgelegt - in 'sys_TStrom_Tarif_Debug' werden die Debug-Ausgaben des Scripts eingetragen und über das Systemprotokoll geloggt.

Hier das Test-Skript ...

Code: Alles auswählen

! Vorsatzbezeichnung für die Systemvariablen-Namen der Zähler aus der Geräteliste
! Beispiel 1: 'xxxxYYYY_Verbrauch_aktuell' mit xxxx = 'sys_' und YYYYY = 'Gas'
!             zu 'sys_ZS-Gas_Verbrauch_aktuell'
! Beispiel 2: 'xxxxYYYY_Verbrauch_aktuell' mit xxxx = '' und YYYYY = 'Gas'
!             zu 'ZS-Gas_Verbrauch_aktuell'
! string preSysVar = "";
string preSysVar = "sys_";

! Global - Feiertag-Script - Feiertag-Systemvariable
! Bei Auswertung eines Tarifstrom-Zählers wird die Installation des Feiertags-Script benötigt
! https://homematic-forum.de/forum/viewtopic.php?f=31&t=4058&hilit=feiertags#p23994
! string sFeiertag_Heute = "Feiertag-Heute";  ! Original-Bezeichnung im Feiertag-Script
!
! string sFeiertag_Heute = "Feiertag-Heute";
string sFeiertag_Heute = preSysVar # "Feiertag-Heute";
object oFeiertag_Heute = null;

! ==========================================
! === Ab hier keine Änderungen vornehmen ===
! ==========================================

! Typ-Definition der Zähler - !!! nicht ändern !!!
string type_gas = "Gas";           ! Gas-Zähler
string type_strom = "Strom";       ! Strom-Zähler
string type_tstrom = "TStrom";     ! Tarifstrom-Zähler
string type_wasser = "Wasser";     ! Wasser-Zähler

! Aus dem Namen des Zähler-Sensors wird der Typ ermittelt. Ein Device muss also
! immer am Ende des Namens einen Seperator (z.B.: 'ZS-') gefolgt von dem Typ
! (z.B.: 'Gas' oder 'GasXYZ') enthalten, der sich in der Liste 'types' befindet.
! Beispiel 1: "XXXXX_ZS-Gas" oder "XXXXXX_ZS-WasserG" mit 'namesSep="_ZS-"' als Trenner
! Beispiel 2: "XXXXX-Gas" oder "XXXXXX-WasserG" mit 'namesSep="-"' als Trenner
! string nameSep = "ZS-";
string nameSep = "";

! Allgemeine Kennzeichnung Zähler-Sensor
preSysVar = preSysVar # nameSep;

! Listen-Trennzeichen
string sTvar = "|";
string sTbez = ",";
string sTsem = ";";
string sHT = "HT";
string sNT = "NT";
real   vWNull = 0.0;

! sys_ZS-TStrom_Tarif_Flag
! Werteliste HT;NT
! sys_ZS-TStrom_Tarif_Zeiten
! Zeichenkette
! 00:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT

string sKosten_Tarif_Flag = "_Tarif_Flag";
string sKosten_Tarif_Zeiten = "_Tarif_Zeiten";
string sKosten_Tarif_Timer = "_Tarif_Timer";
string sKosten_Tarif_Debug = "_Tarif_Debug";

! string sKosten_Tarif_Flag = "sys_TStrom_Tarif_Flag";
! string sKosten_Tarif_Zeiten = "sys_TStrom_Tarif_Zeiten";
! string sKosten_Tarif_Timer = "sys_TStrom_Tarif_Timer";
! string sKosten_Tarif_Debug = "sys_TStrom_Tarif_Debug";

object oKosten_Tarif_Zeiten = null;
object oKosten_Tarif_Flag = null;
object oKosten_Tarif_Timer = null;
object oKosten_Tarif_Debug = null;

! dom.GetObject("_sys_Debug").State(counter # " - " # system.Date("%H:%M:%S"));
! Objekt Systemvariablen
object sysvar = dom.GetObject(ID_SYSTEM_VARIABLES);


string sCUXD_Timer_TarifStrom = "CUxD.CUX2800001:4";


! TStrom Tarif-Zeiten für HT oder NT
! sys_ZS-TStrom_Tarif_Zeiten 
! Zeiten Feiertag|Zeiten Montag|Zeiten Dienstag|Zeiten Mittwoch|Zeiten Donnerstag|Zeiten Freitag|Zeiten Samstag|Zeiten Sonntag
! 00:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT ; 06:00,HT ; 20:00,NT|00:00,NT

! Anmerkung: Die Zeiten müssen aufsteigend angeordnet werden.

! string sTFt = "00:00,NT";
! string sTMo = "00:00,NT ; 06:00,HT ; 20:00,NT";
! string sTDi = "00:00,NT ; 06:00,HT ; 20:00,NT";
! string sTMi = "00:00,NT ; 06:00,HT ; 20:00,NT";
! string sTDo = "00:00,NT ; 06:00,HT ; 14:53,NT ; 14:55,HT ; 20:00,NT";
! string sTFr = "00:00,NT ; 06:00,HT ; 20:00,NT";
! string sTSa = "00:00,NT ; 06:00,HT ; 20:00,NT";
! string sTSo = "00:00,NT";
! string sTAl = sTFt # "|" # sTMo # "|" # sTDi # "|" # sTMi # "|" # sTDo # "|" # sTFr # "|" # sTSa # "|" #sTSo;
! WriteLine(sTAl);


            ! Für den Tarifstrom den aktuellen HT- oder NT-Tarif ermitteln
            oKosten_Tarif_Flag = sysvar.Get(preSysVar # type_tstrom # sKosten_Tarif_Flag);
            oKosten_Tarif_Zeiten = sysvar.Get(preSysVar # type_tstrom # sKosten_Tarif_Zeiten);
            oKosten_Tarif_Timer = sysvar.Get(preSysVar # type_tstrom # sKosten_Tarif_Timer);
            oKosten_Tarif_Debug = sysvar.Get(preSysVar # type_tstrom # sKosten_Tarif_Debug);

! oKosten_Tarif_Zeiten.State(sTAl);
oKosten_Tarif_Debug.State("");

            if (oKosten_Tarif_Flag && oKosten_Tarif_Zeiten && oKosten_Tarif_Timer) {
              
              ! ---
              ! Aktuelle Tarif-Zeiten auslesen und aktuelle Tarif-Einstellung HT oder NT setzen
              ! ---

              !  Test, ob Feiertag
              boolean bFeiertag = false;
              oFeiertag_Heute = sysvar.Get(sFeiertag_Heute);
              if (oFeiertag_Heute) {
                if (oFeiertag_Heute.Value()) {
                  bFeiertag = true;
                }
              }

              ! Aktuelle Tages-Tarif Zeile einlesen
              string sTarifTag;
              integer iTag = 0;
              integer iDT_Tag = system.Date("%u");
              foreach(sTarifTag, oKosten_Tarif_Zeiten.Value().Split(sTvar)) {
                sTarifTag = sTarifTag.Trim();
                ! Test, ob Feiertag ist
                if (bFeiertag && (iTag == 0)) { break; }
                ! Test, ob Listeneintrag der aktuelle Wochentag ist
                if (iDT_Tag == iTag) { break; }
                iTag = iTag + 1;
              }

              ! Aktuellen Tages-Zeit-Tarif einlesen
              string sTarifEintrag;
              string sTarifZeit;
              string sTarifTarif;
              string sTarifTimer = "00:02:00";
              ! 1 Minute nach Timer für Feiertagsberechnung um 00:01:00
              integer iTarifAktuell = 0;
              string sDT_HM = system.Date("%H:%M");
              
              ! WriteLine(sDT_HM);
              
              foreach(sTarifEintrag, sTarifTag.Split(sTsem)) {
                sTarifEintrag = sTarifEintrag.Trim();
                sTarifZeit = sTarifEintrag.StrValueByIndex(sTbez, 0).Trim();
                sTarifTarif = sTarifEintrag.StrValueByIndex(sTbez, 1).Trim().ToUpper();
                
                ! WriteLine(sTarifEintrag);
                ! WriteLine(sTarifZeit);
                ! WriteLine(sTarifTarif);
                
oKosten_Tarif_Debug.State(sDT_HM # " => " # sTarifEintrag # " => " # sTarifZeit # " - " # sTarifTarif);
                
                if ( sDT_HM >= sTarifZeit ) {
                  if (sTarifTarif == sNT) {
                    iTarifAktuell = 1;
                  } else {
                    iTarifAktuell = 0;
                  }
                } else {
                  sTarifTimer = sTarifZeit # ":00";
                  break;
                }

              }

              ! WriteLine("=> " # iTarifAktuell);
              ! WriteLine("=> " # sTarifTimer);

oKosten_Tarif_Debug.State(sDT_HM # " => " # sTarifEintrag # " => " # sTarifZeit # " - " # sTarifTarif # " => " # iTarifAktuell # " " # sTarifTimer);
              
              ! Ermittelte aktuelle Tarif-Einstellung HT oder NT setzen
              oKosten_Tarif_Flag.State(iTarifAktuell);

              ! Timer-Wert für nächste Timer-Abfrage setzen
              oKosten_Tarif_Timer.State(sTarifTimer);

              ! --- Timer setzen ---
              ! dom.GetObject(sCUXD_Timer_TarifStrom # ".TIMER_SET").State(sTarifTimer);
              dom.GetObject(sCUXD_Timer_TarifStrom # ".TIMER_SET").State(oKosten_Tarif_Timer.Value());


              ! ---
              ! ---
              
            }
Und hier das richtige Ergebnis, wenn ich den CUxD Timer direkt im Skript setze - verlagere ich das Setzen des Timerwertes wie beschrieben in die WebUI, findet keine Timer Auslösung statt. In der CUxD Oberfläche kann man sehen, dass der Timer nicht gesetzt wird.
Clipboard_07-17-2026_02.jpg

Benutzeravatar
Baxxy
Beiträge: 15079
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Berlin
Hat sich bedankt: 972 Mal
Danksagung erhalten: 3449 Mal

Re: CUxD - Übergabe Systemzustand mit der WebUI

Beitrag von Baxxy » 17.07.2026, 11:40

Sehr aufschlussreich. :)

Du änderst die SysVar mit der Timerzeit in der ersten Aktion des Programms ("Dann 1") per Script.
Danach zeitversetzt soll diese geänderte SysVar mit dem CUX-Timer synchronisiert werden ("Dann 2").

Bin ich erstmal überfragt und hab ich so auch noch nie probiert. Teste ich aber bei Gelegenheit mal.

Spekulation:
Die Änderung der Timer-SysVar wird während der Programm-Laufzeit nicht berücksichtigt und es wird der Wert benutzt der vor dem Start des Programms drin stand.

Könnte man testen.

Antworten

Zurück zu „CUxD“