Hier hat der User Elektromann nach einer möglichkeit gefragt, die schaltzeiten über neo zu ändern und danach die programme auf der ccu zu steuern.
http://homematic-forum.de/forum/viewtop ... 35&t=28797
Ich hatte ihm paar ideen zugeworfen, leider konnte er damit nichts anfangen...
Kompliziert ist es nicht, ich habe es jetzt einfach mit paar variablen und paar programmen auf der ccu gelöst, wenn etwas mehr zeit habe versuche ich, es noch mit
einem webserver und einem timepicker aus neo, als webseiten element.
Also der weg mit ccu und neo und drei zeiten welche man aus neo einstellen kann:
Zuerst brauchen wir diese variablen:
Weckzeit - typ zeichenkette, anlegen auf der ccu
WeckerNr - typ werteliste , so anlegen: Wecker 1;Wecker 2;Wecker 3
TriggerWecker -typ werteliste, so anlegen: 09:00:00;13:15:00;18:21:00 - Sekunden werden wir nicht im neo einstellen, so die sekunden immer auf 00 setzen.
Stunden - typ boolean (true/false)
Minuten - typ boolean (true/false)
Hier habe ich eine lösung zum wecker stellen gefunden und das script dafür benutzt, das script läuft einmal am tag, und liest die eingestellten zeiten...
http://homematic-forum.de/forum/viewtop ... 65#p268625
Wir machen erst einmal alles im neo um die zeiten ändern zu können:
ich habe es so bei mir im testlauf angelegt, wie in diesem bild:
Die blauen dinger sind buttons, die pfeile hoch und runter auch
bevor wir weiter machen, alle angelegten variablen jetzt in neo importieren von der ccu!!!
Oben textfeld Wecker auswählen, kein status (text nach wahl )
die drei bleuen buttons mit textfeldern 1,2,3 drüber anlegen
dem ersten button 1 weisen wir aktion zu so:
also der variable- WeckerNr den wert 0 - das ist die erste zeit in der TriggerWecker variable.
zweiter button gleich wie oben nur setze wert auf 1, dritter button, wert auf 2.
dadrunter befindet sich ein textfeld, ausgewählt? in blauer farbe, es ist ein textfeld mit dem präfix "ausgewählt: "
dieses textfeld erhält diesen status:
jetzt können wir schon testen ob das funktioniert:
in vorschau die buttons 1,2,3 klicken und das textfeld ausgewählt musste jetzt zeigen Wecker 1, 2, 3
jetzt die vier buttons anlegen 2 hoch, 2 runter
dem button hoch bei stunden weisen wir diese aktion:
also die variable Stunden schalten wir auf true/wahr
dem button runter bei stunden weisen wir aktion für variable Stunden, off (false/falsch)
Genauso gehen wir für die beiden button für minuten vor:
Button hoch variable Minuten on, Button runter variable Minuten off.
Das rote textfeld ? bekommt diesen status:
diese zeit wird sich beim drücken der buttons für stunden und minuten, verändern, und wird für jeden wecker angezeigt:
dafür legen wir ein programm mit dem namen WeckerAuswahl, so:
in dem dann teil dieses script
Code: Alles auswählen
var weckerAktiv = dom.GetObject("WeckerNr").Value();
var x = dom.GetObject("TriggerWecker").Value();
var y = dom.GetObject("TriggerWecker").ValueList();
if (weckerAktiv == 0)
{
var Zeit1 = y.StrValueByIndex(";",1);
var Zeit2 = y.StrValueByIndex(";",2);
var Stunden = y.StrValueByIndex(";",0).Substr(0,2).ToInteger();
var Minuten = y.StrValueByIndex(";",0).Substr(3,2);
var Sekunden = "00";
dom.GetObject("Weckzeit").State((Stunden).ToString() + ":" + Minuten + ":" + Sekunden);
}
if (weckerAktiv == 1)
{
var Zeit0 = y.StrValueByIndex(";",0);
var Zeit2 = y.StrValueByIndex(";",2);
var Stunden = y.StrValueByIndex(";",1).Substr(0,2).ToInteger();
var Minuten = y.StrValueByIndex(";",1).Substr(3,2);
var Sekunden = "00";
dom.GetObject("Weckzeit").State((Stunden).ToString() + ":" + Minuten + ":" + Sekunden);
}
if (weckerAktiv == 2)
{
var Zeit0 = y.StrValueByIndex(";",0);
var Zeit1 = y.StrValueByIndex(";",1);
var Stunden = y.StrValueByIndex(";",2).Substr(0,2).ToInteger();
var Minuten = y.StrValueByIndex(";",2).Substr(3,2);
var Sekunden = "00";
dom.GetObject("Weckzeit").State((Stunden).ToString() + ":" + Minuten + ":" + Sekunden);
}
jetzt sollte für jeden wecker die eingestellte zeit im roten textfeld erscheinen.
Jetzt machen wir ein programm auf der ccu um die stunden hoch und runter zu zählen:
Name z.b. StundenPlusMinus
bei aktivität dann das script einfügen:
Code: Alles auswählen
var weckerAktiv = dom.GetObject("WeckerNr").Value();
var x = dom.GetObject("TriggerWecker").Value();
var y = dom.GetObject("TriggerWecker").ValueList();
if (weckerAktiv == 0)
{
var Zeit1 = y.StrValueByIndex(";",1);
var Zeit2 = y.StrValueByIndex(";",2);
var Stunden = y.StrValueByIndex(";",0).Substr(0,2).ToInteger();
var Minuten = y.StrValueByIndex(";",0).Substr(3,2);
var Sekunden = "00";
Stunden = Stunden + 1;
if (Stunden > 23)
{
Stunden = 0;
}
if (Stunden <= 9)
{
string Zeit0 = "0" + Stunden.ToString() + ":" + Minuten + ":" + Sekunden;
}
else
{
string Zeit0 = Stunden.ToString() + ":" + Minuten + ":" + Sekunden;
}
dom.GetObject("Weckzeit").State(Zeit0);
dom.GetObject("TriggerWecker").ValueList(Zeit0 + ";"+ Zeit1 + ";" + Zeit2);
}
if (weckerAktiv == 1)
{
var Zeit0 = y.StrValueByIndex(";",0);
var Zeit2 = y.StrValueByIndex(";",2);
var Stunden = y.StrValueByIndex(";",1).Substr(0,2).ToInteger();
var Minuten = y.StrValueByIndex(";",1).Substr(3,2);
var Sekunden = "00";
Stunden = Stunden + 1;
if (Stunden > 23)
{
Stunden = 0;
}
if (Stunden <= 9)
{
string Zeit1 = "0" + Stunden.ToString() + ":" + Minuten + ":" + Sekunden;
}
else
{
string Zeit1 = Stunden.ToString() + ":" + Minuten + ":" + Sekunden;
}
dom.GetObject("Weckzeit").State(Zeit1);
dom.GetObject("TriggerWecker").ValueList(Zeit0 + ";"+ Zeit1 + ";" + Zeit2);
}
if (weckerAktiv == 2)
{
var Zeit0 = y.StrValueByIndex(";",0);
var Zeit1 = y.StrValueByIndex(";",1);
var Stunden = y.StrValueByIndex(";",2).Substr(0,2).ToInteger();
var Minuten = y.StrValueByIndex(";",2).Substr(3,2);
var Sekunden = "00";
Stunden = Stunden + 1;
if (Stunden > 23)
{
Stunden = 0;
}
if (Stunden <= 9)
{
string Zeit2 = "0" + Stunden.ToString() + ":" + Minuten + ":" + Sekunden;
}
else
{
string Zeit2 = Stunden.ToString() + ":" + Minuten + ":" + Sekunden;
}
dom.GetObject("Weckzeit").State(Zeit2);
dom.GetObject("TriggerWecker").ValueList(Zeit0 + ";"+ Zeit1 + ";" + Zeit2);
}
Code: Alles auswählen
var weckerAktiv = dom.GetObject("WeckerNr").Value();
var x = dom.GetObject("TriggerWecker").Value();
var y = dom.GetObject("TriggerWecker").ValueList();
if (weckerAktiv == 0)
{
var Zeit1 = y.StrValueByIndex(";",1);
var Zeit2 = y.StrValueByIndex(";",2);
var Stunden = y.StrValueByIndex(";",0).Substr(0,2).ToInteger();
var Minuten = y.StrValueByIndex(";",0).Substr(3,2);
var Sekunden = "00";
Stunden = Stunden - 1;
if (Stunden < 0)
{
Stunden = 23;
}
if (Stunden <= 9)
{
string Zeit0 = "0" + Stunden.ToString() + ":" + Minuten + ":" + Sekunden;
}
else
{
string Zeit0 = Stunden.ToString() + ":" + Minuten + ":" + Sekunden;
}
dom.GetObject("Weckzeit").State(Zeit0);
dom.GetObject("TriggerWecker").ValueList(Zeit0 + ";"+ Zeit1 + ";" + Zeit2);
}
if (weckerAktiv == 1)
{
var Zeit0 = y.StrValueByIndex(";",0);
var Zeit2 = y.StrValueByIndex(";",2);
var Stunden = y.StrValueByIndex(";",1).Substr(0,2).ToInteger();
var Minuten = y.StrValueByIndex(";",1).Substr(3,2);
var Sekunden = "00";
Stunden = Stunden - 1;
if (Stunden < 0)
{
Stunden = 23;
}
if (Stunden <= 9)
{
string Zeit1 = "0" + Stunden.ToString() + ":" + Minuten + ":" + Sekunden;
}
else
{
string Zeit1 = Stunden.ToString() + ":" + Minuten + ":" + Sekunden;
}
dom.GetObject("Weckzeit").State(Zeit1);
dom.GetObject("TriggerWecker").ValueList(Zeit0 + ";"+ Zeit1 + ";" + Zeit2);
}
if (weckerAktiv == 2)
{
var Zeit0 = y.StrValueByIndex(";",0);
var Zeit1 = y.StrValueByIndex(";",1);
var Stunden = y.StrValueByIndex(";",2).Substr(0,2).ToInteger();
var Minuten = y.StrValueByIndex(";",2).Substr(3,2);
var Sekunden = "00";
Stunden = Stunden - 1;
if (Stunden < 0)
{
Stunden = 23;
}
if (Stunden <= 9)
{
string Zeit2 = "0" + Stunden.ToString() + ":" + Minuten + ":" + Sekunden;
}
else
{
string Zeit2 = Stunden.ToString() + ":" + Minuten + ":" + Sekunden;
}
dom.GetObject("Weckzeit").State(Zeit2);
dom.GetObject("TriggerWecker").ValueList(Zeit0 + ";"+ Zeit1 + ";" + Zeit2);
}
und die Stunden werden hoch, bzw. runter gezählt. Gleichzeitig wird die variable TriggerWecker verändert, je nach dem welcher wecker ausgewählt wurde (1,2,3)
wenn das funktioniert dann machen wir noch ein programm für minuten:
Name MinutenPlusMinus im dann teil dieses script:
Code: Alles auswählen
var weckerAktiv = dom.GetObject("WeckerNr").Value();
var x = dom.GetObject("TriggerWecker").Value();
var y = dom.GetObject("TriggerWecker").ValueList();
if (weckerAktiv == 0)
{
var Zeit1 = y.StrValueByIndex(";",1);
var Zeit2 = y.StrValueByIndex(";",2);
var Stunden = y.StrValueByIndex(";",0).Substr(0,2);
var Minuten = y.StrValueByIndex(";",0).Substr(3,2).ToInteger();
var Sekunden = "00";
Minuten = Minuten + 1;
if (Minuten > 59)
{
Minuten = 0;
}
if (Minuten <= 9)
{
string Zeit0 = Stunden + ":" + "0" + Minuten.ToString() + ":" + Sekunden;
}
else
{
string Zeit0 = Stunden + ":" + Minuten.ToString() + ":" + Sekunden;
}
dom.GetObject("Weckzeit").State(Zeit0);
dom.GetObject("TriggerWecker").ValueList(Zeit0 + ";"+ Zeit1 + ";" + Zeit2);
}
if (weckerAktiv == 1)
{
var Zeit0 = y.StrValueByIndex(";",0);
var Zeit2 = y.StrValueByIndex(";",2);
var Stunden = y.StrValueByIndex(";",1).Substr(0,2);
var Minuten = y.StrValueByIndex(";",1).Substr(3,2).ToInteger();
var Sekunden = "00";
Minuten = Minuten + 1;
if (Minuten > 59)
{
Minuten = 0;
}
if (Minuten <= 9)
{
string Zeit1 = Stunden + ":" + "0" + Minuten.ToString() + ":" + Sekunden;
}
else
{
string Zeit1 = Stunden + ":" + Minuten.ToString() + ":" + Sekunden;
}
dom.GetObject("Weckzeit").State(Zeit1);
dom.GetObject("TriggerWecker").ValueList(Zeit0 + ";"+ Zeit1 + ";" + Zeit2);
}
if (weckerAktiv == 2)
{
var Zeit0 = y.StrValueByIndex(";",0);
var Zeit1 = y.StrValueByIndex(";",1);
var Stunden = y.StrValueByIndex(";",2).Substr(0,2);
var Minuten = y.StrValueByIndex(";",2).Substr(3,2).ToInteger();
var Sekunden = "00";
Minuten = Minuten + 1;
if (Minuten > 59)
{
Minuten = 0;
}
if (Minuten <= 9)
{
string Zeit2 = Stunden + ":" + "0" + Minuten.ToString() + ":" + Sekunden;
}
else
{
string Zeit2 = Stunden + ":" + Minuten.ToString() + ":" + Sekunden;
}
dom.GetObject("Weckzeit").State(Zeit2);
dom.GetObject("TriggerWecker").ValueList(Zeit0 + ";"+ Zeit1 + ";" + Zeit2);
}
Code: Alles auswählen
var weckerAktiv = dom.GetObject("WeckerNr").Value();
var x = dom.GetObject("TriggerWecker").Value();
var y = dom.GetObject("TriggerWecker").ValueList();
if (weckerAktiv == 0)
{
var Zeit1 = y.StrValueByIndex(";",1);
var Zeit2 = y.StrValueByIndex(";",2);
var Stunden = y.StrValueByIndex(";",0).Substr(0,2);
var Minuten = y.StrValueByIndex(";",0).Substr(3,2).ToInteger();
var Sekunden = "00";
Minuten = Minuten - 1;
if (Minuten < 0)
{
Minuten = 59;
}
if (Minuten <= 9)
{
string Zeit0 = Stunden + ":" + "0" + Minuten.ToString() + ":" + Sekunden;
}
else
{
string Zeit0 = Stunden + ":" + Minuten.ToString() + ":" + Sekunden;
}
dom.GetObject("Weckzeit").State(Zeit0);
dom.GetObject("TriggerWecker").ValueList(Zeit0 + ";"+ Zeit1 + ";" + Zeit2);
}
if (weckerAktiv == 1)
{
var Zeit0 = y.StrValueByIndex(";",0);
var Zeit2 = y.StrValueByIndex(";",2);
var Stunden = y.StrValueByIndex(";",1).Substr(0,2);
var Minuten = y.StrValueByIndex(";",1).Substr(3,2).ToInteger();
var Sekunden = "00";
Minuten = Minuten - 1;
if (Minuten < 0)
{
Minuten = 59;
}
if (Minuten <= 9)
{
string Zeit1 = Stunden + ":" + "0" + Minuten.ToString() + ":" + Sekunden;
}
else
{
string Zeit1 = Stunden + ":" + Minuten.ToString() + ":" + Sekunden;
}
dom.GetObject("Weckzeit").State(Zeit1);
dom.GetObject("TriggerWecker").ValueList(Zeit0 + ";"+ Zeit1 + ";" + Zeit2);
}
if (weckerAktiv == 2)
{
var Zeit0 = y.StrValueByIndex(";",0);
var Zeit1 = y.StrValueByIndex(";",1);
var Stunden = y.StrValueByIndex(";",2).Substr(0,2);
var Minuten = y.StrValueByIndex(";",2).Substr(3,2).ToInteger();
var Sekunden = "00";
Minuten = Minuten - 1;
if (Minuten < 0)
{
Minuten = 59;
}
if (Minuten <= 9)
{
string Zeit2 = Stunden + ":" + "0" + Minuten.ToString() + ":" + Sekunden;
}
else
{
string Zeit2 = Stunden + ":" + Minuten.ToString() + ":" + Sekunden;
}
dom.GetObject("Weckzeit").State(Zeit2);
dom.GetObject("TriggerWecker").ValueList(Zeit0 + ";"+ Zeit1 + ";" + Zeit2);
}
Jetzt kann man schon die eingestellten Zeiten für die Variable TriggerWecker in der ccu sehen, bei jeder änderung in neo
dazu in der ccu webui, bei einstellungen, Systemvariablen schauen ob der wert in neo, dem in der ccu ist.
Wenn es so ist brauchen wir noch das eigentliche script aus dem thread, welches mich auf die ideee mit dem neowecker gebracht hat
Also ein programm anlegen mit dem Namen WeckerScript
zeitmodul so einstellen:
im dann teil dieses script:
Code: Alles auswählen
!Trigger Wecker
string lTriggerSysVarName = "TriggerWecker"; !Systemvariable vom Typ Werteliste
!-----------Ende Einstellungen--------------------
object lTmpObj1 = null;
object lTmpObj2 = null;
object lTmpObj3 = null;
object lTmpObj4 = null;
integer liZ1;
string lSplit1;
string lTmpList1 = "";
time lTmpDateTime1;
time lTmpDateTime2;
time lDateTime = (system.Date("%F %X")).ToTime();
integer lSecondsAfterMidnight = (lDateTime.Hour() * 3600) + (lDateTime.Minute() * 60) + lDateTime.Second();
if (dom.GetObject(lTriggerSysVarName))
{
lTmpList1 = dom.GetObject(lTriggerSysVarName).ValueList();
if (lTmpList1 <> "")
{
lTmpObj1 = dom.CreateObject(OT_PROGRAM);
lTmpObj1.Name("AutoCreateTrigger");
lTmpObj2 = lTmpObj1.Rule();
lTmpObj3 = lTmpObj2.RuleDestination();
liZ1 = 0;
foreach(lSplit1, lTmpList1.Split(";"))
{
lTmpDateTime1 = ("1970-01-02 " # lSplit1).ToTime() - lSecondsAfterMidnight;
lTmpObj4 = lTmpObj3.DestAddSingle();
lTmpObj4.DestinationParam(19);
lTmpObj4.DestinationDP(dom.GetObject(lTriggerSysVarName).ID());
lTmpObj4.DestinationValueType(16);
lTmpObj4.DestinationValue(liZ1);
lTmpObj4.DestinationValueParamType(28);
lTmpObj4.DestinationValueParam("1970-01-01" # " " # lTmpDateTime1.Format("%H:%M:%S"));
liZ1 = liZ1 + 1;
}
lTmpObj1.ProgramExecute();
dom.DeleteObject(lTmpObj1.ID());
}
}
jetzt stellen wir im neo die wecker so nach aktueller zeit des ausprobierens
wenn sagen wir jetzt 18:00 Uhr ist stellen wir die wecker auf 1.) 18:10:00, 2.) 18:11:00, 3.) 18.12:00
auf der ccu brauchen wir jetzt ein programm der das schaltet nach den weckerzeiten:
im wenn teil wählen wir die systemvariable TriggerWeckzeit bei und wählen die zeit 18:11:00 also die zweite zeit
im dann teil schalten wir ein licht ein, also gerät, lichtwohnzimmer sofort ein
im sonst wenn teil wählen wir die systemvariable TriggerWeckzeit bei und wählen die zeit 18:12:00 also die dritte zeit.
in der aktivität für sonst wenn schalten wir unseren schalter aus.
programm speichern und jetzt über die webui der ccu das programm WeckerScript manuell starten.
Um die eingestellte zeit sollte jetzt das licht angehen und eine minute später wieder aus.
Mit diesen drei zeiten schalten wir dann jeden tag die geräte/programme...
Wenn man die zeiten in neo ändert muss man dann dieses programm einmal aufrufen mit neo
Das ist der button Weckzeiten setzen, als aktion das programm WeckerScript ausführen.
Bitte beachten wieder alle programme von der ccu in neo zu importieren, bevor man dem button diese aktion zuweisen kann.
Zur verständnis nochmal
Hat man die zeiten jetzt gesetzt und will das morgen nach diesen zeiten geschaltet wird muss man diesen button, Weckzeiten setzen nicht klicken, das programm wird um 00:05 uhr
von der ccu ausgeführt und wird an den eingestellten zeiten, das tun was wir in den programmen wollen/schalten.
Ändert man die zeiten morgens im neo und möchte das heute noch geschaltet wird, muss man nach dem alle zeiten nach wunsch angelegt sind (alle oder einzelnen wecker),
diesen button/programm klicken, dann wird es noch heute und tage danach so ausgeführt, bzw. bis mann wieder manuell die weckzeiten aktualisiert.
Viel Spass beim umsetzen
Edit: Wenn man zusätzliche Zeiten für den Wecker haben möchte, trägt man in die TriggerWecker Variable einfach so viele Zeiten wie man möchte ein.
z.b. (09:00:00;13:15:00;18:21:00;16:00:00;11:20:00;21:00:00) jetzt kann man immer die ersten drei aus Neo verändern, die restlichen werden von dem WeckerScript auch verarbeitet...
auf diese kann man dann einfach in Programmen reagieren/schalten...einfach die Variable TriggerWecker im wenn teil auf aktualisierung prüfen, die vierte, fünfte usw. zeit.