Badlichtsteuerung über Präsenzmelder und Szenen

Begonnen von blane, 06 September 2018, 16:10:13

Vorheriges Thema - Nächstes Thema

binford6000

Zitat von: blane am 18 September 2018, 09:59:57
Hi Sebastian,

danke schon einmal so far.
Bin durch deine Hilfe schlauer geworden und weiter gekommen.
Konnte gestern kurz testen und es scheint nun anzulaufen.
Ich werde noch ein wenig feinjustieren und schauen ob alles passt.

Für alle die es interessiert anbei das bis dato funktionierende Modul:

    # Raum aus Sensornamen ermitteln, z.B. bz_Sensor
    my $room = ( split /_/, "%SENSOR%" )[2];

# Etage aus Sensornamen ermitteln, z.B. bz_Sensor
    my $floor = ( split /_/, "%SENSOR%" )[1];

    # Ermitteln, ob für den Raum Autlight on oder off ist
my $autolight = Value( $room . "_AutoLight" );

    # Status des Lichtes dieses Raums
    my $licht = Value( "Licht_" . $floor . "_" . $room . "_KNX_Deckenspots_Status" );

    # Absolutes Dimmen
    my $absolut = Value( "Licht_" . $floor . "_" . $room . "_KNX_Deckenspots_ABSOLUT" );

    # Status des dummy Tageslicht
    my $tl = Value("Tageslicht");

    # Status ob jemand anwesend ist
    my $anwesend = ReadingsVal( 'Home', 'presence', '' );

    #"{ReadingsVal('Kuechentuer','state','')}"

    # nur wenn jemand anwesend ist Lichtsteuerung ausführen
    if ( "%STATE%" eq "open" ) {

        # Lichtwert des Sensors
        my $lux = (
            split / /, Value( "Praesenzmelder_" . $floor . "_" . $room . "_KNX_Helligkeit" )
        )[0];

        # Löschen des evtl. schon vorhandenen "at"
        fhem "delete atTmp_Bewegungsmelder_Licht_aus_" . $room . "_%SELF%"
          if (
            IsDevice( "atTmp_Bewegungsmelder_Licht_aus_" . $room . "_%SELF%" )
          );

# Licht nur wenn kein Tageslicht oder Lichtwert des Sensors kleiner als 100 und Lichtschalter nicht gedrückt und AutoLight eingeschaltet und modeAlarm nicht armaway
        if (   ( $tl == 0 || $lux < 100 )
            && $licht eq "off"
            && Value( $room . "_AutoLight" ) eq "on"
            && "%AMODE%" ne "armaway" )
        {
            my $scene;
            my $scenenschleife = "scenenschleife";
if ("%DAYTIME%" eq "Mitternacht" ) {
                $scene = "Mitternacht";
            }
            elsif ("%DAYTIME%" eq "Nacht" ) {
                $scene = "Nacht";
            }
elsif ("%DAYTIME%" eq "Morgen" ) {
                $scene = "Morgen";
            }
elsif ("%DAYTIME%" eq "Vormittag" ) {
                $scene = "Vormittag";
            }
elsif ("%DAYTIME%" eq "Mittag" ) {
                $scene = "Mittag";
            }
elsif ("%DAYTIME%" eq "Nachmittag" ) {
                $scene = "Nachmittag";
            }
elsif ("%DAYTIME%" eq "Abend" ) {
                $scene = "Abend";
            }
elsif ("%DAYTIME%" eq "Spaetabend" ) {
                $scene = "Spaetabend";
            }
            else {
                $scene = "keine";
            }
            fhem "set " . $room . "_LS scene $scene" if ($scene);
            fhem "setreading Homedummy scene " . $scene;
        }
    }
    else {
        # unterschiedliche Ausschaltzeiten für unterschiedliche Räume
        my $t = 3;
        $t = 15
          if ( $room eq "WOH"
            || $room eq "BUE"
            || $room eq "KZ1"
            || $room eq "KZ2"
            || $room eq "KZ3"
            || $room eq "SLA" );

        #$t = 2 if ($room eq "bz" || ($room =~ /wz|ku/ && "%MODE%" =~ /sleep/));
        $t = 1
          if ( $room eq "EFL"
            || $room eq "OFL"
            || $room eq "ANK"
            || $room eq "TEC" );
        fhem "setreading Homedummy t " . $t;

        # Zahl in Minuten umrechnen in einen Zeitpunkt für das "at"
        my $d = HOMEMODE_hourMaker($t);
        fhem "setreading Homedummy d " . $d;

# Anlegen des "at" zum Ausschalten des Lichts wenn die Lichter angeschaltet sind und auch AutoLight eingeschaltet ist
        if ( $licht ne "off" && Value( $room . "_AutoLight" ) eq "on" ) {
            my $cmd = "set " . $room . "_LS scene aus";
            fhem "defmod atTmp_Bewegungsmelder_Licht_aus_" . $room
              . "_%SELF% at +$d $cmd";
            fhem "setreading Homedummy cmd " . $cmd;
        }
    }
}


Bzw. eine Frage habe ich noch. Ich habe meine Räume noch in OG/EG unterteilt. Kann ich einen Platzhalter für das O bzw. E setzen?
Beispielsweise habe ich die Variable

my $licht = Value( "Licht_EG_" . $room . "_KNX_Deckenspots_Status" );
Nun soll diese aber auch für das OG gelten.

PS: Habe dies durch eine weitere Variable gelöst. (noch ungetestet)
Definition: my $floor = ( split /_/, "%SENSOR%" )[1];
Nutzung: my $licht = Value( "Licht_" . $floor . "_" . $room . "_KNX_Deckenspots_Status" );

Grüße
David

Hallo David,
das freut mich zu hören :D
Wenn alles klappt markiere den Thread noch als gelöst.  ;)
VG Sebastian