Erst einmal vielen Dank für die tollen Scripte, die hier verfügbar sind!
Das Topic ist schon etwas älter, jedoch bin ich gerade auf eine ähnliche Herausforderung gestoßen. Folgendes wollte ich realisieren: Einstellen eines Zeitfensters (IPSSchaltuhr), in dem ein Aktor (in diesem Fall Relais für eine Outdoor Weihnachtsbeleuchtung) in Abhängigkeit der Dämmerung (IPSTwilight) gesteuert wird. Z.B. sollte eine Zeit zwischen 15 und 23 h eingestellt sein. Ab 15 h darf die Beleuchtung an sein, aber nur, wenn auch die Dämmerung begonnen hat. Um 23 h sollte dann ohne weitere Abhängigkeiten ausgeschaltet werden.
Hierzu habe ich folgende Anpassungen an den Scripten vorgenommen:
Script „IPSSchaltuhr_Event“, Zeile 80
if (count($Properts[c_Property_RunSensoren]) == $result and get_ControlValue(c_Control_SollAusgang, $CircleId) == true){
gegen
if (count($Properts[c_Property_RunSensoren]) == $result){
ersetzt.
Fogenden Code zweichen Zeile 82 und 83 hinzugefügt:
set_ControlValue(c_Control_SollAusgang, $CircleId, true);
Hier das gesamte Script:
<?
/*
* This file is part of the IPSLibrary.
*
* The IPSLibrary is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The IPSLibrary is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with the IPSLibrary. If not, see http://www.gnu.org/licenses/gpl.txt.
*/
/**@addtogroup IPSSchaltuhr
* @{
*
* @file IPSSchaltuhr_Event.ips.php
* @author André Czwalina
* @version
* Version 1.00.0, 28.04.2012<br/>
*
*
*/
include_once "IPSSchaltuhr.inc.php";
$eventId = $_IPS['EVENT'];
$strpos = strrpos(IPS_GetName($eventId), '-', 0);
$CircleName = substr(IPS_GetName($eventId),0, $strpos);
// $EventMode = substr(IPS_GetName($eventId), $strpos+1, strlen(IPS_GetName($eventId))-$strpos-1);
$CircleId = get_CirclyIdByCircleIdent($CircleName, ZSU_ID_ZSUZEITEN);
$Properts = get_ZSUConfiguration()[$CircleName];
$Name = $Properts[c_Property_Name];
if (function_exists($CircleName)) {
IPSLogger_Dbg(__file__, 'Zeitschaltuhr CallBack Funktion '.$Name.' Existiert in IPSSchaltuhr_Custom.');
// IPSSchaltuhr_Log('Zeitschaltuhr gestartet: '.$Name.', Aktion: Sensor');
//IPS_LogMessage('IPSSchaltuhr_Event','Zeitschaltuhr gestartet: '.$Name.', Aktion: '.IPS_GetName($eventId));
$OVId = get_ControlId(c_Control_RunAktiv, $CircleId);
$LastDate = IPS_GetVariable($OVId);
if ($LastDate['VariableUpdated']+30 < time()){
set_Overview($CircleId);
}
$result = 0;
$RunAktiv = explode(',', get_ControlValue(c_Control_RunAktiv, $CircleId));
$i=1;
foreach ($Properts[c_Property_RunSensoren] as $PropName=>$PropData) {
$SensorName = $PropData[c_Property_Name];
$SensorID = $PropData[c_Property_SensorID];
$SensorCo = $PropData[c_Property_Condition];
$Value = $PropData[c_Property_Value];
if ((bool)$RunAktiv[$i] == true){
switch ($SensorCo){
case '>':
if (GetValue($SensorID) > $Value) $result++;
break;
case '=':
if (GetValue($SensorID) == $Value) $result++;
break;
case '<':
if (GetValue($SensorID) < $Value) $result++;
break;
}
} else {
$result++;
}
$i++;
}
if (count($Properts[c_Property_RunSensoren]) == $result){
if (get_ControlValue(c_Control_IstAusgang, $CircleId) == false){
// --------------- Aktion -------------------
set_ControlValue(c_Control_SollAusgang, $CircleId, true);
set_ControlValue(c_Control_IstAusgang, $CircleId, true);
IPSLogger_Inf(__file__, 'Starte Callback Aktion für: '.$Name.', Mode: SensorStart');
IPSSchaltuhr_Log('Starte Callback Aktion für: '.$Name.', Mode: SensorStart');
$CircleName($CircleId, 'Start');
}
} elseif (get_ControlValue(c_Control_SollAusgang, $CircleId) == true ){
if (get_ControlValue(c_Control_IstAusgang, $CircleId) == true){
// --------------- Aktion -------------------
set_ControlValue(c_Control_IstAusgang, $CircleId, false);
IPSLogger_Inf(__file__, 'Starte Callback Aktion für: '.$Name.', Mode: SensorStop');
IPSSchaltuhr_Log('Starte Callback Aktion für: '.$Name.', Mode: SensorStop');
$CircleName($CircleId, 'Stop');
}
}
} else {
IPSLogger_Err(__file__, "Zeitschaltuhr CallBack Funktion $CircleName in IPSSchaltuhr_Custom existiert nicht. Schaltuhr: ".$Name);
}
/** @}*/
?>
Durch diesen Eingriff wurde erreicht, dass die RunSensoren auch das Einschalten auslösen, wenn dies nicht zur Startzeit geschehen ist. Damit dies jedoch nur zwischen Start- und Stopzeit geschehen kann, wurde Folgendes geändert:
Script „IPSSchaltuhr_Timer“, folgender Code wurd ab Zeile 80 ergänzt:
$RunAktiv = explode(',', get_ControlValue(c_Control_RunAktiv, $CircleId));
$i=0;
foreach ($Properts[c_Property_RunSensoren] as $PropName=>$PropData) {
if ((bool)$RunAktiv[$i+1] == true){
$EventId = IPSUtil_ObjectIDByPath('Program.IPSLibrary.app.modules.IPSSchaltuhr.IPSSchaltuhr_Event.'.get_ControlType($CircleId).'-'.$i);
IPS_SetEventActive($EventId, true);
}
$i++;
}
Folgender Code wurde ab Zeile 139 ergänzt:
$RunAktiv = explode(',', get_ControlValue(c_Control_RunAktiv, $CircleId));
$i=0;
foreach ($Properts[c_Property_RunSensoren] as $PropName=>$PropData) {
if ((bool)$RunAktiv[$i+1] == true){
$EventId = IPSUtil_ObjectIDByPath('Program.IPSLibrary.app.modules.IPSSchaltuhr.IPSSchaltuhr_Event.'.get_ControlType($CircleId).'-'.$i);
IPS_SetEventActive($EventId, false);
}
$i++;
}
Gesamtes Script:
<?
/*
* This file is part of the IPSLibrary.
*
* The IPSLibrary is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The IPSLibrary is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with the IPSLibrary. If not, see http://www.gnu.org/licenses/gpl.txt.
*/
/**@addtogroup IPSSchaltuhr
* @{
*
* @file IPSSchaltuhr_Timer.ips.php
* @author André Czwalina
* @version
* Version 1.00.0, 28.04.2012<br/>
*
*
*/
include_once "IPSSchaltuhr.inc.php";
switch ($_IPS['SENDER']) {
case 'TimerEvent':
$eventId = $_IPS['EVENT'];
$strpos = strrpos(IPS_GetName($eventId), '-', 0);
$CircleName = substr(IPS_GetName($eventId),0, $strpos);
$EventMode = substr(IPS_GetName($eventId), $strpos+1, strlen(IPS_GetName($eventId))-$strpos-1);
$CircleId = get_CirclyIdByCircleIdent($CircleName, ZSU_ID_ZSUZEITEN);
$Properts = get_ZSUConfiguration()[$CircleName];
$Name = $Properts[c_Property_Name];
if (function_exists($CircleName)) {
IPSLogger_Dbg(__file__, 'Zeitschaltuhr CallBack Funktion '.$Name.' Existiert in IPSSchaltuhr_Custom.');
IPSSchaltuhr_Log('Zeitschaltuhr gestartet: '.$Name.', Aktion: '.$EventMode);
if ($EventMode=='Start'){
$result = 0;
$StartAktiv = explode(',', get_ControlValue(c_Control_StartAktiv, $CircleId));
$i=1;
foreach ($Properts[c_Property_StartSensoren] as $PropName=>$PropData) {
$SensorName = $PropData[c_Property_Name];
$SensorID = $PropData[c_Property_SensorID];
$SensorCo = $PropData[c_Property_Condition];
$Value = $PropData[c_Property_Value];
if ((bool)$StartAktiv[$i] == true){
switch ($SensorCo){
case '>':
if (GetValue($SensorID) > $Value) $result++;
break;
case '=':
if (GetValue($SensorID) == $Value) $result++;
break;
case '<':
if (GetValue($SensorID) < $Value) $result++;
break;
}
} else {
$result++;
}
$i++;
}
if (count($Properts[c_Property_StartSensoren]) == $result){
// --------------- Aktion -------------------
set_ControlValue(c_Control_SollAusgang, $CircleId, true);
set_ControlValue(c_Control_IstAusgang, $CircleId, true);
IPSLogger_Inf(__file__, 'Starte Callback Aktion für: '.$Name.', Mode: '.$EventMode);
IPSSchaltuhr_Log('Starte Callback Aktion für: '.$Name.', Mode: '.$EventMode);
$CircleName($CircleId, $EventMode);
} else {
IPSLogger_Inf(__file__, 'Sensorenbedingungen für: '.$Name.', nicht erfüllt');
IPSSchaltuhr_Log('Sensorenbedingungen für: '.$Name.', nicht erfüllt');
}
$RunAktiv = explode(',', get_ControlValue(c_Control_RunAktiv, $CircleId));
$i=0;
foreach ($Properts[c_Property_RunSensoren] as $PropName=>$PropData) {
if ((bool)$RunAktiv[$i+1] == true){
$EventId = IPSUtil_ObjectIDByPath('Program.IPSLibrary.app.modules.IPSSchaltuhr.IPSSchaltuhr_Event.'.get_ControlType($CircleId).'-'.$i);
IPS_SetEventActive($EventId, true);
}
$i++;
}
}
if ($EventMode=='Stop'){
$result = 0;
$StopAktiv = explode(',', get_ControlValue(c_Control_StopAktiv, $CircleId));
$i=1;
foreach ($Properts[c_Property_StopSensoren] as $PropName=>$PropData) {
$SensorName = $PropData[c_Property_Name];
$SensorID = $PropData[c_Property_SensorID];
$SensorCo = $PropData[c_Property_Condition];
$Value = $PropData[c_Property_Value];
if ((bool)$StopAktiv[$i] == true){
switch ($SensorCo){
case '>':
if (GetValue($SensorID) > $Value) $result++;
break;
case '=':
if (GetValue($SensorID) == $Value) $result++;
break;
case '<':
if (GetValue($SensorID) < $Value) $result++;
break;
}
} else {
$result++;
}
$i++;
}
if (count($Properts[c_Property_StopSensoren]) == $result){
// --------------- Aktion -------------------
set_ControlValue(c_Control_SollAusgang, $CircleId, false);
set_ControlValue(c_Control_IstAusgang, $CircleId, false);
IPSLogger_Inf(__file__, 'Starte Callback Aktion für: '.$Name.', Mode: '.$EventMode);
IPSSchaltuhr_Log('Starte Callback Aktion für: '.$Name.', Mode: '.$EventMode);
$CircleName($CircleId, $EventMode);
} else {
IPSLogger_Inf(__file__, 'Sensorenbedingungen für: '.$Name.', nicht erfüllt');
IPSSchaltuhr_Log('Sensorenbedingungen für: '.$Name.', nicht erfüllt');
}
$RunAktiv = explode(',', get_ControlValue(c_Control_RunAktiv, $CircleId));
$i=0;
foreach ($Properts[c_Property_RunSensoren] as $PropName=>$PropData) {
if ((bool)$RunAktiv[$i+1] == true){
$EventId = IPSUtil_ObjectIDByPath('Program.IPSLibrary.app.modules.IPSSchaltuhr.IPSSchaltuhr_Event.'.get_ControlType($CircleId).'-'.$i);
IPS_SetEventActive($EventId, false);
}
$i++;
}
}
} else {
IPSLogger_Err(__file__, "Zeitschaltuhr CallBack Funktion $CircleName in IPSSchaltuhr_Custom existiert nicht. Schaltuhr: ".$Name);
}
break;
case 'WebFront':
break;
case 'Execute':
break;
case 'RunScript':
break;
default:
IPSLogger_Err(__file__, 'Unknown Sender '.$_IPS['SENDER']);
break;
}
/** @}*/
?>
Hierdurch wurde sichergestellt, dass die Ereignissteuerung für die Run-Sensoren nur zwischen der Start- und Stopzeit aktiv ist.
In der Konfiguration wurde dann der zu prüfende Wert sowohl in der Start-Bedingung als auch in der Run-Bedingung hinzugefügt:
Script „IPSSchaltuhr_Configuration“:
function get_ZSUConfiguration() {
return array(
c_ZSUCircle.'1' => array(
c_Property_Name => 'Dachterrasse',
c_Property_StartSensoren => array(
'1' => array(
c_Property_Name => 'IPSTwilight_Night',
c_Property_SensorID => 47684 ,
c_Property_Condition => '=',
c_Property_Value => 1,
),
//
// '2' => array(
// c_Property_Name => 'Helligkeit Garten',
// c_Property_SensorID => 41726 ,
// c_Property_Condition => '>',
// c_Property_Value => 30,
// ),
),
c_Property_RunSensoren => array(
'1' => array(
c_Property_Name => 'IPSTwilight_Night',
c_Property_SensorID => 47684 ,
c_Property_Condition => '=',
c_Property_Value => 1,
),
),
c_Property_StopSensoren => array(
),
),
Die Variable „IPSTwilight_Night“ ist vom Typ „integer“ und wird im Modul „IPSTwilight“ gesetzt (in Abhängigkeit der Dämmerung).