Szenensteuerung mit KNX & IPS

Hallo zusammen,

ich in dabei gerade in allen Räumen eine Szenensteuerung einzurichten, Funktioniert soweit auch…
Allerdings etwas aufwendig bzw. umständlich und evtl. zu „belastend“ für IPS.
Ich zerbreche mich schon ein paar Stunden den Kopf darüber wie ich das etwas Kompakter und Universeller gestalten könnte, evtl. hat jemand einen Vorschlag bzw. kann mir sagen ob das so in Ordnung oder völliger Quatsch ist.

Folgendes Szenario:

Raum Badezimmer hat 4 Szenen, sowohl in KNX als auch in IPS, KNX Geräte werden direkt über die KNX Szenensteuerung angesprochen.

Lediglich Geräte wie z.B. ein HomeMatic Schaltaktoren und ein Sonos Speaker werden zusätzlich über die IPS Szenensteuerung gesteuert.

Die Szenen der IPS Szenensteuerung sind wie folgt benannt:

  • Szene Raum Aus
  • Szene Rot
  • Szene Türkis
  • Szene Magenta

Durch langes drücken am KNX Taster werden die 3 Farben Rot, Türkis & Magenta durchgewählt, beim loslassen der gewünschten Farbe wird die hinterlegte Szene abgerufen.
Die Szene „Raum Aus“ schaltet alles komplett aus beim vollflächigen Tasten des Schalters.

So nun zur Problematik bzw. meiner Umsetzung in IPS:

Ich habe je Szene 2 Skripte angelegt, das eine Skript sendet bei Aufruf oder Speichern der Szene aus dem WebFront die entsprechende Szenennummer auf den BUS, in meinem Fall der Szene „Rot“ wäre das zum Aufrufen der Wert „3“ und zum Speichern der Wert „131“ da es eigentlich die KNX Szenennummer 4 ist aber die Zählung bei 0 beginnt, etwas verwirrend…
Hier gibts schon immer den ersten „Stolperstein“ beim umdenken.

Hier das Skript:

<?php

$knx_group = IPS_GetVariable (16347)['VariableID'];
$ips_sc_var_ID = IPS_GetVariable (12743)['VariableID'];
$ips_sc_var_count = GetValueInteger ($ips_sc_var_ID);





//Steuerung der KNX Szene aus IPS


if ($_IPS['VARIABLE'] = $ips_sc_var_ID && $ips_sc_var_count == 2)

    {
        RequestAction ($knx_group, 3);
    }


    elseif ($_IPS['VARIABLE'] = $ips_sc_var_ID && $ips_sc_var_count == 1)

        {
           RequestAction ($knx_group, 131);
        }

Das zweite Skript Aktiviert die Szene 2 der Symcon Szenensteuerung bei Aufrufen der KNX-Szene 4 ( Rot ) bzw. dem Wert „3“ auf der Variable in IPS

Hier das Skript:

<?php

$knx_group = IPS_GetVariable (16347)['VariableID'];
$knx_sc_num = GetValueInteger ($knx_group);
$ips_szs = IPS_GetInstance (32138)['InstanceID'];


//Steuerung der IPS Szene über den KNX Bus 


if ($_IPS['VARIABLE'] = $knx_group && $knx_sc_num == 3)

    {
        SZS_CallScene ($ips_szs, 2);
    }


    elseif ($_IPS['VARIABLE'] = $knx_group && $knx_sc_num == 131)

        {
            SZS_SaveScene ($ips_szs, 2);
        }

Nun habe ich diese beiden Skripte ja je Szene, bedeutet wenn auf der Gruppenadresse auf dem KNX Bus ein Szenenaufruf stattfindet werden im Moment gleichzeitig 4 Skripte Getriggert, dies wird mit jedem weiteren Raum um jeweils 4 erhöht ( kann auf Dauer nicht gut sein oder ? ).

Da es auch ein Aufwand ist in jedem Skript immer die entsprechenden Variablen & InstanzID´s einzutragen, dachte ich mir müsste man das doch irgendwie auch in einem Skript unterbringen?

Allerdings würde mir auch nur der Lösungsweg einfallen alle KNX Skripte auf 1 zu reduzieren und dort dann 4 If Bedingungen hintereinander anzustellen…
Wenn ich das „IPS Skript“ ( Skript 1 ) mit dazu nehme erzeuge ich eine Dauerschleife und das Skript wiederholt sich im Sekundentakt… :banghead:

Danke vorab schonmal für die Rückmeldungen.

Grüße, Adrian.

  1. Schritt: Du triggerst mit Symcon im Webfront oder über RequestAction ausschließlich die KNX Szene. Da diese dann „rückwärts“ auch wieder in Symcon auftaucht, verarbeitest du darin erst die in Symcon erforderlichen Aktionen.

Dann kannst du durchaus nur ein Script anlegen und entsprechend abfangen, durch welche Variable es ausgelöst wurde.
Die Verschiebung zwischen KNX Szenennummer und Symcon Integer ID kann man sich relativ einfach abstrahieren.

Beispiel:


function setzeSzene($knxSzenenNummer){
KNX_WriteDPTxy($instanz, ($knxSzene+128-1) );

Hallo Tobias,

danke für die Tipps, ich konnte es jetzt in soweit Reduzieren das ich 1 KNX Skript und 5 Symcon Skripte habe…
Hab das ganze eben an einem Weiteren Raum ( Schlafzimmer ) getestet, hier habe ich in Summe 5 Szenen, wobei eine Reserve ist.

Wenn ich alle Symcon Skript zusammenlege in eines wie hier:

<?php

$knx_group = IPS_GetVariable (16347)['VariableID'];
$knx_sc_num = GetValueInteger ($knx_group);
$ips_szs = IPS_GetInstance (11076)['InstanceID'];
$ips_sc_1 = IPS_GetVariable (26721)['VariableID'];
$ips_sc_2 = IPS_GetVariable (17622)['VariableID'];
$ips_sc_3 = IPS_GetVariable (46930)['VariableID'];
$ips_sc_4 = IPS_GetVariable (23098)['VariableID'];
$ips_sc_5 = IPS_GetVariable (25140)['VariableID'];
$ips_sc_var_count_1 = GetValueInteger ($ips_sc_1);
$ips_sc_var_count_2 = GetValueInteger ($ips_sc_2);
$ips_sc_var_count_3 = GetValueInteger ($ips_sc_3);
$ips_sc_var_count_4 = GetValueInteger ($ips_sc_4);
$ips_sc_var_count_5 = GetValueInteger ($ips_sc_5);





//Steuerung der KNX Szene aus IPS


if ($_IPS['VARIABLE'] = $ips_sc_1 && $ips_sc_var_count_1 == 2 )

    {
        RequestAction ($knx_group, 8);
    }


    elseif ($_IPS['VARIABLE'] = $ips_sc_1 && $ips_sc_var_count_1 == 1)

        {
           RequestAction ($knx_group, 136);
        }


// Szene Rot

if ($_IPS['VARIABLE'] = $ips_sc_2 && $ips_sc_var_count_2 == 2 )

    {
        RequestAction ($knx_group, 10);
    }


    elseif ($_IPS['VARIABLE'] = $ips_sc_2 && $ips_sc_var_count_2 == 1)

        {
           RequestAction ($knx_group, 138);
        }


// Szene Türkis

if ($_IPS['VARIABLE'] = $ips_sc_3 && $ips_sc_var_count_3 == 2 )

    {
        RequestAction ($knx_group, 11);
    }


    elseif ($_IPS['VARIABLE'] = $ips_sc_3 && $ips_sc_var_count_3 == 1)

        {
           RequestAction ($knx_group, 139);
        }

// Szene Magenta

if ($_IPS['VARIABLE'] = $ips_sc_4 && $ips_sc_var_count_4 == 2)

    {
        RequestAction ($knx_group, 12);
    }


    elseif ($_IPS['VARIABLE'] = $ips_sc_4 && $ips_sc_var_count_4 == 1)

        {
           RequestAction ($knx_group, 140);
        }


// Szene Reserve

if ($_IPS['VARIABLE'] = $ips_sc_5 && $ips_sc_var_count_5 == 2 )

    {
        RequestAction ($knx_group, 13);
    }


    elseif ($_IPS['VARIABLE'] = $ips_sc_5 && $ips_sc_var_count_5 == 1)

        {
           RequestAction ($knx_group, 141);
        }

Dann werden alle Szenen nacheinander Aufgerufen, obwohl ich nur die Szene 3 ( Türkis ) übers Webfront aufgerufen habe…
Ich verstehe meinen Fehler hier an der Stelle nicht wirklich…

Das mit den KNX Szenennummern habe ich nicht ganz Verstanden, wenn ich hier ja gänzlich auf das Konvertieren bzw. auf den Nummern Versatz verzichten möchte, müsste ich ja eigentlich hingehen und eine weitere Variable machen die ich in jeder If bedingung prüfe ( Wenn KNX-Szenennummer kleiner/gleich 64 dann +1 ) und 128 bleibt 128 ebenso wie die weiteren darüber ( 129… ) oder sehe ich das falsch?

Gruß, Adrian