Frage: Ereignis triggern basierend auf Variablenprofil

Hallo zusammen,

ich bin vor ein paar Tagen von FHEM zu IP-Symcon gewechselt und versuche gerade meine alte Steuerung abzubilden.

Dabei möchte ich gerne folgendes Realisieren:

Eine Variable soll den Zustand der gesamten Beleuchtung im Haus wiederspiegeln => sobald ein Licht eingeschaltet ist soll diese auf TRUE gesetzt werden, sobald alle Lichter im Haus ausgeschaltet sind soll diese wieder zurück auf FALSE wechseln.

In der Theorie ganz einfach, in der Praxis auch irgendwie programmierbar - aber ich frage mich nur ob das auch einfach durch ein Ereignis basierend auf einem Variablenprofil geht ?

Soll heißen:
Variable hat ein Profil zugewiesen bekommen, dieses Profil hat ein Ereignis.

Geht sowas, wenn ja, wie ? Ich finde dazu absolut nichts.

Danke & Gruß
Daniel

Abend!

Mir ist in der Richtung nichts bekannt (was nicht bedeutet, dass das nicht geht g). Aber ich habe das bei mir auch an manchen Stellen und ich habe mir dazu entsprechende Skripte geschrieben und als Trigger (ausgelöstes Ereignis) wird auf Variablenänderung bei z.B. den STATE Variablen der Lampen geschaut oder auf die LEVEL Variablen der Dimmer. An sich kein Problem es auf diese Art zu lösen.

Kleines Beispiel (ausgelöste Ereignisse - Variablenänderung der Variable zu Lampe1 und Lampe2):

<?
$lampe1status = GetValue(12345); // ID der Variable von Lampe 1
$lampe2status = GetValue(67890); // ID der Variable von Lampe 2
$statusVar = 10101;  // ID der Status-Variable

if (($lampe1status == true) OR ($lampe2status == true)) {
    SetValue($statusVar, true);
}
else {
    SetValue($statusVar, false);
}
?>

Grüße,
Chris

Ob das Licht an oder aus ist wird durch den Wert der Variable bestimmt, nicht durch das Profil. Somit braucht es nur das Ereignis auf Variablenveränderung. Außerdem sind Profile meist für mehrere Variablen gültig.
Michael

Hi Chris,

danke, dass dachte ich mir fast.
So in der Art habe ich es jetzt auch implementiert. Wäre einfach ultra convenient gewesen wenn man einfach einem Profil den Trigger zuweist anstatt jedes Mal bei allen Variablen Events samt Skripting zu hinterlegen.

Hallo dansch,
Herzlich willkommen! Du erstellst am einfachsten ein Script, das alle Beleuchtungen überprüft und deine Variable entsprechend setzt. Diesem Script ordnest du für jede zu betrachtende Leuchte ein Variablenereignis zu.

Viele Grüße

Burkhard

Genau das wäre ja das tolle, ich hätte gleich alle Variablen verskriptet die das Profil inne haben.
Würde ne menge Arbeit sparen.

Danke, dann habe ich da ja richtig gedacht.

Eine Frage habe ich noch:

Wenn ihr allgemeingültige Skripte die irgendwo im Baum liegen weiterverwenden (inkludieren) wollt, wie macht ihr das dann in dem Ereigniscode ?

Ich habs jetzt mal so probiert:

$scriptID = 46235;
$s = IPS_GetScript($scriptID);
include($s['ScriptFile']);

Da sagt er mir aber das er das File nicht includieren kann, obwohl die ID und auch das PHP File vorhanden ist. Muss man da etwas anderes nehmen ?

Der Weg andersrum auf das Skript ein Ereignis zur Variable anzulegen klappt, jedoch wird das Ereignis dann am Skript angelegt und nicht an der Variablen wo ich es von meinem Verständnis her besser finde (weil ich dann genau sehe welche Ereignisse diese Variable hat).

Edit:
Habe es rausgefunden, der komplette Pfad musste natürlich für den include angegeben werden:


$scriptID = 46235;
$s = IPS_GetScript($scriptID);
include(IPS_GetKernelDir().'scripts/'.$s['ScriptFile']);

So klappts dann, aber ist das der beste Weg ? Wie geht ihr bei dem Auslagern und Ansprechen eurer Skripte vor, was ist da der Way to Go ?

Ereignisse werden immer unterhalb von dem Objekt platziert, welche sie auslösen sollen. In deinem Fall das Script.
Würde sonst auch sehr negativ in der Visualisierung von Variablen auffallen, weil dann auch alle Ereignisse mit angezeigt würden (wenn man sich nicht versteckt).
Beim einbinden von Scripten gibt es ja zig Möglichkeiten.
Es fast schon so was wie eine Grundsatzfrage wie das umbenennen der Scripte.
Ich nutze meist direkt den Dateinamen, da ich die inkludierend Scripte nicht im Objektbaum hinterlege.
Michael

Ich habe mir für meine eigenen „Funktionen“ (Include Skripte) einen extra Ordner/Kategorie angelegt, darunter liegen dann Skripte wie „Dreambox“, „Sonos“, „HMOULED16“, … Diese habe ich auch entsprechend umbenannt (im Gegensatz zu allen anderen Skripten), also z.B. in „Dreambox.ips.php“. Und diese werden dann jeweils in den Skripten, in denen die Funktionen gebraucht werden, mit „include ‚Dreambox.ips.php‘;“ inkludiert. Dann kann ich in einem Skript dann z.B. einfach den include machen und die Funktion „DreamboxNachricht($Raum, $Nachricht);“ verwenden

Grüße,
Chris

Hallo Dansch,

genau dazu gibt es hier ein Beispiel, das sich selbst einsetze.
Alle Links einer Kategorie auflisten

Ich nutze es um in einer Übersicht anzuzeigen ob und wenn ja wie viele Fenster offen sind. Ein Klick auf die Variable switcht mich auf die Seite auf der die Stati alle Fenster und Türen sind.

Dabei habe ich für die Statiseite eine Kategorie erstellt, in der alle Stati verlinkt sind.
Das Script im Beispiel liest alle diese links aus, erstellt automatisch die Ereignisse bei der Änderung eines Status und setzt eine entsprechende Variable.

<?

// http://www.ip-symcon.de/forum/threads/24577-Alle-Links-einer-Kategorie-auflisten?highlight=werte+links

// Angepasst: Linkvalue abfrage von false auf 0 gesetzt, true und false vertauscht

$ScriptID = 32557; // id dieses scripts
$Objects = IPS_GetChildrenIDs(46582); // Kategorie in der die Links liegen. Zustand von Fenstern und Türen

$AnzVariablen=0;
//$VarValue = '';
$AnzOffen = 0;

foreach ($Objects as $CurrentObjectID)
{
    $Object = IPS_GetObject($CurrentObjectID);
    //print_r($Object);
        if ($Object['ObjectType'] == 6)
        {
            $Link = IPS_GetLink($CurrentObjectID);
            $LinkValue = GetValue($Link['LinkChildID']);
            //echo "LinkWert ".$LinkValue."
";
            $AnzVariablen++; // Variablen zählen
            if($LinkValue <> 1)
            {
                $AnzOffen++;
            }
        }
            //Event anlegen falls noch nicht vorhanden
            $EventName = "LinkID: ".$CurrentObjectID." ObjectID: ".$Link['LinkChildID'];
            $EventID = @IPS_GetEventIDByName($EventName, $ScriptID);
            if ($EventID === false)
            {
                $EventID = IPS_CreateEvent(0);
                IPS_SetName($EventID, $EventName);
                IPS_SetEventTrigger($EventID, 1, $Link['LinkChildID']);
                IPS_SetParent($EventID, $ScriptID);
                IPS_SetEventActive($EventID, true);
            }
}
print_r($AnzOffen."
");
print_r($AnzVariablen."
");
setvalue(14186 ,$AnzOffen); //integer

?>

Das ActionScript wird der Variable 14186 hinterlegt und springt zur Seite mit allen Stati der Fenster und Türen.

<?

 //WFC_SwitchPage
 
 WFC_SwitchPage ( 47113, 'FensterTueren' )

?>

Zwischenablage-1.png