Helligkeitsverlauf

Hallo habe einige Scripts zur Beleuchtungssteuerung.
Jetzt möchte ich diese so machen, dass wenn es dunkel wird soll das Licht an gehen. Also bei Dämmerung. Allerdings ist fast das gleiche Ereignis auch wenn ich das licht Manuell ausschalte.

Daher wäre die Überlegung, dass wenn sich die Helligkeit innerhalb von einer Viertel Stunde langsam absenkt dann darf vom Script eingeschaltet werden. Bei einer Helligkeitsänderung von x Lux innerhalb von x Sekunden ist es manuell geschaltet und das Licht soll so bleiben.

Hat einer eine Idee wie man das ohne große Hilfsscripte oder viele extra Variablen abbilden kann? Evtl über geloggte variable? Diese dann zyklisch abfragen. Oder wenn helligkeisschwelle zum einschalten innerhalb von x min unterschritten wurde.

Moin,

Du solltest Deine Helligkeitswerte mit MEAN oder MEDIAN über einen gewissen Zeitraum glätten.

Siehe z.B. hier.

Servus
Ich würde das mit einer Hysterese lösen.
angenommene Randbedingung: Tageslicht ist immer heller als Kunstlicht

d.h. die Einschaltlogik wird nur dann aktiv wenn zuvor eine minimale Helligkeitsschwelle überschritten wurde.

Tagsüber überschreitets du diese Schwelle und aktivierst damit die Logik. Dann wird es dämmrig, sie schaltet das Licht ein und deaktiviert sich selbst. Schaltet du dann manuell tut sie nichts weil deaktiviert. Am nächsten tag wird sie wieder durch die Mittagshelligkeit aktiviert.

Alternativ kannst sie auch bsp. bei einer gewissen Uhrzeit aktivieren, und sie dann durch das erste ansprechen selbst deaktivieren lassen.

gruß
bb

Interessante Idee. Ich werde mal weng damit spielen und simulieren.
Weil es passiert auch, dass die Kinder Mittagsschlaf machen oder dass man sich so mal hinlegen will. Dann Rollo zu und das licht dann manuell ausgeschalten wird.

Ich versuch das Verhalten gerade mal in einem Diagramm zu Visualisieren. Selbst das ist schon schwer :slight_smile:

So ich hab mal versucht den Verlauf etwas aufzuzeichnen.
Aktuell frage ich nur die Helligkeit beim auslösen des Bewegungsmelders ab. ist es da hell genug wird nix gemacht. Ist es zu dunkel wird eingeschalten. Funktioniert auch soweit.

Was ich da schwer find ist, wenn es langsam dämmert und Licht ist noch aus und Beweungsmelder ist noch ausgelöst, dann einschalten. Wenn allerdings manuell das Licht ausgeschaltet wurde dann soll es aus bleiben.

Abfrage mit Event ob Auslöser Licht oder Bewegungsmelder ist eingebaut.

Ich habe das Problem noch nicht ganz verstanden. Du möchtest abends das Licht automatisch bei Unterschreitung einschalten. Und die Lampe die du ggf. Einschaltest verändert den Lux wert zu stark?

Lux unter Grenze
Wenn es Abend wird soll die Lampe einschalten (Lux geht hoch)
Wenn ich dann die Lampe manuell ausschalte (Lux unter grenze)
geht sonst die Lampe immer wieder ein.

Daher die Unterscheidung ob es dunkel wird

  • durch Dämmerung = Licht ein
  • durch Licht aus = Licht nix machen

Ok ich glaube das hab ich nun verstanden.

Ich hätte den Status ob Auto -An oder -Aus separat gepflegt. Steigt die Helligkeit wieder bleibt der separate Status einfach AN. Schalte ich manuell aus, bleibt das Licht aus weil kein erneutes Einschaltsignal nicht kommt.

Genau dafür habe ich mein Dämmerungsschalter ([Modul] Dämmerungsschalter (für Außenbeleuchtung)) gebaut. Dieser liefert einen separaten Status. Diesen koppele ich per Event mit dem eigentlichen Lichtschalter. Schalte ich das Licht früher aus, bleibt es aus. Der Status kann nur 2 x (morgens und abends) wechseln, weil ich feste Zeiten integriert habe und den zusätzliche Status beachten kann.

Du hast aber nichts über das automatische Ausschaltverhalten gesagt, so dass ich nicht weis ob die das passt. Es basiert darauf dass Licht ein Ablauftimer hat mit einer maximal Begrenzung (Endtimer)

PS: Ich habe zwar eine extra Wetterstation daher garnicht so stark davon betroffen, kenne das Problem aber schon alleine mit wenn eine dichte Wolke vorbei zieht. Früher ist dann das Licht zu früh angegangen oder auch mal an / aus.

Das mit der Helligkeit ist gar nicht so einfach je länger man sich damit beschäftigt.
Grundsätzlich sollte es dann so sein, dass wenn es z.B. 5 min lang unterschreitet, dass erst dann geschaut wird wie schnell ist es denn dunkel geworden.
Irgendwie muss man sich das erstmal alles ausdenken und auf Blatt malen bevor es ans Coden geht :smiley:

Ja das hatte ich in meinen ersten Überlegungen auch. Dann dachte ich mir das muss einfacher gehen. Dann habe ich den Zeitraum für Abends und Morgens mit Einfliesen lassen und hab dann festgestellt das es die Berechnung nicht zwangsläufig braucht.nach einigen Prototypen bin ich jetzt super zufrieden. Klar es kann immer noch sein, dass das Licht zugfrüh angeht weil eine Wolke vorbei zieht abends aber dann ist man im freigegebenen Zeitraum und dann stört es halt auch nicht.

Ich habe mir ein Skript bebaut dass die Helligkeit der Sensoren / Den Strom von der PV-Anlage aus dem Archiv befüllt. Statt dem aktuellen Wert nehme ich den 15-Minuten-Durchschnitt. Das gleicht die Kurve aus und macht die Verwendung von Thresholds / Auslösen bei über-/unterschreitung deutlich verlässlicher.

Das klappt auch gut beim Trockner mit 5 Minuten. Dadurch fallen diese kurzen Lastspitzen vom Knitterschutz weg.

Ja genau das ist das Ding. diese „Spitzen“ möchte ich genau abfragen.

Ich habe, um mehrfaches hin und her zu vermeiden so gelöst, dass das Einschalt- und das Ausschaltereignis genau einmal am Tag passieren. Zusätzlich gibt es ein Fallback auf die Astrofunktion, die den Status statt des Sensorskripts setzt, falls das Ereignis „überfällig“ ist.

ich hab jetzt mal erste Versuchsentwürfe

  • Bei Helligkeitsänderung wird der Wert in eine Speicher Variable geschrieben
  • von der wird zuvor die Differenz berechnet.
  • je nachdem wie hoch die Differenz ist = Unterscheidung ob Dämmerung oder Licht aus.
  • wenn schnelle Lux unterschied => Freigabe Variable auf false
  • diese wird erst bei überschreiten des Einschaltwertes wieder freigegeben.

Wahrscheinlich vorher einfach zu kompliziert gedacht. Habe es jetzt so gelöst

// Dämmerung abfragen
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if ($EventID                        == $IDEventBrightness        and
    $BrightnessAktuell              <  $BrightnessMin            and
    getvalue ($IDDaemmerung)        == false                     ){
    
    setvalue ($IDDaemmerung, true);

    // Einmalig Licht wenn jemand da ist einschalten
    if (getvalue ($IDMelder)    == true ){
        Lichtmanager (true);
    }else{}
}else{}


if ($EventID                        == $IDEventBrightness        and
    $BrightnessAktuell              >  $BrightnessMin + 100      ){
    
    setvalue ($IDDaemmerung, false);
}else{}


if ($EventID                        == $IDEventBrightness        and
    $BrightnessAktuell              >  $BrightnessMax            ){
    
    setvalue ($IDDaemmerung, false);
    // Licht ausschalten
    Lichtmanager (false);
}else{}

So in Kombination mit einem Freigabefenster habe ich es auch gelöst und das Ganze halt in ein Modul gegossen. :smiley:

Jo genau, so in der Art hab ich es jetzt auch gelöst. Manchmal ist es doch viel einfacher als man denkt.

So mit Modulen programmieren bin ich noch nicht so weit. Ich habe schon „Bausteine“ allerdings läuft das bei mir so ab.

Jeder Raum hat die gleichen Variablen.
in dem script ist nur ein include des Main Scripts
2022-02-14_08h32_22

und in dem dann der Code der für alle Elemente funktioniert.

<?php
// Alle Funktionen einbinden
include '35953.ips.php';

$IDScript               = $_IPS['SELF'];     // ID des Scriptes
$EventID                = $_IPS['EVENT'];    // ID des Events
$EventName              = IPS_GetName ($EventID);

$Event                  = $_IPS['SENDER'];   // Event: TimerEvent - Variabel           = 

$IDHauptschalter        = IPS_GetParent ($IDScript);
$Hauptschalter          = getvalue ($IDHauptschalter);

$IDEventHauptschalter   = IPS_GetEventIDByName    ("event_hauptschalter",         $IDScript);

$IDEventBrightness      = IPS_GetEventIDByName    ("event_brightness",            $IDScript);
$BrightnessAktuell      = getvalue (IPS_GetEvent($IDEventBrightness)["TriggerVariableID"]);
$BrightnessMin          = GetValue (IPS_GetVariableIDByName ("settings_brightness_min", $IDHauptschalter));
$BrightnessMax          = GetValue (IPS_GetVariableIDByName ("settings_brightness_max", $IDHauptschalter));

$IDEventAuszeit         = IPS_GetEventIDByName    ("event_auszeit",               $IDScript);
$IDAuszeit              = IPS_GetVariableIDByName ("settings_Auszeit",            $IDHauptschalter);

$IDModusAlt             = IPS_GetVariableIDByName ("modus_old",                   $IDHauptschalter);

$IDEventMelder          = IPS_GetEventIDByName    ("event_melder",                $IDScript);
$IDMelder               = IPS_GetEvent($IDEventMelder)["TriggerVariableID"];

$IDTimerHaupt           = IPS_GetEventIDByName ("timer_hauptschalter",            $IDScript);
$TimerHauptActiv        = IPS_GetEvent ($IDTimerHaupt)["EventActive"];
$TimerHauptClock        = time() + getvalue ($IDAuszeit) + 1;

$IDLichterListe         = IPS_GetInstanceIDByName ("Lichter",                     IPS_GetParent ($IDScript));
$IDMasterGruppe         = IPS_GetLink(IPS_GetLinkIDByName ("OFF",                 IPS_GetParent ($IDScript)))['TargetID'];


$Auszeit                = getvalue ($IDAuszeit);


$IDDaemmerung           = IPS_GetVariableIDByName ("info_daemmerung",            $IDHauptschalter);



/*
// Einschalthelligkeit übertragen für Schalter
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
foreach(IPS_GetChildrenIDs ($IDLichterListe) as $IDLicht){
    $Einschalthelligkeit    = getvalue ($IDLicht);
    $Ziel                   = IPS_GetLink(IPS_GetLinkIDByName ("ziel", $IDLicht))['TargetID'];


    //Einschalthelligkeit übertragen
    if (IPS_GetVariable ($Ziel)['VariableProfile']  == '~Scaling.KNX'    and
        $Einschalthelligkeit                        <= 100               ){
                
        $Name = explode('.', IPS_getname (IPS_GetParent ($Ziel)))[0].".Einschaltwert";;
        $IDEinschalt = IPS_GetVariableIDByName ("Wert", IPS_GetInstanceIDByName ($Name, IPS_GetParent (IPS_GetParent ($Ziel))));
            
        if (getvalue ($IDEinschalt) != $Einschalthelligkeit) {RequestAction ($IDEinschalt, $Einschalthelligkeit);   }else{}
    }else{}
}

*/


// ############################################################################ <<<<<<<<<<<<<<<<<-----------------------

// Dämmerung abfragen -- (Was ist mit modi einbindung?)
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if ($EventID                        == $IDEventBrightness        and
    $BrightnessAktuell              <  $BrightnessMin            and
    getvalue ($IDDaemmerung)        == false                     ){
    
    setvalue ($IDDaemmerung, true);

    // Einmalig Licht wenn jemand da ist einschalten
    if ($Hauptschalter              == 1            and
        getvalue ($IDMelder)        == true         and     
        getvalue ($IDMasterGruppe)  == false        ){

        Lichtmanager (true);
    }else{}
}else{}


if ($EventID                        == $IDEventBrightness        and
    $BrightnessAktuell              >  $BrightnessMin + 100      ){
    
    setvalue ($IDDaemmerung, false);
}else{}


if ($EventID                        == $IDEventBrightness        and
    $BrightnessAktuell              >  $BrightnessMax            ){
    
    setvalue ($IDDaemmerung, false);
    // Licht ausschalten
    Lichtmanager (false);
}else{}






// Modus ändern
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if ($EventID                       == $IDEventHauptschalter     ){

    setvalue ($IDModusAlt, $_IPS['OLDVALUE']);
    setvalue ($IDAuszeit, 0);
    IPS_SetEventActive($IDTimerHaupt, false);
}else{}




// Melder deaktivieren - Timer setzen
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if ($EventID                        == $IDEventAuszeit          and 
    $Auszeit                        >  0                        ){
    
    if (IPS_GetEvent ($IDTimerHaupt)['EventActive'] == false){
    setvalue ($IDModusAlt, getvalue ($IDHauptschalter));
    }else{}

    // Event von Hauptschalter kurzzeitig ausschalten
    IPS_SetEventActive ($IDEventHauptschalter, false);
    IPS_Sleep (500);
    RequestAction ($IDHauptschalter, 0);
    IPS_Sleep (500);
    IPS_SetEventActive ($IDEventHauptschalter, true);

    IPS_SetEventCyclicTimeBounds($IDTimerHaupt, $TimerHauptClock, 0);
	IPS_SetEventActive($IDTimerHaupt, true);
}else{}




// Alten Modus auswählen wenn Timer abgelaufen
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if ($EventID                        == $IDTimerHaupt            ){

    RequestAction ($IDHauptschalter, getvalue($IDModusAlt));
    setvalue ($IDAuszeit, 0);
    IPS_SetEventActive($IDTimerHaupt, false);
}else{}




// Licht schalten
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if ($EventID                        == $IDEventMelder           or
    $EventID                        == $IDEventHauptschalter    ){


    switch  ($Hauptschalter) {

        case 0:     // 0 = Nix machen
        break;

        case 1:     // 1 = ON OFF
        if (getvalue ($IDMelder)    == true             and 
            $BrightnessAktuell      <  $BrightnessMin   ){

            Lichtmanager (true);
        }else{}

        if (getvalue ($IDMelder)    == false            ){

            Lichtmanager (false);
        }else{}
        break;

        case 2:     // 2 = Nur Aus
        if (getvalue ($IDMelder)    == false            ){

            Lichtmanager (false);
        }else{}
        break;
    }

}else{}







function Lichtmanager ($StatusNeu) {
    global $IDScript, $IDLichterListe, $IDMasterGruppe;

    foreach(IPS_GetChildrenIDs ($IDLichterListe) as $IDLicht){
            $Einschalthelligkeit    = getvalue ($IDLicht);
            $Ziel                   = IPS_GetLink(IPS_GetLinkIDByName ("ziel", $IDLicht))['TargetID'];

            // Licht schalten
            if ($StatusNeu == true   and $Einschalthelligkeit != 999  and getvalue ($Ziel) == 0)     {RequestAction($Ziel, $Einschalthelligkeit); }else{}
            if ($StatusNeu == false)                                                                 {RequestAction($Ziel, 0);                    }else{}
    } 
}

Das wäre Sicher eine Sache für ein Modul. Nur tu ich mir mit der Entwicklung aktuell noch schwer. Bzw ich habs noch nie versucht. Dieses YouTube Tutorial von Symcon hab ich mal angeschaut. allerdings bin ich da nicht so wirklich durchgestiegen.

Evtl kannst du mir mal auf die Sprünge helfen

in der Zwischenzeit kannst ja das Modul @traxanos probieren :slight_smile:
Er freut sich sicher über Feedback!
cheers Seppm