Steuerung HM-CC-RT-DN

Programmierung der HomeMatic CCU mittels contronics homeputer CL

Moderator: Co-Administratoren

AFi
Beiträge: 166
Registriert: 14.12.2016, 20:44

Steuerung HM-CC-RT-DN

Beitrag von AFi » 27.12.2017, 12:16

Hi,

nachdem ich die Thermostate mit den integrierten Tabellen gesteuert habe und es immer wieder zu Problemen geführt hat (Neustart neu einpflegen bzw. Überschreibung der "online-Tabelle" durch die Grundtabelle aus dem Objekt), habe ich mich entschieden die Programmierung ähnlich auszuführen wie PeterM.

Anbei Oberfläche und Programmiercode für 3 Räume:
EinstellungZeiten.PNG
Es gibt hier die Möglichkeit jeden Wochentag zu definieren und die Urlaubseinstellung zu definieren, Urlaub wird per Schalterobjekt definiert.

Programmiercode:

Code: Alles auswählen

//! ============================================================
//! OBJEKT Makro_Heizung
//! ============================================================
//! OBJEKT-TYP              : Makro
//! BEZEICHNUNG             : Makro Heizung 5 min
//! STARTWERT               :
//! ------------------------------------------------------------
//! AUSFÜHRUNGSINTERVALL    : jede Minute
//! AUSFÜHRUNG BEI EINGABE  : nein
//! AUSFÜHRUNG BEI EMPFANG  : nein
//! AUSFÜHRUNG BEI ÄNDERUNG : nein
//! ------------------------------------------------------------
//! KONF.:7DAD7BCA5ADC3DDD7BAABA5A
//!
//! ============================================================
//! VARIABLENDEFINITIONEN
//! ============================================================
//! NAME                TYP                 STARTWERT
//! ------------------------------------------------------------
//! TemperaturSoll      Zahl                0,0
//! ZeitSoll            Zeichen
//! ZeitSollZeitFormat  Zeit
//! TagesString         Zeichen


//Makro Heizungssteuerung
//Wird gesteuert über die Eingabewerte des Fensters der Heizungssteuerung
//Mit der Urlaubseinstellung werden auch Feiertage erschlagen
//Thermostate sollten auf "manuell" stehen
//Temperatursturz muss ausgeschalten sein am Thermostat



//Grundeinstellungen einmal am Tag, falls jemand über Tage etwas verstellt
//Temperaturfestlegung ?
======================================================
Wenn Uhrzeit = "23:55:00" und A_010HeizungAnAus = 1 dann
	Thermo_EG_WZ_HZK_Garten.Zeittabelle ausschalten
	warte("00:00:05")
	Thermo_EG_WZ_HZK_Nachb.Zeittabelle ausschalten
	warte("00:00:05")
	Thermo_ELW_HZK_SchlZi.Zeittabelle ausschalten
	warte("00:00:05")
	Thermo_ELW_HZK_Bad.Zeittabelle ausschalten
	warte("00:00:05")
	SETZEWERT(Thermo_EG_WZ_HZK_Garten, "MANU_MODE", Anz_Heizst_Absenkung)
	warte("00:00:10")
	SETZEWERT(Thermo_EG_WZ_HZK_Nachb, "MANU_MODE", Anz_Heizst_Absenkung)
	warte("00:00:10")
	SETZEWERT(Thermo_ELW_HZK_SchlZi, "MANU_MODE", Anz_Heizst_Absenkung)
	warte("00:00:10")
	SETZEWERT(Thermo_ELW_HZK_Bad, "MANU_MODE", Anz_Heizst_Absenkung)
	warte("00:00:10")
EndeWenn

//============================================================
// WOHNZIMMER
// Urlaubseinstellung auslesen und einstellen
//============================================================

Wenn A_010HeizungAnAus = 1 und Virt_SchaZeitstHeizUrlaub = 1 und A_012AbsenkungHeizung = 0 dann

	//Step auf 0 zurückstellen
	Wenn Uhrzeit = "00:05:00" dann
		Anz_HeizstWZStep := 0
	EndeWenn

	//Erste Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstWZStep = 0 dann
		ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubWZ, 1, 5)
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubWZ, 7, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_EG_WZ_HZK_Garten := TemperaturSoll
			WARTE("00:00:05")
			Thermo_EG_WZ_HZK_Nachb := TemperaturSoll
			WARTE("00:00:05")
			Anz_HeizstWZStep := 1
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Zweite Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstWZStep = 1 dann
		ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubWZ, 12, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstWZStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubWZ, 18, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_EG_WZ_HZK_Garten := TemperaturSoll
			WARTE("00:00:05")
			Thermo_EG_WZ_HZK_Nachb := TemperaturSoll
			WARTE("00:00:05")
			Anz_HeizstWZStep := 2
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Dritte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstWZStep = 2 dann
		ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubWZ, 23, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstWZStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubWZ, 29, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_EG_WZ_HZK_Garten := TemperaturSoll
			WARTE("00:00:05")
			Thermo_EG_WZ_HZK_Nachb := TemperaturSoll
			WARTE("00:00:05")
			Anz_HeizstWZStep := 3
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Vierte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstWZStep = 3 dann
		ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubWZ, 34, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstWZStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubWZ, 40, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_EG_WZ_HZK_Garten := TemperaturSoll
			WARTE("00:00:05")
			Thermo_EG_WZ_HZK_Nachb := TemperaturSoll
			WARTE("00:00:05")
			Anz_HeizstWZStep := 4
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Fünfte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstWZStep = 4 dann
		ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubWZ, 45, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstWZStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubWZ, 51, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_EG_WZ_HZK_Garten := TemperaturSoll
			WARTE("00:00:05")
			Thermo_EG_WZ_HZK_Nachb := TemperaturSoll
			WARTE("00:00:05")
			Anz_HeizstWZStep := 5
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
EndeWenn

//============================================================
// WOHNZIMMER
// Tageseinstellung auslesen und einstellen
//============================================================

Wenn A_010HeizungAnAus = 1 und Virt_SchaZeitstHeizUrlaub = 0 und A_012AbsenkungHeizung = 0 dann
	//Step auf 0 zurückstellen
	Wenn Uhrzeit = "00:05:00" dann
		Anz_HeizstWZStep := 0
	EndeWenn
	//Zuordnung Tage
	Wenn Wochentag = "Montag" dann
		TagesString := Anz_Heizst_MontagWZ
	EndeWenn
	Wenn Wochentag = "Dienstag" dann
		TagesString := Anz_Heizst_DienstagWZ
	EndeWenn
	Wenn Wochentag = "Mittwoch" dann
		TagesString := Anz_Heizst_MittwochWZ
	EndeWenn
	Wenn Wochentag = "Donnerstag" dann
		TagesString := Anz_Heizst_DonnerstagWZ
	EndeWenn
	Wenn Wochentag = "Freitag" dann
		TagesString := Anz_Heizst_FreitagWZ
	EndeWenn
	Wenn Wochentag = "Samstag" dann
		TagesString := Anz_Heizst_SamstagWZ
	EndeWenn
	Wenn Wochentag = "Sonntag" dann
		TagesString := Anz_Heizst_SonntagWZ
	EndeWenn
	//Erste Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstWZStep = 0 dann
		ZeitSoll := TEXTTEIL(TagesString, 1, 5)
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(TagesString, 7, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_EG_WZ_HZK_Garten := TemperaturSoll
			WARTE("00:00:05")
			Thermo_EG_WZ_HZK_Nachb := TemperaturSoll
			WARTE("00:00:05")
			Anz_HeizstWZStep := 1
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Zweite Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstWZStep = 1 dann
		ZeitSoll := TEXTTEIL(TagesString, 12, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstWZStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(TagesString, 18, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_EG_WZ_HZK_Garten := TemperaturSoll
			WARTE("00:00:05")
			Thermo_EG_WZ_HZK_Nachb := TemperaturSoll
			WARTE("00:00:05")
			Anz_HeizstWZStep := 2
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Dritte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstWZStep = 2 dann
		ZeitSoll := TEXTTEIL(TagesString, 23, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstWZStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(TagesString, 29, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_EG_WZ_HZK_Garten := TemperaturSoll
			WARTE("00:00:05")
			Thermo_EG_WZ_HZK_Nachb := TemperaturSoll
			WARTE("00:00:05")
			Anz_HeizstWZStep := 3
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Vierte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstWZStep = 3 dann
		ZeitSoll := TEXTTEIL(TagesString, 34, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstWZStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(TagesString, 40, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_EG_WZ_HZK_Garten := TemperaturSoll
			WARTE("00:00:05")
			Thermo_EG_WZ_HZK_Nachb := TemperaturSoll
			WARTE("00:00:05")
			Anz_HeizstWZStep := 4
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Fünfte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstWZStep = 4 dann
		ZeitSoll := TEXTTEIL(TagesString, 45, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstWZStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(TagesString, 51, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_EG_WZ_HZK_Garten := TemperaturSoll
			WARTE("00:00:05")
			Thermo_EG_WZ_HZK_Nachb := TemperaturSoll
			WARTE("00:00:05")
			Anz_HeizstWZStep := 5
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
EndeWenn

//============================================================
// ELW Schlafzimmer
// Urlaubseinstellung auslesen und einstellen
//============================================================

Wenn A_010HeizungAnAus = 1 und Virt_SchaZeitstHeizUrlaub = 1 und A_012AbsenkungHeizung = 0 dann

	//Step auf 0 zurückstellen
	Wenn Uhrzeit = "00:05:00" dann
		Anz_HeizstELWSZiStep := 0
	EndeWenn

	//Erste Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWSZiStep = 0 dann
		ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubELWSZi, 1, 5)
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubELWSZi, 7, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_SchlZi := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWSZiStep := 1
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Zweite Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWSZiStep = 1 dann
		ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubELWSZi, 12, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWSZiStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubELWSZi, 18, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_SchlZi := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWSZiStep := 2
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Dritte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWSZiStep = 2 dann
		ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubELWSZi, 23, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWSZiStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubELWSZi, 29, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_SchlZi := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWSZiStep := 3
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Vierte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWSZiStep = 3 dann
		ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubELWSZi, 34, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWSZiStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubELWSZi, 40, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_SchlZi := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWSZiStep := 4
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Fünfte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWSZiStep = 4 dann
		ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubELWSZi, 45, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWSZiStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubELWSZi, 51, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_SchlZi := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWSZiStep := 5
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
EndeWenn

//============================================================
// ELW Schlafzimmer
// Tageseinstellung auslesen und einstellen
//============================================================

Wenn A_010HeizungAnAus = 1 und Virt_SchaZeitstHeizUrlaub = 0 und A_012AbsenkungHeizung = 0 dann
	//Step auf 0 zurückstellen
	Wenn Uhrzeit = "00:05:00" dann
		Anz_HeizstELWBadStep := 0
	EndeWenn
	//Zuordnung Tage
	Wenn Wochentag = "Montag" dann
		TagesString := Anz_Heizst_MontagELWSZi
	EndeWenn
	Wenn Wochentag = "Dienstag" dann
		TagesString := Anz_Heizst_DienstagELWSZi
	EndeWenn
	Wenn Wochentag = "Mittwoch" dann
		TagesString := Anz_Heizst_MittwochELWSZi
	EndeWenn
	Wenn Wochentag = "Donnerstag" dann
		TagesString := Anz_Heizst_DonnerstagELWSZi
	EndeWenn
	Wenn Wochentag = "Freitag" dann
		TagesString := Anz_Heizst_FreitagELWSZi
	EndeWenn
	Wenn Wochentag = "Samstag" dann
		TagesString := Anz_Heizst_SamstagELWSZi
	EndeWenn
	Wenn Wochentag = "Sonntag" dann
		TagesString := Anz_Heizst_SonntagELWSZi
	EndeWenn
	//Erste Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWSZiStep = 0 dann
		ZeitSoll := TEXTTEIL(TagesString, 1, 5)
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(TagesString, 7, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_SchlZi := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWSZiStep := 1
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Zweite Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWSZiStep = 1 dann
		ZeitSoll := TEXTTEIL(TagesString, 12, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWSZiStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(TagesString, 18, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_SchlZi := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWSZiStep := 2
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Dritte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWSZiStep = 2 dann
		ZeitSoll := TEXTTEIL(TagesString, 23, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWSZiStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(TagesString, 29, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_SchlZi := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWSZiStep := 3
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Vierte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWSZiStep = 3 dann
		ZeitSoll := TEXTTEIL(TagesString, 34, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWSZiStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(TagesString, 40, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_SchlZi := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWSZiStep := 4
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Fünfte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWSZiStep = 4 dann
		ZeitSoll := TEXTTEIL(TagesString, 45, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWSZiStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(TagesString, 51, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_SchlZi := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWSZiStep := 5
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
EndeWenn



//============================================================
// ELW Bad
// Urlaubseinstellung auslesen und einstellen
//============================================================

Wenn A_010HeizungAnAus = 1 und Virt_SchaZeitstHeizUrlaub = 1 und A_012AbsenkungHeizung = 0 dann

	//Step auf 0 zurückstellen
	Wenn Uhrzeit = "00:05:00" dann
		Anz_HeizstELWBadStep := 0
	EndeWenn

	//Erste Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWBadStep = 0 dann
		ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubELWBad, 1, 5)
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubELWBad, 7, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_Bad := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWBadStep := 1
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Zweite Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWBadStep = 1 dann
		ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubELWBad, 12, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWBadStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubELWBad, 18, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_Bad := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWBadStep := 2
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Dritte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWBadStep = 2 dann
		ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubELWBad, 23, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWBadStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubELWBad, 29, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_Bad := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWBadStep := 3
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Vierte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWBadStep = 3 dann
		ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubELWBad, 34, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWBadStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubELWBad, 40, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_Bad := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWBadStep := 4
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Fünfte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWBadStep = 4 dann
		ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubELWBad, 45, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWSZiStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubELWBad, 51, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_Bad := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWBadStep := 5
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
EndeWenn

//============================================================
// ELW Bad
// Tageseinstellung auslesen und einstellen
//============================================================

Wenn A_010HeizungAnAus = 1 und Virt_SchaZeitstHeizUrlaub = 0 und A_012AbsenkungHeizung = 0 dann
	//Step auf 0 zurückstellen
	Wenn Uhrzeit = "00:05:00" dann
		Anz_HeizstELWBadStep := 0
	EndeWenn
	//Zuordnung Tage
	Wenn Wochentag = "Montag" dann
		TagesString := Anz_Heizst_MontagELWBad
	EndeWenn
	Wenn Wochentag = "Dienstag" dann
		TagesString := Anz_Heizst_DienstagELWBad
	EndeWenn
	Wenn Wochentag = "Mittwoch" dann
		TagesString := Anz_Heizst_MittwochELWBad
	EndeWenn
	Wenn Wochentag = "Donnerstag" dann
		TagesString := Anz_Heizst_DonnerstagELWBad
	EndeWenn
	Wenn Wochentag = "Freitag" dann
		TagesString := Anz_Heizst_FreitagELWBad
	EndeWenn
	Wenn Wochentag = "Samstag" dann
		TagesString := Anz_Heizst_SamstagELWBad
	EndeWenn
	Wenn Wochentag = "Sonntag" dann
		TagesString := Anz_Heizst_SonntagELWBad
	EndeWenn
	//Erste Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWBadStep = 0 dann
		ZeitSoll := TEXTTEIL(TagesString, 1, 5)
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(TagesString, 7, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_Bad := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWBadStep := 1
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Zweite Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWBadStep = 1 dann
		ZeitSoll := TEXTTEIL(TagesString, 12, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWBadStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(TagesString, 18, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_Bad := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWBadStep := 2
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Dritte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWBadStep = 2 dann
		ZeitSoll := TEXTTEIL(TagesString, 23, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWBadStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(TagesString, 29, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_Bad := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWBadStep := 3
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Vierte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWBadStep = 3 dann
		ZeitSoll := TEXTTEIL(TagesString, 34, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWBadStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(TagesString, 40, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_Bad := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWBadStep := 4
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
	//Fünfte Einstellung auslesen, erste Position sollte immer ausgefüllt sein
	Wenn Anz_HeizstELWBadStep = 4 dann
		ZeitSoll := TEXTTEIL(TagesString, 45, 5)
		Wenn ZeitSoll = "" ODER ZeitSoll = " " Dann
			Anz_HeizstELWBadStep := 5
			VERLASSEN
		EndeWenn
		ZeitSoll := ZeitSoll + ":00"
		ZeitSollZeitFormat := ZeitSoll
		TemperaturSoll:= TEXTTEIL(TagesString, 51, 4)
		Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
			Thermo_ELW_HZK_Bad := TemperaturSoll
			WARTE("00:00:05")

			Anz_HeizstELWBadStep := 5
			starte(Makro_Meldungen)
			Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
		EndeWenn
	EndeWenn
EndeWenn


//Absenkung während Heizperiode
========================================================
//Auslesen Zeiten aus String Tage und Einstellungen ausführen
Wenn A_010HeizungAnAus = 1 und Virt_SchaZeitstHeizUrlaub = 0 und A_012AbsenkungHeizung = 1 dann
	Wenn Uhrzeit = "00:05:00" dann
		Thermo_EG_WZ_HZK_Garten := Anz_Heizst_Absenkung
		WARTE("00:00:05")
		Thermo_EG_WZ_HZK_Nachb := Anz_Heizst_Absenkung
		WARTE("00:00:05")
		Thermo_ELW_HZK_SchlZi := Anz_Heizst_Absenkung
		WARTE("00:00:05")
		Thermo_ELW_HZK_Bad := Anz_Heizst_Absenkung
		WARTE("00:00:05")
	EndeWenn
EndeWenn

//Heizung aus, Sommereinstellung
========================================================
Wenn A_010HeizungAnAus = 0 dann
	Wenn Uhrzeit = "00:05:00" dann
		Thermo_EG_WZ_HZK_Garten :=  Anz_Heizst_Sommer
		WARTE("00:00:05")
		Thermo_EG_WZ_HZK_Nachb := Anz_Heizst_Sommer
		WARTE("00:00:05")
		Thermo_ELW_HZK_SchlZi := Anz_Heizst_Sommer
		WARTE("00:00:05")
		Thermo_ELW_HZK_Bad := Anz_Heizst_Absenkung
		WARTE("00:00:05")
	EndeWenn
EndeWenn
Es sind derzeit 3 Räume programmiert. Meine Angst ist, dass wenn sich Zeiten bei den Räumen überschneiden, dass es zu Problemen führen kann.
Es ist mir klar, dass die "Grund-Wenn-Abfrage" mehrfach vorhanden ist und prinzipiell einfach genügt, werde ich noch am Schluss rauswerfen.

Ev. hat jemand die Muse darüber zu schauen.

Gruß Axel

AFi
Beiträge: 166
Registriert: 14.12.2016, 20:44

Re: Steuerung HM-CC-RT-DN

Beitrag von AFi » 27.12.2017, 12:19

Hi,

hab vergessen, das Makro läuft inzwischen alle Minute.

Gruß Axel

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Steuerung HM-CC-RT-DN

Beitrag von Familienvater » 27.12.2017, 15:38

Hi,

ich habe nicht versucht, den ganzen Code zu verstehen, für mich ist das Copy-Paste-Spaghetti-Code.

Wenn Du Angst hast, das sich Gleichzeitigkeiten stören, mach für jedes Thermostat bzw. Raum ein eigenes Makro, dann bleibt es evtl. übersichtlicher.
Ich würde das ganze ggf. auch innerhalb des Codes weiter modularisieren, Du kennst die Funktion LESETEXTPAR? Damit kann man sich wunderbar den ersten, zweiten, dritten etc. Parametersatz rausholen, und den Teilstring dann immer mit der gleichen Logik behandeln.
Das Problem an all dem "starren" Denken ist, das es auch nicht wirklich smart ist, es ist die interne Zeittabelle des Aktors nachprogrammiert, mit den gleichen Einschränkungen. Fröstelt es mich trotz aktueller komfort-Temperatur kurz vor einem Temperatursprung zur Absenkung, und ich drehe die Temperatur 2 Grad hoch, kommt die Automatik und kickt die 3 Minuten später wieder raus und schaltet auch noch frech auf eine noch kältere Temperatur, das ist aber schwer zu pauschalisieren, aber ich würde dann meinem manellen Wunsch eine zeitlang eine höhere Priorität geben, als der Maschine. Oder man ist im Bad, und hat zur falschen Zeit Boost aktiviert, dann kommt die Maschine und dreht mir gerade als ich unter die Dusche gehe wieder den Boost aus. Aber diese Nickligkeiten kann ich mit der Standard-Funktionalität des Geräts selber haben, ohne HPCL. Zum ändern muss man halt auf die "lahme" Konfig-Oberfläche der CCU.

Ich weiß nicht, wie oft die Heizzeiten/Temperaturen wirklich angepasst werden, und ich bin kein Freund der zyklischen Ausführung, weil ich selbst ein fauler Hund bin, und selbst auch nur Eventgetriggert arbeite (ich renne nicht jede Minute aufs Klo, und schaue ob was kommt, gehe dann am Kühlschrank vorbei, ob ich Hunger habe, frage dann die Anwesenden, ob das Licht so ist, wie die es gerne hätten, und Schaue noch mal vor die Türe, ob zufällig einer rein will).
Bei meiner Rolladensteuerung wird jeder virtuelle Rolladen durch die HPCL-Zeittabelle genau einmal morgens um 6:00 hochgefahren, und um 17:00 runtergefahren, im Makro wird dann ermittelt, wie lange wegen Wochentag/Wochenende/Feiertag usw. gewartet werden muss, bis der echte Rolladen dann evtl. gefahren wird (was ggf. durch offene Fenstergriffe etc. noch verhindert/verzögert wird). Muss man aber dann weiter um die Ecke denken, das auch bei Neustarts z.B. der virtuelle Rolladen wieder ggf. zuverlässig das Warten anfängt, oder wenn jemand während des Wartens die Zeit verstellt, erneut die neue Wartezeit berechnet wird.

Aus funktechnischer/Batterielebensdauer-Sicht:
Wenn das Thermostat im Manu-Modus ist, und hat die Absenk-Temperatur, wird es trotzdem durch das Setzewert angefunkt, und jedesmal auch alle anderen aufgeweckt. Außerdem wird ggf. das Ventil erst komplett zugefahren (weil Anz_Heizst_Absenkung deutlich unter der aktuellen Raumtemp ist), und 3 min später kommt das "Kommando zurück", auf 18°, Ventil wieder auf 30% oder so.

Der Familienvater

AFi
Beiträge: 166
Registriert: 14.12.2016, 20:44

Re: Steuerung HM-CC-RT-DN

Beitrag von AFi » 27.12.2017, 16:22

Hi Familienvater,

danke für die Antworten.

Der Befehl LESETEXTPAR habe ich leider bisher nicht gesehen, werde ihn prüfen, ob er Vorteile bringt.

Die Konfiguration um 23:55 Uhr möchte ich nur machen um sicher zu sein, dass die Thermostate auf MANUELL stehen, falls am Tag
einer den Modus durch Zufall verstellt hat, gibt es eine mir nicht bekannte Möglichkeit dies ohne SETZEWERT auszuführen (bitte
jedoch nicht alle Knöpfe sperren).

Der "Copy-Paste-Spaghetti-Code" (den Namen find ich gut) ist deshalb entstanden, da mir nichts besseres eingefallen ist (bin leider
kein Programmierer), ich lasse mich gerne eines besseren belehren. Dabei hilft leider nicht neu Wörter zu kreieren.

Die Ausführung soll die Bordmittel ersetzen, da diese meiner Meinung nach nicht zuverlässig funktionieren.

Ein Problem, dass ich noch habe ist der Befehl "ALLEWERTESICHERN", es scheint mir so, dass bei einem Absturz der EXEC-ENGINE die
Werte in den Eingabefeldern (Objekte) nicht mehr vorhanden sind. Kann man sich diese Sicherungsdatei auf der CCU anschauen, wenn ja, wo.

Gruß Axel

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Steuerung HM-CC-RT-DN

Beitrag von Familienvater » 27.12.2017, 16:46

Hi,

es kommt drauf an, wie häufig Du ALLEWERTESICHERN ausführst. Die Datei, die erstellt wird, sollte auf der CCU im Verzeichnis /usr/local/homeputer/ liegen, und mit .### enden, vornedran der Teil sollte wie Dein Projekt heißen.
Die ExecEngine lädt diese Datei aber nur, wenn der Zeitstempel (Sekunden seit 1.1.1970) in der ersten Zeile der Datei nicht älter als eine Stunde ist, sonst wird der Inhalt ignoriert und die Datei gelöscht.
Damit man auf der "sicheren" Seite ist, müsste man also die Datei ca. alle 45-50 min neu erstellen, damit auch beim einem "ungeordneten" Neustart der Zentrale der Zeitstempel gerade noch so im Rahmen bleibt.

Oder man kümmert sich selbst drum, und sichert die "wichtigen" Dinge selber, und kümmert sich selber darum, das diese auch wieder eingelesen werden (LESEWERTEDATEI, in der Hilfe schauen, da ist auch Beispiel wie eine solche Datei aus HPCL heraus erstellt werden kann), und die Datei mit diesen Parametern erstellt man nur nach einer Änderung an den Text-Objekten, die die Schaltzeiten enthalten.
Man muss sich dann aber beim Hochlauf des Projektes einen Kopf machen, was in welcher Reihenfolge wie initialisiert wird, weil es dann ggf. einen Startwert des Objektes gibt, der wird ggf. von der ALLEWERTESICHERN-Datei automatisch überbügelt, dann kommt die eigene Datei, die möglichst frühzeitig nach dem Start aus einem INIT_-Makro gelesen wird.

Die Zuverlässigkeit der HPCL-Zeittabellen ist eigentlich ganz gut, sporadisch geht mal ein Schaltzeitpunkt verloren (ich hoffe aber, das RK mit dem fixen des GetCCUSysVar/Warte-Problems, vielleicht zufällig auch den Bug bei den sporadischen Aussetzern der Zeittabelle mitfixt).

Bis auf die extra Zeile mit der Urlaubssteuerung kann das Thermostat das ganze auch im Automatikmodus, Out-Of-The-Box.

Den aktuellen Modus des Thermostaten bekommt man über Aktorname.Modus, schau mal in der Hilfe bei "Hinweise zu Hardwaremodulen/Homematic/Hinweise zu Thermostaten", dann musst Du den nur setzen, wenn der nicht auch Manuell steht (und "Dilema": nicht auf Boost), wobei die Hilfe nicht alle Modi aufführt: 0 - Automatik/Zeitsteuerung, 1 - Manuell, 2 - PARTY-MODE, 3 - Boost
Dilema deswegen, weil sich am Ende vom Boost ja nach einer gewissen Zeit wieder zurückstellt, aber dann auf die Temperatur vorher, wenn Du während dem Boost eine neue vorgibst, müsste der Boost abgebrochen werden.

Spaghetti-Code ist keine Wortschöpfung von mir, das kann man sogar in der Wikipedia nachschlagen...

Der Familienvater

Der Familienvater

AFi
Beiträge: 166
Registriert: 14.12.2016, 20:44

Re: Steuerung HM-CC-RT-DN

Beitrag von AFi » 27.12.2017, 17:30

Hi Familienvater,

Danke für die Antwort.

Allewertesichern werde ich untersuchen, die Absicherung läuft alle 60 min.

Die Modi schau ich mir auch nochmals an.

Den Spaghetti-Code wäre leicht beizukommen, wenn es die Befehle "Do while ... , For i=...... etc." gäbe.

Danke

Gruß Axel

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Steuerung HM-CC-RT-DN

Beitrag von Familienvater » 27.12.2017, 17:51

Hi,

mangels "Listen" in HPCL geht leider kein For ... each über z.B. eine Geräteliste, eine Do ... while bzw for i = 1t o 5-Schleife geht, einfach einen Sprung mit GeheZu nach oben machen, man muss sich nur bewusst sein, das bei einem Sprung nach oben ggf. die Ausführung des aktuellen Makros "angehalten" wird, es kommen alle anderen wartenden Aktionen dran, und danach geht es erst an der angesprungenen Marke weiter, damit man nicht unbewusst eine endlos-Schleife programmieren kann.
Wenn man eine Schleife braucht, die nicht die Kontrolle abgibt, geht das auch. Das ist aber gemein, und funktioniert vielleicht irgendwann nicht mehr 100%ig, deswegen würde ich davon abraten (rekursiver Aufruf des eigenen Makros), und ich nutze das auch nur für Schleifen in "Subroutinen", die erst die Kontrolle an das aufgerufene Makro zurückgeben sollen, wenn die durch sind.

Ich weiß, es sind Ferien, und es juckt in den Fingern, endlich das eine oder andere zu realisieren, aber RK hat angedeutet, das er die ExecEngine für eine weitere Sprache/Erweiterung öffnen will, nämlich LUA. Wann, wie, ob etc. steht im Dunst, ich würde mal nicht vor Ende 1. Quartal 2018 rechnen. Ob damit richtig viel möglich sein wird, und wie der Zugriff auf HPCL-Objekte aus LUA klappt etc. keine Ahnung, aber LUA ist eine mächtige Sprache...

Der Familienvater

AFi
Beiträge: 166
Registriert: 14.12.2016, 20:44

Re: Steuerung HM-CC-RT-DN

Beitrag von AFi » 27.12.2017, 22:59

Hi Familienvater,

wer ist RK? dies nur nebenbei.

Da ich ja für neue Techniken offen bin und die Lernkurve immer noch da ist, der Versuch mehr über Schleifen zu realisieren.

Nehme ich jetzt die 1te Urlaubsschleife als Beispiel her und möchte mindestens 5 Durchläufe für jeden Raum erreichen (maximale Anzahl der Schaltpunkte), sehe ich die Schwierigkeit in der Übertragung der Werte in den Thermostaten, da ich den Thermostatname in einer Variable verarbeiten muß.

Genauso muss ich natürlich die Objekte der Zeit- und Temperaturvorgaben (String pro Tag oder Urlaub) in eine Variable verarbeiten um sie in "Texteil" auslesen bzw. definieren zu können. Die Positionen und Bereichslängen der Strings sind nicht das Problem.

Code: Alles auswählen

  
   Wenn Anz_HeizstWZStep = 0 dann      // dies wird wohl eine allgemeine Variable für jeden Step
      ZeitSoll := TEXTTEIL(Anz_Heizst_UrlaubWZ, 1, 5)      //hier gehört der Name des Strings Urlaub Heizkörper WZ in eine Variable
      ZeitSoll := ZeitSoll + ":00"
      ZeitSollZeitFormat := ZeitSoll
      TemperaturSoll:= TEXTTEIL(Anz_Heizst_UrlaubWZ, 7, 4)
      Wenn Uhrzeit zwischen ZeitSollZeitFormat und (ZeitSollZeitFormat + "00:03:00") dann
         Thermo_EG_WZ_HZK_Garten := TemperaturSoll
         WARTE("00:00:05")
         Thermo_EG_WZ_HZK_Nachb := TemperaturSoll  // hier gehört der Name des Thermostates in eine Variable
         WARTE("00:00:05")
         Anz_HeizstWZStep := 1
         starte(Makro_Meldungen)
         Meldung1:=Datum + " " + Uhrzeit + " Sollzeit: " + ZeitSoll + " Solltemperatur: " + TemperaturSoll
      EndeWenn
   EndeWenn
Es gehört natürlich der Rücksprung und Verlassen noch rein.

Hast Du Ansätze?

Gruß
Axel

NickHM
Beiträge: 3733
Registriert: 23.09.2017, 12:04
Hat sich bedankt: 66 Mal
Danksagung erhalten: 120 Mal

Re: Steuerung HM-CC-RT-DN

Beitrag von NickHM » 27.12.2017, 23:57

AFi hat geschrieben:Hi Familienvater,

wer ist RK? dies nur nebenbei.
Guten Abend

aus dem Rest halte ich mich raus, aber das kann ich beantworten :)

Das sind die Anfangsbuchstaben des Vor/Nachnamens des Geschäftsführers von contronics.

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Steuerung HM-CC-RT-DN

Beitrag von Familienvater » 28.12.2017, 01:10

Hi,

RK ist der Contronics-RK hier aus dem Forum, und das ist Ralph Krapoth, und das ist DER Softwareentwickler von Homeputer, und einer der zwei Geschäftsführer von Contronics.

Es gibt 2 mehr oder weniger häßliche Möglichkeiten, mit einer Zeichenkette einen "Aktor" zu steuern, die eine ist über den Umweg über das CLWebI-Interface (vollkommen Gaga, in HPCL einen Getsite mit Aktornamen und neuem Wert auf das HPCL-WebInterface zu machen), oder das ganze in eine Textdatei zu schreiben, und diese wieder mit der LESEWERTDATEI-Methode einzulesen (genau so gaga), auch damit wäre es möglich, einen Wert zu setzen. Beides wenig praktikabel, deswegen der Hinweis, das ganze vielleicht zu verschieben, bis es mehr Details zur LUA-Implementation gibt, dort könnte es objektorientierter möglich sein, so etwas zu lösen, vielleicht gibt es in diesem Rahmen ja dann auch noch die ein- oder andere neue HPCL-Funktion.

Zum Thema Schleife:
Ich habe ja geschrieben, das ich das Raumweise/Geräteweise trennen würde, weil dann nur noch ein "Aktor" pro Makro angesprochen werden müsste. Da es ärgerlichweise aktuell keine "Objektreferenzen" gibt, und im Zweifelsfall das Steuerungsmakro nicht unbedingt in das Heizungsthermostatobjekt selbst gehört, geht an der Stelle auch nicht der "SELBST"-Verweis.

Grob gesagt würde ich wie aktuell über "einzelne" Abfragen den für den aktuellen Tag zuständigen String mit allen Schaltzeiten in eine lokale Zeichenketten-Variable laden, und dann eine "Schleife" starten, womit durch die einzelnen Parameter-Ansammlungen iteriert werden kann, und jeweils die Parametergruppen weiter zerlegen und mit den zutreffenden Zeitspannen dann prüfen/arbeiten, und dann das Thermostat steuern. Wegen meiner zyklischen Ausführungs-Abneigung dann die notwendige Wartezeit bis zum Ende des aktuellen Zeitraums berechnen und diese dynamisch abwarten, und die Schleife bzw. das Makro erneut starten. Problem dabei ist halt, das es einmal irgendwie von außen getriggert werden muss, bevor es sich dann immer wieder selbst triggert.

Deine Zeittabellen sind ja aktuell HH:MM/GG.G-HH:MM/GG.G-HH:MM/GG.G. Man kann so die "Gruppen" mit der LESETEXTPAR mit Trennzeichen "-" und Index 1,2,3,4 ansprechen und bekommt dann den Teilstring HH:MM/GG.G zurück, und diese könnte man entweder hart mit TEXTTEIL und festen Bereichen (HH:MM ist ja jetzt immer ab 1 mit Länge 5, und GG.G ist immer ab 7 mit Länge 4) oder auch wieder mit LESETEXTPAR und Trennzeichen "/" weiter zerlegen. Damit ist es innerhalb der Schleife immer die gleiche Bedingung.

Der Familienvater

Antworten

Zurück zu „homeputer CL“