Hi @Xel66 Hi All.
Ich habe Xel66 Idee mal umgesetzt
Was mich ein bisschen Stutzig macht ist die Meldung an der Console:
ccu3-webui local0.err ReGaHss: ERROR: ScriptRuntimeError:....
Obwohl es im Script, Lt. Homematic keine Fehler gibt
Programm:
Code: Alles auswählen
string raum = "Garagen_Flur";
! Version 1.7.2
! Script von Erik Groennerud - 8.2009- MM.2010
! Ergaenzung von Zauberlehrling
! Optimiert und ergaenzt von Petrus (Peter)
! Folgende Systemvariable werden benötigt:
! Heizanlage (boolean) 0 = Zentralheizung an, 1 = aus. Thermostate werden bei abgeschalteter Zentralheizung geöffnet
! Gaeste (boolean) 1= Gäste im Haus, 0 keine Gäste
! Urlaub (boolean) 1= Im Urlaub, 0 zu Hause
! Anwesenheit (boolean) 1=zu Hause, 0 weg
! Partytemperatur,(zahl) default -1, Ansonsten Temperatur, Wertebereich: -1 bis 100
! Feiertag (boolean) 1=Feiertag, 0 kein Feiertag
! Temperaturen 8-30 Grad, 0 = OFF, 100=ON
real grad_0 = 6;
real grad_1 = 18;
real grad_2 = 19;
real grad_3 = 20;
real grad_4 = 21;
real grad_5 = 22;
real grad_6 = 23;
real grad_7 = 24;
real grad_8 = 25;
real grad_9 = 100;
real grad_fenster = 6; ! Temperatur bei offenem Fenster -1 = off
real grad_urlaub = 14; ! Temperatur im Urlaub -1 = off
real grad_gaeste = 21; ! Temperatur fuer Gaeste -1 = off
real grad_aa = 19; ! Temperatur ausser haus, wird als Absenkung benutzt, -1 = OFF (Anwesenheit)
string deltaStdMin = "00:00"; ! deltaStdMin mit "hh:mm" setzten (Std / Min immer zweistellig) Differenzzeit, die manuelle Temperatur erhalten bleibt bis überschrieben wird.
integer woche = 2; ! 0=7 Tage Woche, 1=Montag=Wochentags & Samstag=Wochenende, 2= Montag=Woche, 3=Montag=Wochentags & Samstag=Samstag & Sonntag=Sonntag
! Steuerung welche Leiste aktiv sein soll. Normaler oder Winter Betrieb
var dp_temperatur_aussen = (dom.GetObject("Temperatur"));
var temperatur_aussen = dp_temperatur_aussen.State();
var tempsoll = 10;
if (temperatur_aussen < tempsoll) {
integer leiste = 2; ! Wenn Temp unter 10 Grad dann Leiste 2
} else {
integer leiste = 1; ! Sonst, bei über 10 Grads Leiste 1
};
if (leiste == 1){
! Zeitleiste 1
! Uhrzeit 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2|
! 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3|
string zeitleiste_mon = "333333333333333333333333333333333333333333333333";
string zeitleiste_die = "000000000000012210000000000000000011111111111110";
string zeitleiste_mit = "000000000000012210000000000000000011111111111110";
string zeitleiste_don = "000000000000012210000000000000000011111111111110";
string zeitleiste_fre = "000000000000012210000000000000000011111111111110";
string zeitleiste_sam = "333333333333355555555555555555555555555555555555";
string zeitleiste_son = "000000000000001111111111111111111112222111000000";
};
if (leiste == 2){
! Zeitleiste 2
! Uhrzeit 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2|
! 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3|
string zeitleiste_mon = "444444444444444444444444444444444444444444444444";
string zeitleiste_die = "000000000000012210000000000000000011111133321110";
string zeitleiste_mit = "000000000000012210000000000000000011111133321110";
string zeitleiste_don = "000000000000012211111111111111111111111133321110";
string zeitleiste_fre = "000000000000012110000000000000000011111133321110";
string zeitleiste_sam = "444444444444466666666666666666666666666666666666";
string zeitleiste_son = "000000000000001211111111111111111111223333221110";
};
boolean debug = 1; ! Debug Infos ins Syslog
!******************************************************
! Ab hier Script CODE - Do not change behind this line
!******************************************************
! Umwandeln deltaStdMin in Sekunden
integer stunde = deltaStdMin.Substr(0, 2).ToInteger();
integer minute = deltaStdMin.Substr(3, 2).ToInteger();
integer setdelta = (stunde * 3600) + (minute * 60);
object regler; ! Datenobjekt des Reglers für die Solltemperatur (Kanal 4)
real soll_neu; ! Die neue Solltemperatur fuer den Raumthermostaten (Regler).
real soll_alt; ! Die alte Solltemperatur der Zeitleiste, die zuletzt aktuell war.
real soll_ist = -1; ! Die aktuelle Solltemperatur im Raumthermostat (Regler).
time sv_timestamp; ! Zeitstempel der Systemvariablen, die zuletzt geändert worden ist (Wert in Sekunden).
time rt_timestamp; ! Zeitstempel, wann die Solltemperatur im RT zuletzt gesetzt wurde.
boolean prioritaet = false; ! Ist prioritaet = true, dann wird die neue Solltemperatur auf jeden Fall in den Regler geschrieben.
!Wenn keine Heizperiode, dann Heizkörper auf
if (dom.GetObject('Heizanlage').State()) {
soll_neu = 4.5;
prioritaet = true;
var myAssembly = dom.GetObject(raum);
string itemID;
! Solltemperatur im Raumthermostat ermitteln.
foreach(itemID, myAssembly.EnumUsedIDs()) {
var item = dom.GetObject(itemID);
if (item.IsTypeOf(OT_CHANNEL)) {
var device = dom.GetObject(item.Device());
! Wenn Raumthermostat gefunden wurde...
if (device.HssType() == "HM-CC-RT-DN") {
if (soll_ist < 0) { ! ...und Temperaturwert noch nicht abgefragt worden ist...
! ...dann aktuelle Solltemperatur auslesen.
regler = dom.GetObject("BidCos-RF." # device.Address() # ":4.SET_TEMPERATURE");
soll_ist = regler.Value();
}
}
}
}
} else {
! Alle Geräte im "raum" abfragen und auswerten.
var myAssembly = dom.GetObject(raum);
string itemID;
integer offen = 0;
foreach(itemID, myAssembly.EnumUsedIDs()) {
var item = dom.GetObject(itemID);
if (item.IsTypeOf(OT_CHANNEL)) {
var device = dom.GetObject(item.Device());
! Wenn Raumthermostat gefunden wurde...
if (device.HssType() == "HM-CC-RT-DN") {
if (soll_ist < 0) { ! ...und Temperaturwert noch nicht abgefragt worden ist...
! ...dann aktuelle Solltemperatur auslesen.
regler = dom.GetObject("BidCos-RF." # device.Address() # ":4.SET_TEMPERATURE");
soll_ist = regler.Value();
}
} else {
! Prüfen, ob Verschluss offen
! Testen, ob Fenster Dachluken, usw. offen sind. Diese müssen dem jeweiligen Raum und dem Gewerk "Verschluss" zugeordnet sein
! Alle Gewerke dem Raum zugeordneten Geräte untersuchen
! Andere als die aufgeführten Sensoren oder Aktoren, die als Verschluss dienen, einfach in nachfolgender IF-Anweisung ändern oder ergänzen.
! Türfensterkontakte Jalousienaktor / Dachluken Funk Jalousienaktor / Dachluken Wired Schließerkontakt-Sensor Hutschienenmontage Fenster-Drehgriffsensoren
if ((device.HssType() == "HM-Sec-SCo") || (device.HssType() == "HM-LC-Bl1-FM") || (device.HssType() == "HMW-LC-Bl1-DR") || (device.HssType() == "HMW-Sen-SC-12-DR") || (device.HssType() == "HM-Sec-RHS")) {
var myChannel = dom.GetObject(item);
string id;
foreach(id, myChannel.ChnFunction()) {
var func = dom.GetObject(id);
if (func.Name() == "Verschluss") {
if (item.State() > 0) { offen = offen + 1.00; }
}
}
}
}
}
}
! Wenn ein Verschluss im Raum offen ist, dann Fenstertemperatur einstellen
if (offen > 0) { ! Fenster offen, Ventile einstellen
if (soll_ist <= grad_fenster) { ! Wenn soll_ist niedriger als grad_fenster (z.B. Ventile zu -> soll_ist = 0), dann nichts machen
soll_neu = soll_ist;
} else {
soll_neu = grad_fenster;
prioritaet = true;
}
} else {
! Timestamp "Partytemperatur" festhalten
sv_timestamp = dom.GetObject('Partytemperatur').Timestamp();
! Partytemperatur testen und einstellen, -1 = deaktiviert
integer partytemperatur = dom.GetObject('Partytemperatur').State();
if (partytemperatur > -1) { !Wenn Partytemperatur, dann einstellen
soll_neu = partytemperatur;
} else {
! Prüfen ob Timestamp "Urlaub" jünger ist als "Partytemperatur" => Wenn ja, merken
time settime = dom.GetObject('Urlaub').Timestamp();
if (settime > sv_timestamp) {sv_timestamp = settime;}
! Urlaub testen und einstellen, -1 = deaktiviert
if ((dom.GetObject('Urlaub').State()) && (grad_urlaub > -1)) { !Wenn im Urlaub und grad_urlaub nicht -1 (deaktiviert)
soll_neu = grad_urlaub;
} else {
! Prüfen ob Timestamp "Gaeste" jünger ist als "Urlaub" => Wenn ja, merken
settime = dom.GetObject('Gaeste').Timestamp();
if (settime > sv_timestamp) {sv_timestamp = settime;}
! Gaeste testen und einstellen, -1 = deaktiviert
if ((dom.GetObject('Gaeste').State()) && (grad_gaeste > -1)){ !Wenn Gaeste im Haus und grad_gaeste nicht -1 (deaktiviert)
soll_neu = grad_gaeste;
} else {
! Prüfen ob Timestamp "Anwesenheit" jünger ist als "Gaeste" => Wenn ja, merken
settime = dom.GetObject('Anwesenheit').Timestamp();
if (settime > sv_timestamp) {sv_timestamp = settime;}
! Differenzen von außer Haus Testen und beachten
if ((!dom.GetObject('Anwesenheit').State()) && (grad_aa > -1)) {
soll_neu = grad_aa;
} else {
string zeitleiste_heute; ! Die Temperaturleiste fuer den aktuellen Tag.
string zeitleiste_gestern; ! Die Temperaturleiste von gestern.
string heizwert; ! Enthaelt den Wert, der in der Zeitleiste zum jetzigen Zeitpunkt gilt.
! Hier nun die Auswertung der Zeitleisten
!Auswerten, welche Zeitleiste heute ist
integer tag = system.Date("%u");
if ((tag == 1) && (woche == 0)) {zeitleiste_heute = zeitleiste_mon;} else {
if ((tag == 2) && (woche == 0)) {zeitleiste_heute = zeitleiste_die;} else {
if ((tag == 3) && (woche == 0)) {zeitleiste_heute = zeitleiste_mit;} else {
if ((tag == 4) && (woche == 0)) {zeitleiste_heute = zeitleiste_don;} else {
if ((tag == 5) && (woche == 0)) {zeitleiste_heute = zeitleiste_fre;} else {
if ((tag == 6) && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_sam;} else {
if ((tag == 7) && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_son;} else {
if ((tag >= 1) && (tag <= 5) && ((woche == 1) || (woche == 3))) {zeitleiste_heute = zeitleiste_mon;} else {
if ((tag >= 6) && (tag <= 7) && (woche == 1)) {zeitleiste_heute = zeitleiste_sam;} else {
if (woche == 2) {zeitleiste_heute = zeitleiste_mon;} }}}}}}}}}
! An Feiertagen gilt die Temperatur von Samstag bzw. Sonntag
if (dom.GetObject('Feiertag_heute').State() && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_son;} else {
if (dom.GetObject('Feiertag_heute').State() && (woche == 1)) {zeitleiste_heute = zeitleiste_sam;}}
! Position der Zeitleiste bestimmen
if (system.Date("%M").ToInteger() > 29) {integer add = 1;} else {integer add = 0;}
integer sTime = (system.Date("%H").ToInteger()*2)+add;
heizwert = zeitleiste_heute.Substr(sTime, 1);
! Temperatur bestimmen, die gesetzt werden soll
if (heizwert == "0") {soll_neu = grad_0;} else {
if (heizwert == "1") {soll_neu = grad_1;} else {
if (heizwert == "2") {soll_neu = grad_2;} else {
if (heizwert == "3") {soll_neu = grad_3;} else {
if (heizwert == "4") {soll_neu = grad_4;} else {
if (heizwert == "5") {soll_neu = grad_5;} else {
if (heizwert == "6") {soll_neu = grad_6;} else {
if (heizwert == "7") {soll_neu = grad_7;} else {
if (heizwert == "8") {soll_neu = grad_8;} else {
if (heizwert == "9") {soll_neu = grad_9;} }}}}}}}}}
! letzte Solltemeratur bestimmen, dabei muß der wert von 00:00 beachtet werden - der letzte Wert war gestern
if (sTime == 0) {
if ((tag == 1) && ((woche == 0) || (woche == 3))) {zeitleiste_gestern = zeitleiste_son;} else {
if ((tag == 2) && (woche == 0)) {zeitleiste_gestern = zeitleiste_mon;} else {
if ((tag == 3) && (woche == 0)) {zeitleiste_gestern = zeitleiste_die;} else {
if ((tag == 4) && (woche == 0)) {zeitleiste_gestern = zeitleiste_mit;} else {
if ((tag == 5) && (woche == 0)) {zeitleiste_gestern = zeitleiste_don;} else {
if ((tag == 6) && (woche == 0)) {zeitleiste_gestern = zeitleiste_fre;} else {
if ((tag == 7) && ((woche == 0) || (woche == 3))) {zeitleiste_gestern = zeitleiste_sam;} else {
if ((tag >= 2) && (tag <= 6) && ((woche == 1) || (woche == 3))) {zeitleiste_gestern = zeitleiste_mon;} else {
if (((tag == 1) || (tag == 7)) && (woche == 1)) {zeitleiste_gestern = zeitleiste_sam;} else {
if (woche == 2) {zeitleiste_gestern = zeitleiste_mon;} }}}}}}}}}
heizwert = zeitleiste_gestern.Substr(47, 1);
} else {
heizwert = zeitleiste_heute.Substr((sTime-1), 1);
}
! Temperatur bestimmen, die in der letzten 30 Minutenn war
if (heizwert == "0") {soll_alt = grad_0;} else {
if (heizwert == "1") {soll_alt = grad_1;} else {
if (heizwert == "2") {soll_alt = grad_2;} else {
if (heizwert == "3") {soll_alt = grad_3;} else {
if (heizwert == "4") {soll_alt = grad_4;} else {
if (heizwert == "5") {soll_alt = grad_5;} else {
if (heizwert == "6") {soll_alt = grad_6;} else {
if (heizwert == "7") {soll_alt = grad_7;} else {
if (heizwert == "8") {soll_alt = grad_8;} else {
if (heizwert == "9") {soll_alt = grad_9;} }}}}}}}}}
} !Ende IF Anwesenheit
} !Ende IF Gaeste
} !Ende IF Urlaub
} !Ende IF Partytemperatur
} !Ende IF Fenster offen
} !Ende IF Heizungsperiode
if (soll_ist >= 0) { ! Wenn RT geantwortet hat (Sollwert konnte ausgelesen werden)...
! ...dann prüfen ob neue Solltemperatur in RT geschrieben werden muss.
if (soll_ist <> soll_neu) { ! Wenn aktuelle Solltemperatur = neue Solltemp., dann nichts machen
time now = system.Date("%Y-%m-%d %H:%M:%S").ToTime(); ! wie spät ist es jetzt?
rt_timestamp = regler.Timestamp();
integer diff = now.ToInteger() - rt_timestamp.ToInteger();
if ((diff >= setdelta) || (prioritaet) || (soll_ist == grad_fenster) || (sv_timestamp >= rt_timestamp) || ((soll_ist == soll_alt) && (soll_alt <> soll_neu))) {
! Temperatur setzen
regler.State(soll_neu);
integer regler_gesetzt = 1;
if (debug) {
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.debug Raumthermostat " # raum # " neu gesetzt!\n");
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.debug alte_Solltemperatur: " # soll_ist # " neue_Solltemperatur: " # soll_neu # "\n");
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.debug Letzte_Aenderung: " # rt_timestamp # " Zeitdifferenz:_" # diff # "sek.");
}
}
}
} else {
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.debug Raumthermostat " # raum # " antwortet nicht!");
}
Consolen Output in Var/log/messages:
Code: Alles auswählen
May 23 21:56:07 ccu3-webui local0.err ReGaHss: ERROR: ScriptRuntimeError: string raum = "Garagen_Flur"; ! Version 1.7.2 ! Script von Erik Groennerud - 8.2009- MM.2010 ! Ergaenzung von Zauberlehrling ! Optimiert und ergaenzt von Petrus (Peter) ! Folgende Systemvariable werden ben▒tigt: ! Heizanlage (boolean) 0 = Zentralheizung an, 1 = aus. Thermostate werden bei abgeschalteter Zentralheizung ge▒ffnet ! Gaeste (boolean) 1= G▒ste im Haus, 0 keine G▒ste ! Urlaub (boolean) 1= Im Urlaub, 0 zu Hause ! Anwesenheit (boolean) 1=zu Hause, 0 weg ! Partytemperatur,(zahl) default -1, Ansonsten Temperatur, Wertebereich: -1 bis 100 ! Feiertag (boolean) 1=Feiertag, 0 kein Feiertag ! Temperaturen 8-30 Grad, 0 = OFF, 100=ON real grad_0 = 6; real grad_1 = 18; real grad_2 = 19; real grad_3 = 20; real grad_4 = 21; real grad_5 = 22; real grad_6 = 23; real grad_7 = 24; real grad_8 = 25; real grad_9 = 100; real grad_fenster = 6; ! Temperatur bei offenem Fenster -1 = off real grad_urlaub = 14; ! Temperatur im Urlaub -1 = off real grad_g
May 23 21:56:07 ccu3-webui user.debug script: alte_Solltemperatur: 4.500000 neue_Solltemperatur: 0.000000
May 23 21:56:07 ccu3-webui user.debug script: Raumthermostat Garagen_Flur neu gesetzt!
May 23 21:56:07 ccu3-webui user.debug script: Letzte_Aenderung: 2019-05-23 21:55:33 Zeitdifferenz:_34sek.
Ich hoffe es kann mal jemand drüber gucken... und uns helfen.
Ich weiß nicht, was die Homeatic von mir will.
Please help
Danke