ich möchte euch im Folgenden meine Lösung für einen Schaltaktor/Swischenstecker vorstellen, mit dem ich folgendes realisiert habe:
Anforderungen:
- Ich möchte das der Verbraucher maximal in Summe eine bestimmte Betriebstunden/sekunden Zahl innerhalb eines Timeframes nicht überschreitet
- Ich möchte einen Timeframe setzen, in dem der Zwischenstecker/Aktor aktiv sein kann (der Verbraucher Strom bekommt)
Anwendung:
Ich hab ein Fernseher der an den Zwischenstecker dran soll. Meine Tochter soll zwischen 14:00 und 19:00 Uhr maximal 2 Stunden fernsehen können. Sie soll selbst entscheiden, wann sie diese Zeit (7200 Sekunden) nutzt. Das heißt, dass Sie jederzeit mit dem Betätigen des Buttons an dem Zwischenstecker die Stromzufuhr ein bzw. ausschalten kann. Überschreitet die Betriebsekundenzahl die vorher definierte Begrenzung, soll der Aktor sofort ausschalten.
Hier die Lösung:
Zunächst einmal müsst Ihr 5 Variablen anlegen und diese mit dem Kanal des Zwischensteckers verbinden.
- "Fernseher Meral Einschaltzeit" --> Zeichenkette
- "Fernseher Meral Betriebsekunden" --> Zahl bis 65000
- "Fernseher Meral Begrenzung" --> "7200.00" (Sekunden)
- "Fernseher Meral Timeframe START" --> "14:00"
- "Fernseher Meral Timeframe STOP" --> "19:00" Anschließend schreibt Ihr ein Programm, dass den Zustand Ein und Aus des Zwischensteckers abfragt. Im Zusatnd EIN führt Ihr folgenden Skript aus:
Code: Alles auswählen
!Bedingung --> EIN
!Get Begrenzung
integer iBegrenzung= dom.GetObject("Fernseher Meral Begrenzung").Variable().ToInteger();
!Get Kummulierte Zeit (Betriebsekunden)
integer iKumZeit= dom.GetObject("Fernseher Meral Betriebsekunden").Variable().ToInteger();
!Einschaltzeit setzen um später beim ausschalten neue Betriebsekunden auszurechnen
var EinZeit= dom.GetObject("Fernseher Meral Einschaltzeit");
EinZeit.State(system.Date("%F %T"));
time tEinZeit= EinZeit.State().ToTime();
integer iEinZeit = tEinZeit.ToInteger();
!GET Timeframe Start
string sTFStart=system.Date("%F ")# dom.GetObject("Fernseher Meral Timeframe START").Variable()#":00";
time tTFStart = sTFStart.ToTime();
integer iTFStart = tTFStart.ToInteger();
!GET Timeframe Stop
string sTFStop=system.Date("%F ")# dom.GetObject("Fernseher Meral Timeframe STOP").Variable()#":00";
time tTFStop = sTFStop.ToTime();
integer iTFStop = tTFStop.ToInteger();
!Überprüfen ob die Restzeit ausserhalb des Timeframes liegt. Wenn Ja, dann neue Restzeit ausrechnen
integer iRest = iBegrenzung - iKumZeit;
if (iRest > (iTFStop-iEinZeit)){
iRest = iTFStop-iEinZeit;
}
!Überprüfen ob noch Restzeit da und ob die Einschaltzeit innerhalb des Frames liegt.
if ((iRest <= 0) || (iEinZeit<iTFStart) || (iEinZeit>iTFStop)){
dom.GetObject("BidCos-RF.JEQ0697818:1.STATE").State(0);
}else{
dom.GetObject("BidCos-RF.JEQ0697818:1.ON_TIME").State(iRest);
dom.GetObject("BidCos-RF.JEQ0697818:1.STATE").State(1);
}
Code: Alles auswählen
!Bedingung AUS
integer iKumZeit= dom.GetObject("Fernseher Meral Betriebsekunden").Variable().ToInteger();
var EinZeit= dom.GetObject("Fernseher Meral Einschaltzeit");
time tEinZeit= EinZeit.State().ToTime();
integer iEinZeit = tEinZeit.ToInteger();
time tAusZeit = system.Date("%F %T").ToTime();
integer iAusZeit = tAusZeit.ToInteger();
integer iNeuBetriebsekunden = iKumZeit + (iAusZeit - iEinZeit);
dom.GetObject("Fernseher Meral Betriebsekunden").State(iNeuBetriebsekunden);
Liebe Grüße
Hasim