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)
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
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