so sieht das bei mir aus:
private function CalcNextSteps() {
$DeviceName = IPS_GetIdent($this->deviceId);
$DeviceConfig = get_ShadowingConfiguration();
$Position = $this->GetVariableValue(c_Control_Position);
$ToBeMoved = $this->GetVariableValue(c_Control_Movement);
$StepsToDo = array();
//BOMMH c_MovementId_Opened und c_MovementId_Up wurden getrennt
if ($ToBeMoved==c_MovementId_Opened) {
$SecTotal = $DeviceConfig[$DeviceName][c_Property_TimeOpening];
$SecNullToPos = $SecTotal*$Position/100 + 2; // BOMMH Somit wird immer die Gesamte Distanz aufgefahren und es ist sicher gestellt, dass der Rollladen offen ist. Original: $SecNullToPos = $SecTotal*$Position/100;
$SecPosTo100 = $SecTotal-$SecNullToPos;
$this->AddNextStep($StepsToDo, c_MovementId_Up, $SecTotal-$SecPosTo100, null, $SecTotal, $SecPosTo100);
$this->AddNextStep($StepsToDo, c_MovementId_Stop, $DeviceConfig[$DeviceName][c_Property_TimePause], 'Offen (Stop)', null, null);
$this->AddNextStep($StepsToDo, c_MovementId_Opened, 1, null, null , null);
} elseif ($ToBeMoved==c_MovementId_Up) {
$SecTotal = $DeviceConfig[$DeviceName][c_Property_TimeOpening];
$this->AddNextStep($StepsToDo, c_MovementId_Up, $SecTotal, null, $SecTotal, 0); //BOMMH $this->AddNextStep($StepsToDo, c_MovementId_Up, $SecTotal-$SecPosTo100, null, $SecTotal, $SecPosTo100);
$this->AddNextStep($StepsToDo, c_MovementId_Stop, $DeviceConfig[$DeviceName][c_Property_TimePause], 'Offen (Stop)', null, null);
} elseif ($ToBeMoved==c_MovementId_MovedIn or $ToBeMoved==c_MovementId_MovingIn) {
$SecTotal = $DeviceConfig[$DeviceName][c_Property_TimeOpening];
$SecNullToPos = $SecTotal*$Position/100;
$SecPosTo100 = $SecTotal-$SecNullToPos;
$this->AddNextStep($StepsToDo, c_MovementId_MovingIn, $SecTotal-$SecPosTo100, null, $SecTotal, $SecPosTo100);
$this->AddNextStep($StepsToDo, c_MovementId_Stop, $DeviceConfig[$DeviceName][c_Property_TimePause], 'Offen (Stop)', null, null);
$this->AddNextStep($StepsToDo, c_MovementId_MovedIn, 1, null, null , null);
} elseif ($ToBeMoved==c_MovementId_Shadowing or $ToBeMoved==c_MovementId_Down or $ToBeMoved==c_MovementId_Dimout or $ToBeMoved==c_MovementId_Closed or $ToBeMoved==c_MovementId_MovingOut or $ToBeMoved==c_MovementId_MovedOut) {
$SecTotal = $DeviceConfig[$DeviceName][c_Property_TimeClosing];
$SecNullToPos = $SecTotal*$Position/100;
if ($ToBeMoved==c_MovementId_Dimout) {
$this->AddNextStep($StepsToDo, c_MovementId_Down, $SecTotal-$SecNullToPos, null, $SecTotal, $SecNullToPos);
$this->AddNextStep($StepsToDo, c_MovementId_Stop, $DeviceConfig[$DeviceName][c_Property_TimePause], 'Abdunkelung (Pause)', null, null);
$this->AddNextStep($StepsToDo, c_MovementId_Up, $DeviceConfig[$DeviceName][c_Property_TimeDimoutUp], 'Abdunkelung (Hoch)', null, null);
$this->AddNextStep($StepsToDo, c_MovementId_Stop, $DeviceConfig[$DeviceName][c_Property_TimePause], 'Abdunkelung (Pause)', null, null);
$this->AddNextStep($StepsToDo, c_MovementId_Down, $DeviceConfig[$DeviceName][c_Property_TimeDimoutDown], 'Abdunkelung (Runter)', null, null);
$this->AddNextStep($StepsToDo, c_MovementId_Stop, $DeviceConfig[$DeviceName][c_Property_TimePause], 'Abdunkelung (Stop)', null, null);
$this->AddNextStep($StepsToDo, c_MovementId_Dimout, 1, null, null, null);
} elseif ($ToBeMoved==c_MovementId_Down) {
$this->AddNextStep($StepsToDo, c_MovementId_Down, $SecTotal, null, $SecTotal, 0); //BOMMH $this->AddNextStep($StepsToDo, c_MovementId_Down, $SecTotal-$SecNullToPos, null, $SecTotal, $SecNullToPos);
$this->AddNextStep($StepsToDo, c_MovementId_Stop, 1, null, null, null);
} elseif ($ToBeMoved==c_MovementId_MovedOut or $ToBeMoved==c_MovementId_MovingOut) {
$this->AddNextStep($StepsToDo, c_MovementId_MovingOut, $SecTotal-$SecNullToPos, null, $SecTotal, $SecNullToPos);
$this->AddNextStep($StepsToDo, c_MovementId_Stop, 1, null, null, null);
$this->AddNextStep($StepsToDo, c_MovementId_MovedOut, 1, null, null, null);
} elseif ($ToBeMoved==c_MovementId_Shadowing) {
$this->AddNextStep($StepsToDo, c_MovementId_Down, $SecTotal-$SecNullToPos, null, $SecTotal, $SecNullToPos);
$this->AddNextStep($StepsToDo, c_MovementId_Stop, 1, "$Position%", null, null);
$this->AddNextStep($StepsToDo, c_MovementId_Up, $DeviceConfig[$DeviceName][c_Property_TimeDimoutUp], 'Beschattung (Hoch)', null, null);
$this->AddNextStep($StepsToDo, c_MovementId_Stop, $DeviceConfig[$DeviceName][c_Property_TimePause], 'Beschattung (Stop)', null, null);
$this->AddNextStep($StepsToDo, c_MovementId_Shadowing, 1, null, null, null);
} else { // Beinhalted c_MovementId_Closed
$SecNullToPos = $SecTotal*$Position/100 - 2; //BOMMH Somit wird immer die Gesamte Distanz zugefahren und es ist sicher gestellt, dass der Rollladen zu ist. Original: $SecNullToPos = $SecTotal*$Position/100;
$this->AddNextStep($StepsToDo, c_MovementId_Down, $SecTotal-$SecNullToPos, null, $SecTotal, $SecNullToPos);
$this->AddNextStep($StepsToDo, c_MovementId_Stop, 1, "$Position%", null, null);
$this->AddNextStep($StepsToDo, c_MovementId_Closed, 1, null, null, null);
}
} elseif ($ToBeMoved==c_MovementId_90 or $ToBeMoved==c_MovementId_75 or $ToBeMoved==c_MovementId_50 or $ToBeMoved==c_MovementId_25) { //Die Berechnung ist falsch, da sie nur Abwärtszeiten Berücksichtigt!
// BOMMH Nimmt für Aufwärts und Abwärts unterschiedliche Zeiten für die Berechnung: Original:$SecTotal = $DeviceConfig[$DeviceName][c_Property_TimeClosing];
if ($ToBeMoved > $Position) $SecTotal = $DeviceConfig[$DeviceName][c_Property_TimeClosing];
if ($ToBeMoved < $Position) $SecTotal = $DeviceConfig[$DeviceName][c_Property_TimeOpening];
//EOMMH
$ShadowingType = $DeviceConfig[$DeviceName][c_Property_ShadowingType];
$SecNullToPos = $SecTotal*$Position/100;
$SecPosTo100 = $SecTotal-$SecNullToPos;
if ($ToBeMoved==c_MovementId_90) {
$SecNullToNew = $SecTotal*90/100;
$Position = 90;
} elseif ($ToBeMoved==c_MovementId_75) {
$SecNullToNew = $SecTotal*75/100;
$Position = 75;
} elseif ($ToBeMoved==c_MovementId_50) {
$SecNullToNew = $SecTotal*50/100;
$Position = 50;
} else {
$SecNullToNew = $SecTotal*25/100;
$Position = 25;
}
if ($SecNullToNew > $SecNullToPos) {
if ($ShadowingType==c_ShadowingType_Marquees) {
$this->AddNextStep($StepsToDo, c_MovementId_MovingOut, $SecNullToNew-$SecNullToPos, null, $SecTotal, $SecNullToPos);
} else {
$this->AddNextStep($StepsToDo, c_MovementId_Down, $SecNullToNew-$SecNullToPos, null, $SecTotal, $SecNullToPos);
}
} elseif ($SecNullToNew < $SecNullToPos) {
if ($ShadowingType==c_ShadowingType_Marquees) {
$this->AddNextStep($StepsToDo, c_MovementId_MovingIn, $SecNullToPos-$SecNullToNew, null, $SecTotal, $SecPosTo100);
} else {
$this->AddNextStep($StepsToDo, c_MovementId_Up, $SecNullToPos-$SecNullToNew, null, $SecTotal, $SecPosTo100);
}
} else {
}
$this->AddNextStep($StepsToDo, c_MovementId_Stop, 1, "$Position%", null, null);
$this->AddNextStep($StepsToDo, $ToBeMoved, 1, null, null, null);
} elseif ($ToBeMoved==c_MovementId_Stop) {
$this->AddNextStep($StepsToDo, c_MovementId_Stop, 1, null, null, null);
} else {
throw new Exception ("Unknown MovementId $ToBeMoved, DeviceId=".$this->deviceId);
exit;
}
$this->SetVariableValue(c_Control_StepsToDo, implode('|', $StepsToDo));
$this->SetVariableValue(c_Control_Step, -5);
}
Zu nächst habe ich „Offen“ und „Hoch“ getrennt. Hoch fährt IMMER die maximale Zeit. Bei Hoch werden 2 Sekunden auf die Fahrzeit addiert.
Gleiches gilt andersrum für „Geschlossen“ und „Runter“.
Für die % Fahrten habe ich eine Fallunterscheidung für „nach oben“ „nach unten“ eingebaut, damit die korrekte Zeit bestimmt wird. Das hat den Grund, dass bei mir die Zeiten für Öffnen und Schließen unterschiedlich sind.
Hier fählt noch ein herausrechnen der zeit von unten–>zu und zu–>unten.
Gru
Maze