Optimieren der Symcon IPSShadowing Rollo Beschattung

31. Aug
2018
geschrieben von Roland Meier

In einem der letzten Beiträge beschrieb ich das Setup meiner Beschattung mit weiteren Sensoren am Haus.

Die Sensoren befinden sich auch heute noch an den Positionen am Haus wie im Beitrag beschrieben, Helligkeitssensoren an der Süd- & Westseite sowie Temperatursensoren an Süd- & Nordseite, wobei der Südsensor keine Programmfunktionen hat.

 

Automatische Beschattung mit IP-Symcon

Im obigen Beitrag beschreibe ich auch die Ansteuerung der Beschattung mit dem IP-Symcon Modul IPSShadowing, welches im Symcon Forum (Anzeige) sowie auf der Seite des Entwicklers der IPSLibrary (Anzeige) genauer beschrieben ist.

Was mir und auch anderen Nutzern aus dem Forum jedoch fehlt, wäre die Möglichkeit auch weitere Sensoren als nur jeweils ein Temperatursensor für Innen & Außen sowie einen Helligkeitssensor anzugeben.
Gerade Leute welche eine Wetterstation auf dem Dach haben, bekommen meist 4 Werte der Himmelsrichtungen über die Helligkeit geliefert.

In meinem Fall hätte ich die Temperatursensoren noch verkraften können, durch mein Setup der Helligkeitssensoren auf Süd- und Westseite war dies jedoch suboptimal. Die Steuerung der Westrollos mit dem Südsensor und umgekehrt war einfach nicht gut.

Aus diesem Grund habe ich mich die vergangenen Tage etwas in Andreas Skripte (Anzeige) eingearbeitet, um das Programm sinnvoll mit diesen Funktionen zu erweitern.
Auch im Symcon Forum habe ich bereits die Ergebnisse sowie eine kleine Dokumentation der nötigen Anpassungen versprochen.

 

Änderungen am IPSShadowing um weitere Sensoren auszuwerten

In den kommenden Zeilen beschreibe ich meine Anpassungen im IP-Symcon (Anzeige), um weitere Helligkeits- & Temperatursensoren mit in die Auswertung im IPSShadowing aufzunehmen.
In meinem Fall geht es dabei um jeweils 2 Helligkeits- und 2 Temperatursensoren.

Die Änderungen greifen in die vorhandenen Skripte und Programmlogik ein! Wenn Ihr dies nachprogrammieren wollt, lest euch am Besten erstmal alles in Ruhe durch und versucht meinen Gedanken sowie die neue Programmlogik zu verstehen!
In jeden Fall solltet Ihr eine Sicherung der Skripte haben, noch besser Ihr habt ein Backup von eurem ganzen IP-Symcon!

Los geht´s.

 

1. Erweiterung der Konfigurationsdatei um neue Sensoren & Konstanten

Als Erstes habe ich die IPSShadowing Konfiguration in der Datei Program → IPSLibrary → config → modules → IPSShadowing → IPSShadowing_Configuration angepasst:

Ab Zeile #54:
define ("IPSSHADOWING_TEMPSENSORINDOOR", 12345);
define ("IPSSHADOWING_TEMPSENSORINDOOR_1", 12345);
define ("IPSSHADOWING_TEMPSENSORINDOOR_2", 23456);
define ("IPSSHADOWING_TEMPSENSORINDOOR_3", "");
define ("IPSSHADOWING_TEMPSENSORINDOOR_4", "");

Ab Zeile #67:
define ("IPSSHADOWING_TEMPSENSOROUTDOOR", 34567);
define ("IPSSHADOWING_TEMPSENSOROUTDOOR_1", 34567);
define ("IPSSHADOWING_TEMPSENSOROUTDOOR_2", 45678);
define ("IPSSHADOWING_TEMPSENSOROUTDOOR_3", "");
define ("IPSSHADOWING_TEMPSENSOROUTDOOR_4", "");

Ab Zeile #81:
define ("IPSSHADOWING_BRIGHTNESSSENSOR", 45678);
define ("IPSSHADOWING_BRIGHTNESSSENSOR_1", 45678);
define ("IPSSHADOWING_BRIGHTNESSSENSOR_2", 56789);
define ("IPSSHADOWING_BRIGHTNESSSENSOR_3", "");
define ("IPSSHADOWING_BRIGHTNESSSENSOR_4", "");

 

Hier habe ich für die Innen- & Außentemperatursensoren sowie dem Helligkeitssensor neue Konstanten angelegt, welche ich mit einer fortlaufenden Nummer am Ende eindeutig zuweise.

Dahinter steht jeweils die Symcon-ID, wie schon von den originalen Konstanten bekannt, welche ich unverändert lies.
Weiter unten erkläre ich, weshalb die ursprünglichen Konstanten inkl. einer Symcon-ID weiter notwendig sind!

An dieser Stelle könnt Ihr natürlich auch noch mehr Sensoren in gleicher Form weiterführen. In meinem Fall möchte ich aber eh nur 2 Sensoren auswerten und vermutlich werden für die Meisten auch jeweils 4 Sensoren ausreichen.

 

2. Anlegen der neuen Variablen und WebFront Verlinkungen

In der Kategorie Program → IPSLibrary → data → modules → IPSShadowing → Profiles → Temp → Standard wurden 3 neue Integer Variablen angelegt:

  • Name: TempSensorIn
  • Variablentyp: Integer
  • Wert: 0
  • Eigenes Profil:
    • Name: IPSShadowing_TempSensorIn
    • Minimalwert: 0
    • Maximalwert: 4
    • Schrittweite: 1
  • Eigene Aktion: Program → IPSLibrary → app → modules → IPSShadowing → IPSShadowing_ChangeSettings

Damit IPSLibrary darauf zugreifen kann, benötigt diese Variable noch einen Ident, welchen man im Reiter Weitere Einstellungen finden kann.
Diesen kann man so gerade nicht setzen, darauf gehe ich weiter unten näher ein.

Genauso verfahre ich mit den anderen Variablen TempSensorOut und BrightnessSensor.

Da IPSLibrary von sich aus bereits in 10er Schritte sortiert, kann ich hier jeweils die Sortierung 1-3 verwenden um es übersichtlich zu haben:

sensor variablen

 

Wie bereits erwähnt, muss bei den Variablen noch der Ident gesetzt werden. Leider fand ich keinen anderen Weg als den folgenden:

  • ändern der Variableaktion "Eigene Aktionen" in Automatisches Skript
  • Inhalt des neuen Skripts:
    IPS_SetIdent(ID-DER-VARIABLE, "TempSensorIn");
  • dieses Skript dann einmal ausführen und überprüfen, ob der Ident gesetzt wurde:
    sensor variable ident
  • das Skript kann dann wieder gelöscht werden und die "Eigene Aktion" auf die IPSShadowing_ChangeSettings von zuvor setzen

 

Auch diese Aktionen sind natürlich wieder für alle 3 Variablen notwendig.

 

3. Verlinken der neuen Variablen ins WebFront

Dann wurde in Program → IPSLibrary → data → modules → IPSShadowing → ProfileManager → DisplayTemp eine DummyModule Instanz mit dem Namen Sensorauswahl angelegt.
Darunter habe ich die 3 zuvor erstellten Variablen verlinkt. Das WebFront sollten dann wie folgt aussehen:

ipsshadowing sensor auswahl

 

4. Control Konstanten der neuen Variablen definieren

Mit den nun folgenden Änderungen werden dann die Skripte angepasst! (Backup!)

In der Datei Program → IPSLibrary → app → modules → IPSShadowing → IPSShadowing_Constants habe ich folgende Zeilen eingefügt:

Ab Zeile #93
define ("c_Control_TempSensorIn", "TempSensorIn");
define ("c_Control_TempSensorOut", "TempSensorOut");
define ("c_Control_BrightnessSensor", "BrightnessSensor");

 

Damit mache ich die neuen Variablen der IPSLibrary als Kontrollelemente bekannt.

 

5. Anpassung der Datei welche die WebFront Änderungen abspeichert

Wer bisher bereits auf eines der 3 Elemente geklickt und im IPSLibrary das Logging aktiviert hat, kann bereits feststellen, dass Fehler ausgegeben werden, schließlich weiß IPSShadowing mit den neuen Variablen noch nichts anzufangen.

Deshalb muss auch die ChangeSettings Datei angepasst werden, welche wir als Aktionsskript bei den 3 neuen Variablen aufrufen.

In der Datei Program → IPSLibrary → app → modules → IPSShadowing → IPSShadowing_ChangeSettings habe ich folgendes eingefügt:

Ab Zeile #118
case c_Control_TempSensorIn:
case c_Control_TempSensorOut:
case c_Control_BrightnessSensor:

 

Dieser Case der Switch Anweisung setzt lediglich den Wert welcher angeklickt wurde in die Variable ein.

Dies sollte man nun auch im Objektbaum bestätigen können.

 

6. Richtige Sensordaten einlesen und in das Temperaturprofil einbinden

Nun wird es interessant, denn jetzt sehen wir zu, die Werte vom richtigen Sensor zu erhalten und diese im Profil mit zu integrieren.

Dies geschieht alles in der Program → IPSLibrary → app → modules → IPSShadowing → IPSShadowing_ProfileTemp Datei:

Ab Zeile #52
private $tempSensorIn;
private $tempSensorOut;
private $brightnessSensor;

Zuerst definiere ich die 3 Kontrollfelder als private Klassenvariablen, wie die anderen auch. Dies heißt, dass sie innerhalb der gesamten Klasse sichtbar sind.

 

Ab Zeile #76
$this->tempSensorIn = GetValue(IPS_GetObjectIDByIdent(c_Control_TempSensorIn, $this->instanceId));
$this->tempSensorOut = GetValue(IPS_GetObjectIDByIdent(c_Control_TempSensorOut, $this->instanceId));
$this->brightnessSensor = GetValue(IPS_GetObjectIDByIdent(c_Control_BrightnessSensor, $this->instanceId));

Hier ermittle ich die Sensornummer, in meinem Fall 1-4, welche als Suffix zur Ermittlung der Konstante nötig ist und schreibe den Wert in die Klassenvariable.
In diesem Fall bekomme ich also den entsprechen ausgewählten Wert 1-4 und weiß dann, welchen Sensor ich auslesen möchte.

 

Ab Zeile 92
// Set new constant names from SensorID
$sensorIDTempIn = constant("IPSSHADOWING_TEMPSENSORINDOOR_$this->tempSensorIn");
$sensorIDTempOut = constant("IPSSHADOWING_TEMPSENSOROUTDOOR_$this->tempSensorOut");
$sensorIDBrightness = constant("IPSSHADOWING_BRIGHTNESSSENSOR_$this->brightnessSensor");

Mit der PHP Funktion constant() erweitere ich die ursprüngliche Konstante um einen Unterstrich sowie die eingestelle Sensornummer.
Diese Variablen beinhalten also z.B. IPSSHADOWING_TEMPSENSORINDOOR_1 und bekommen dann die Symcon-ID, welche in der Konfigurationsdatei eingestellt ist.

 

In den unmittelbar nachfolgenden IF-Anweisungen ersetze ich dann nur noch die Konstanten durch die neuen Variablen, welche die neuen Konstantennamen enthalten:

Ab Zeile #97
if ($sensorIDTempIn <> '') {
$this->tempIndoor = round(GetValue(IPSUtil_ObjectIDByPath($sensorIDTempIn)),1);
}
if ($sensorIDTempOut <> '') {
$this->tempOutdoor = round(GetValue(IPSUtil_ObjectIDByPath($sensorIDTempOut)),1);
}
if ($sensorIDBrightness <> '') {
$this->brightnessValue = round(GetValue(IPSUtil_ObjectIDByPath($sensorIDBrightness)),1);
if ($this->profileWasActive) {
$this->activationByBrigthness = ($this->brightnessValue >= $this->brightnessLevelLow);
} else {
$this->activationByBrigthness = ($this->brightnessValue >= $this->brightnessLevelHigh);
}
}

 

Das wars auch schon, was die eigentliche Funktionalität angeht. Durch die letzten Änderungen werden die Werte der entsprechenden Sensoren in die Klassenvariable geschrieben, auf welche alle anderen Funktionen zugreifen.

 

HINWEIS!
Wer nun die gerade geöffnete IPSShadowing_ProfileTemp weiter ansieht wird feststellen, dass die alte Konstante immer wieder abgefragt wird. So zum Beispiel auch in der darauf folgenden UpdateProfileInfo() Funktion.
Beispiel:

$tempIndoor = (IPSSHADOWING_TEMPSENSORINDOOR<>'' ? $this->tempIndoor.'°C' :'"nicht vorhanden"');

Was passiert hier?
Die ursprüngliche Konstante wird abgefragt, ob sie einen Wert hat, sprich ob eine Symcon-ID enthalten ist. Wenn ja, wird die Klassenvariable, welche wir vorher bei der Initialisierung gesetzt haben, geliefert, andernfalls dass der Wert "nicht vorhanden" ist.

Heißt, wer hier die eigentliche Funktionalität nicht weiter anfässt, so wie ich für diesen Beitrag, benötigt weiterhin die ursprüngliche Konstanten genauso wie dass diese einen Wert haben müssen!
Man könnte aber auch hergehen und die zuvor gesetzte neue Konstanten-Variable in eine Klassenvariable schreiben und alle alten Konstanten ersetzen.
So tief möchte ich aber für diesen Beitrag nicht ins Detail gehen, Benutzer die nicht programmieren können werden so schon alle Hände voll zu tun haben, um dies alles nachvollziehen zu können und rein funktionell macht es keinen Unterschied. (Quick & Dirty)

 

7. Notwendige Anpassungen für die "Neues Profil" Funktion

Eine Sache ist aber unbedingt noch notwendig, möchte man neue Temperaturprofile erstellen, müssen die neuen Variablen und Verlinkungen mit erzeugt werden.

Und gerade wenn man nun auch die Möglichkeit hat, unterschiedliche Sensoren zu wählen, wird man davon auch gebrauch machen.

So habe auch ich ein Süd- & West- Temperaturprofil.

 

Die Anpassungen sind noch in der gleichen geöffneten Datei Program → IPSLibrary → app → modules → IPSShadowing → IPSShadowing_ProfileTemp zu machen:

Ab Zeile #210
public static function Create($profileName, $tempLevelOutShadow=c_TempLevel_Ignore, $tempLevelOutClose=c_TempLevel_Ignore,
$tempLevelOutOpen=c_TempLevel_Ignore, $tempLevelInShadow=c_TempLevel_Ignore, $tempLevelInClose=c_TempLevel_Ignore,
$tempLevelInOpen=c_TempLevel_Ignore, $brightnessLow=0, $brightnessHigh=0,
$tempSensorIn=0, $tempSensorOut=0, $brightnessSensor=0) {

Hier erweitere ich die Parameter der Funktion Create() um die 3 neuen Variablen und setze sie auf 0, sofern sie nicht mit übergeben werden.

 

Ab Zeile #222
CreateVariable(c_Control_TempSensorIn, 1 /*Integer*/, $profileId, 1, 'IPSShadowing_TempSensorIn', $ScriptIdChangeSettings, $tempSensorIn, 'Temperature');
CreateVariable(c_Control_TempSensorOut, 1 /*Integer*/, $profileId, 2, 'IPSShadowing_TempSensorOut', $ScriptIdChangeSettings, $tempSensorIn, 'Temperature');
CreateVariable(c_Control_BrightnessSensor, 1 /*Integer*/, $profileId, 3, 'IPSShadowing_BrightnessSensor', $ScriptIdChangeSettings, $brightnessSensor, 'Sun');

Hier erzeuge ich neue Variablen im neuen Profil, inkl. deren Sortierung, Namen, Idents sowie Variablenprofil und Icon.

 

Ab Zeile #250
$instanceId = CreateDummyInstance("Sensor Auswahl", $categoryId, 11);
CreateLink('Temperatursensor Innen', IPS_GetObjectIDByIdent(c_Control_TempSensorIn, $this->instanceId), $instanceId, 0);
CreateLink('Temperatursensor Aussen', IPS_GetObjectIDByIdent(c_Control_TempSensorOut, $this->instanceId), $instanceId, 1);
CreateLink('Helligkeitssensor', IPS_GetObjectIDByIdent(c_Control_BrightnessSensor, $this->instanceId), $instanceId, 2);

Zuletzt erstelle ich im WebFront noch das Dummymodul, in welchem meine 3 neuen Variablen verlinkt werden.

 

8. Temperaturprofile erstellen und den Beschattungselemente zuweisen

Das wars eigentlich auch schon. Hier meine Seite für das Temperaturprofil Süd:

ipsshadowing temperatur profil

 

Man sieht dass ich hier die Sensoren 1 verwende. Unten in der Profil Info sehe ich auch die entsprechenden Werte und kann sie mit den realen Werten vergleichen.
Damit kann ich kontrollieren ob die Werte der richtigen Sensoren verwendet werden.

 

Zuletzt weise ich meinen Beschattungselementen noch das entsprechende Temperatur- und Sonnenstand-Profil zu, hier das Esszimmer-Rollo:

beschattungselement esszimmer

 

Zusatzfeature Helligkeitswert in den Beschattungselementen

Wer beim letzten Screenshot genau hinsieht bemerkt, dass in der Profilinformation des Beschattungselements nun auch die Helligkeit des Profils steht.
Auch dies war ursprünglich nicht im IPSShadowing sondern habe ich hinzugefügt.

Dafür muss die Datei Program → IPSLibrary → app → modules → IPSShadowing → IPSShadowing_Device wie folgt erweitert werden:

Zeile #757
// Get the brightness
$brightnessSensor = GetValue(IPS_GetObjectIDByIdent(c_Control_BrightnessSensor, $profileIdTemp));
$sensorIDBrightness = constant("IPSSHADOWING_BRIGHTNESSSENSOR_$brightnessSensor");
$brightness = ($sensorIDBrightness<>'' ? round(GetValue(IPSUtil_ObjectIDByPath($sensorIDBrightness)),1).' Lux':'"nicht vorhanden"');

Hier passiert nichts anderes wie oben schon geschrieben. Zuerst hole ich die Sensornummer, dann erweitere ich die Konstante damit und zuletzt hole ich vom entsprechenden Sensor den Wert, welchen ich in die Variable $brightness schreibe.

 

Zeile #765
$profileInfo = $profileManager->GetProfileInfo($profileIdBgnOfDay, $profileIdEndOfDay, $profileIdTemp, $tempIndoorPath) . ', ' . $brightness;

Diese hänge ich dann einfach mit einem Komma getrennt an den bestehenden String.

 

Fazit

Die modifizierte IPSShadowing läuft nun bei mir seit ca. 3-4 Wochen so und bisher sind wir damit absolut zufrieden.

Ein ganz großer Dank an den Autor Andreas Brauneis für seine 1A Arbeit.

 

Gelesen 4592 mal Letzte Änderung am Freitag, 14 August 2020
Artikel bewerten
(9 Stimmen)
Bitte anmelden, um einen Kommentar zu posten
Anzeige

Anzeige

123RF.com - For all your creative needs!

Kalender

« April 2024 »
Mo Di Mi Do Fr Sa So
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Newsletter

Euch interessieren meine Themen hier? Dann tragt euch einfach in den Newsletter ein und ihr werden bei neuen Beiträgen informiert.

Anzeige