Skript testen funktioniert // CCU führt Skript aus -> FEHLER

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Antworten
krug33
Beiträge: 2
Registriert: 20.02.2018, 11:21

Skript testen funktioniert // CCU führt Skript aus -> FEHLER

Beitrag von krug33 » 13.04.2018, 11:33

Hallo Zusammen,

bin neu hier und auch noch recht neu im Umgang mit Homematic... wobei ich aus anderen Bereichen, über ganz passable Programmierkenntnisse verfüge.
Kurze Info bzgl. meines "Smart-Homes": Ich habe eine ganze Menge an Komponenten in unserem Haus verbaut: Rolladen, Licht, Fußbodenheizung, Rauchmelder.
Insgesamt sind jetzt schon 99 Aktoren und Tasterschnittstellen zusammengekommen. Im Nachhinein betrachtet vielleicht gleich etwas viel für den Anfang, aber bisher funktioniert alles ganz gut.

Für die Fußbodenheizung habe ich mich von twoxx inspirieren lassen und eine skriptgesteuerte Einzelraumregelung umgestetzt
(siehe twoxx ->viewtopic.php?f=31&t=24890)
Ich habe von ihm allerdings nur die grundlegenden Ideen abgeschaut, für mich interpretiert und neu programmiert.
Wichtig: ich habe alles mit Systemvariablen umgesetzt, da ich sonst sehr schnell die 200-Variablen-Grenze überschritten hätte.

Nun meine Frage:
Prinzipiell läuft das Skript und kann die unterschiedlichen Fälle richtig zuordnen. Zur Überprüfung lasse ich mir eine Zusammenfassung aufs Handy pushen.
Das Problem ist folgendes: Sobald einer der beiden Fälle
-> Ist < Niederstill => 100% - 50% Heizen, bzw.
-> (Hochstill < Ist < Hochtemp && Richtung < 0)=> 50% - 0% Heizen
eintritt, muss eine relative Heizzeit berechnet werden. Diese Berechnung funktioniert, sofern ich das Skript teste. Wenn es allerdings über die CCU ausgelöst wird, gibt es einen Fehler, bzw. wird immer 0.0000 berechnet. Siehe unten...

Hier das gesamte Skript, ohne die Komponenten-IDs:

Code: Alles auswählen

!---- FBH-Regelung über Skript
!---- Stand: 11.04.2018
!---- Wohnen

!---- Definition
! IDaktor = "BidCos-RF.xxx";
! IDwt = "BidCos-RF.xxx";
! SysVarNAME = "Wohnen"
! MessageNAME = "Wohnen"

!---- Temperaturen auslesen und berechnen
dom.GetObject("FBH.var.AT").State(0.0 + dom.GetObject("BidCos-RF.xxx.TEMPERATURE").Value());
dom.GetObject("FBH.var.SOLL").State(0.0 + dom.GetObject("BidCos-RF.xxx.SET_TEMPERATURE").Value());
dom.GetObject("FBH.var.IST").State(0.0 + dom.GetObject("BidCos-RF.xxx.ACTUAL_TEMPERATURE").Value());
dom.GetObject("FBH.var.DIR").State(dom.GetObject("FBH.var.IST").Value() - dom.GetObject("FBH.alt.Wohnen").Value());
dom.GetObject("FBH.alt.Wohnen").State(dom.GetObject("FBH.var.IST").Value());

!---- Message initialisieren
boolean sendMessage = false;
string Message = "Wohnen: ";
Message = Message#"AT "#dom.GetObject("FBH.var.AT").Value();
Message = Message#" / Soll "#dom.GetObject("FBH.var.SOLL").Value();
Message = Message#" / Ist "#dom.GetObject("FBH.var.IST").Value();
if (dom.GetObject("FBH.var.DIR").Value()<0) {
	Message = Message#" / DIR neg";
} else {
	Message = Message#" / DIR pos";
}

!---- Grundkriterien zum Heizen
!-- Soll > 12°C und Soll > Außentemperatur und Außentemperatur < 20°C 
if ((dom.GetObject("FBH.var.SOLL").Value() > 12) &&
    (dom.GetObject("FBH.var.SOLL").Value() > dom.GetObject("FBH.var.AT").Value()) &&
	(dom.GetObject("FBH.var.AT").Value() < 20)) {

	!---- Heizzeit initialisieren
	dom.GetObject("FBH.var.HZeit").State(0.0);

	!---- Hochtemperatur
	!-- Ist < Niedertemp || (Ist < Niederstill && Richtung < 0) => 100% Heizen
	if ((dom.GetObject("FBH.var.IST").Value() < (dom.GetObject("FBH.var.SOLL").Value() + dom.GetObject("FBH.Niedertemp").Value())) ||
		(dom.GetObject("FBH.var.IST").Value() < (dom.GetObject("FBH.var.SOLL").Value() + dom.GetObject("FBH.Niederstill").Value()) &&
		 dom.GetObject("FBH.var.DIR").Value() < 0.0)) {
		
		dom.GetObject("FBH.var.HZeit").State(dom.GetObject("FBH.Heizimpuls").Value());
		Message = Message#" => Dauerheizen";

	!-- Ist < Niederstill => 100% - 50% Heizen
	} elseif (dom.GetObject("FBH.var.IST").Value() < (dom.GetObject("FBH.var.SOLL").Value() + dom.GetObject("FBH.Niederstill").Value())) {

		dom.GetObject("FBH.var.HZeit").State(0.0 + 
			dom.GetObject("FBH.Heizimpuls").Value() * (0.5 + (0.5 *(
			(dom.GetObject("FBH.var.IST").Value() - (dom.GetObject("FBH.var.SOLL").Value()+dom.GetObject("FBH.Niederstill").Value())) / 
			(dom.GetObject("FBH.Niedertemp").Value()+dom.GetObject("FBH.Niederstill").Value())))));
		Message = Message#" => Niedertemp (" #dom.GetObject("FBH.var.HZeit").Value()# ")";
		sendMessage = true;
		
	!-- Niederstill < Ist < Hochstill => Heizpause
	} elseif (dom.GetObject("FBH.var.IST").Value() < (dom.GetObject("FBH.var.SOLL").Value() + dom.GetObject("FBH.Hochstill").Value())) {
	
		Message = Message#" => Heizstill";
		sendMessage = true;
		
	!-- (Hochstill < Ist < Hochtemp && Richtung < 0)=> 50% - 0% Heizen
	} elseif ((dom.GetObject("FBH.var.IST").Value() < (dom.GetObject("FBH.var.SOLL").Value() + dom.GetObject("FBH.Hochtemp").Value())) &&
			  (dom.GetObject("FBH.var.DIR").Value() < 0.0)) {
	   
		dom.GetObject("FBH.var.HZeit").State(0.0 + 
			dom.GetObject("FBH.Heizimpuls").Value() * (0.5 - (0.5 *(
			(dom.GetObject("FBH.var.IST").Value() - (dom.GetObject("FBH.var.SOLL").Value()+dom.GetObject("FBH.Hochstill").Value())) / 
			(dom.GetObject("FBH.Hochtemp").Value()+dom.GetObject("FBH.Hochstill").Value())))));
		Message = Message#" => Hochtemp (" #dom.GetObject("FBH.var.HZeit").Value()#")";
		sendMessage = true; 
		
	} else {
	
		Message = Message#" => ÜberHochtemp";
		
	}

	!---- Auswertung der Heizzeit

	!-- Heizzeit zu kurz
	if (dom.GetObject("FBH.var.HZeit").Value() <= dom.GetObject("FBH.Ventilzeit").Value()) {
		dom.GetObject("FBH.var.HZeit").State(0.0);
	}
	
	!---- Ausführung

	if (true && (dom.GetObject("FBH.var.HZeit").Value() > 0.0)) {
		dom.GetObject("BidCos-RF.xxx.ON_TIME").State(dom.GetObject("FBH.var.HZeit").Value());
		dom.GetObject("BidCos-RF.xxx.STATE").State(1);
		Message = Message#" >> on";
	}

} else {

	Message = Message#" => Heizen inaktiv";

}

!---- Push-Meldung ans Smartphone
if (sendMessage) {
	dom.GetObject("pocketControlPushMessage").State(Message);
}
! WriteLine(Message)
Hier nochmal exemplarisch die kritische Formel (Niedertemp):

Code: Alles auswählen

		dom.GetObject("FBH.var.HZeit").State(0.0 + 
			dom.GetObject("FBH.Heizimpuls").Value() * (0.5 + (0.5 *(
			(dom.GetObject("FBH.var.IST").Value() - (dom.GetObject("FBH.var.SOLL").Value()+dom.GetObject("FBH.Niederstill").Value())) / 
			(dom.GetObject("FBH.Niedertemp").Value()+dom.GetObject("FBH.Niederstill").Value())))));

Prinzipiell steht da: Heizimpuls * (0.5 + (0.5 * ((IST - (SOLL + Niederstill)) / (Niedertemp + Niederstill)))), wobei
Heizimpuls = 1200 Sek.
Niedertemp = -0.8°C
Niederstill = -0.1°C

2018-04-13 11_13_42-HomeMatic WebUI.png
Skript über "Skript testen" ausgeführt
2018-04-13 11_13_42-HomeMatic WebUI.png (13.68 KiB) 721 mal betrachtet
IMG_1074.PNG
Skirpt von CCU ausgeführt
Ich bin mir bewusst, dass dies eine durchaus komplexe Frage ist, aber vielleicht gibt es jemanden der mir hier helfen kann.
Es würde mich sehr freuen, auch wenn es zunächst nur ein Tipp ist.

Falls nötig, kann ich auch noch etwas genauer auf die Funktionsweise eingehen.

Vielen Dank schonmal
Thomas

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

Re: Skript testen funktioniert // CCU führt Skript aus -> FE

Beitrag von NickHM » 13.04.2018, 13:18

Guten Morgen

nur als kleiner Hinweis zwischendurch .... in der aktuellen CCU und RasPi Firmware gibt es die Grenze von 200 Variablen nicht mehr.
Variablen im Script machen Dein Programm vielleicht um einiges kürzer und einfacher, als SysVar zu benutzen.

krug33
Beiträge: 2
Registriert: 20.02.2018, 11:21

Re: Skript testen funktioniert // CCU führt Skript aus -> FE

Beitrag von krug33 » 13.04.2018, 16:24

NickHM hat geschrieben:Guten Morgen

nur als kleiner Hinweis zwischendurch .... in der aktuellen CCU und RasPi Firmware gibt es die Grenze von 200 Variablen nicht mehr.
Variablen im Script machen Dein Programm vielleicht um einiges kürzer und einfacher, als SysVar zu benutzen.
Das ist schon einmal ein sehr guter Hinweis! Vielen Dank!
Ich hatte das Skript vorher ohne SysVar geschrieben, dann den Fehler und habe deshalb die SysVar eingeführt.

Dann werde ich das wieder umbauen, ... allerdings bleibt immer noch das beschriebene Fehlverhalten.

Antworten

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