Fenster offen - Warnung, Skript

Hallo,

ich suche ein einfaches Skript um eine PopUp Message beim geöffnet Fenster zu senden.

Meine Idee ist irgendwie:

wenn das Fenster 15 minuten offen ist, die außen und Innentemperatur sich mehr um x Grad unterscheiden, dann eine IPS-Message aufs Hand oder Alexa ansage.

Fenster der auslösenden Variable ist offen

Ein paar Sachen hatte ich im Forum schon gefunden, aber noch nicht so direkt die Meldung nach Zeit.

Man könnte das Skript auch alle 15 minuten laufen lassen und die letzte Änderung von der Fensterkontakte Variable abfragen.

Hat jemand schon so etwas gebaut?

danke :slight_smile:

Zum Beispiel damit

In der Aktion sind allerdings keine Verknüpfungen mit der Temperatur möglich.
Müsstest das also in einem PHP Script lösen.
Michael

ich wollte sowas auch immer coden, hatte aber bisher noch keine Lust.

hier mal nen schneller Entwurf. Läuft aber hab unten beim TimerEvent den Push teil noch nicht getestet.

Wenn ich drüber nachdenke bin ich nicht sicher ob das wirkt. denn im Herbst oder Winter wenn die Temperatur fällt bei Fenster auf will die Heizung ja ausgleichen. ggf. ändert sich die Temperatur gar nicht so stark.

<?php

// auslöser ist fensterkontakt bei änderung
// dann temperatur merken und dann alle 15 min. prüfen ob die temperatur unter einen differenzwert fällt. wenn ja= push nachricht

// ID der überwachenden IST temperatur
$ID_IST_TEMP = 22881;
// Delta T
$ID_DELTA_T = 2;
// Status offen des kontaktes festlegen. bei manchen ist es true, bei manchen false oder 0 oder 1
$VAL_OFFEN = false;

// wenn auslöser ist der fensterkontakt, noch check ob timer und variable schon angelegt
if ($_IPS['SENDER']=="Variable"  )
{
    if (GetValue($_IPS['VARIABLE']) == $VAL_OFFEN )
    {   // fenster offen
        if (count( IPS_GetChildrenIDs($_IPS['SELF']))==1 )
        {
            // objekte noch nicht angelegt, dann anlegen
            $ID_NEW = IPS_CreateVariable(2);                         // temp variable anlegen
            IPS_SetName($ID_NEW, "aktuelle Temperatur");
            IPS_SetParent($ID_NEW, $_IPS['SELF'] ); 
            SetValue($ID_NEW, GetValue($ID_IST_TEMP));     
            // timer unter variable anlegen
            $ID_NEW_Timer = IPS_CreateEvent(1);
            IPS_SetEventCyclic($ID_NEW_Timer, 2, 1, 0, 2, 2, 15);    //alle 15 min
            IPS_SetParent($ID_NEW_Timer, $ID_NEW); 
            IPS_SetEventActive($ID_NEW_Timer, true);      
            IPS_SetEventScript($ID_NEW_Timer, $_IPS['SELF']);         
        }
    }
    else
    {   // fenster zu, überwachung beenden 
        if (count( IPS_GetChildrenIDs($_IPS['SELF'])) > 1 )
        {   // nur löschen wenn mehr childs vorhanden sind
            $ID_list = IPS_GetChildrenIDs( $_IPS['SELF'] );
            
            for($i=0; $i < count($ID_list); $i++) {                  // temp variablen und timer löschen
                $obj = IPS_GetObject($ID_list[$i]);
                
                if ($obj['ObjectType'] == 2)
                {   // varaible gefunden und event darunter löschen
                    $ID_var = IPS_GetObject( $ID_list[$i])["ObjectID"]; 
                    $VAR_childs = IPS_GetChildrenIDs($ID_var);
                    for($j=0; $j < count($VAR_childs); $j++) { 
                        IPS_DeleteEvent( $VAR_childs[$j] );
                    }
                    IPS_DeleteVariable( $ID_var );
                }
            }
        }

    }
}


// wenn auslöser timer, prüfen ob delta überschritten
if ($_IPS['SENDER']=="TimerEvent")
{
    // wenn delta überschritten
    if (GetValue($ID_IST_TEMP) < (GetValue($ID_NEW) - $ID_DELTA_T)  )
    {
        // push nachricht
        echo ("push");

    }
}

[quote=„[Modul] NoTrigger (Variablenüberwachung) - Überwachen von IPS-Variablen auf ausbleibende Aktualisierung oder Veränderung, post:1, topic:42474“]
Funktionsumfang
[/quote]

HI, das hatte ich mir angeguckt, auch den Watchdog, ist ja fast das gleiche. Aber da müsste ich für jedes Fenster eine Überwachung und Timer einzeln bauen, da er ja nur auf Veränderung prüft, hier fehlte Veränderung + Zustand. Fenster zu ist ja ok, da würde er dann ja auch Alarm machen.

HI, auf den ersten Blick sieht das gut aus. Da nicht programmieren kann brauche ich gleich etwas länger um mich reinzufummeln. Aber eine Benachrichtigung bauen ist ja sogar für mich kein Problem :slight_smile:

Temperatur müsste man Testen. Ich würde nicht an der Heizung abfragen sondern am ShellyHT oder der Klimaanlage. Man könnte auch Durchschnittswerte nehmen. Alle im 1 OG gegen die Außentemperatur.
Und danach könnte man noch die Ventilstellung der Heizungsthermostaten und die Heizleistung der Klimaanlage einfließen lassen ( die besten Ideen kommen beim Schreiben).

Ja klar musst das Raumthermostat nehmen. Für das Delta T musst dir mal die Temperatur anschauen bei Fenster auf. Ich habe eben z.b. auch gerade gemerkt das ich noch ein Fenster offen hatte.
Sah dann so aus:

Also hätte knapp 4 h gebraucht damit die Temperatur um 2 Grad fällt. Ist ja auch abhängig von der Außentemperatur wie schnell das geht.

Un das war eigentlich erst mein Ansatz (ich hab nicht überall einen Fensterkontakt) nur die Temperatur zu nehmen. Also wenn die Raumtemperatur schnell (ich sag mal in 60 Min) um X Grad fällt kann nur das Fenster auf sein.

Dazu muss man sagen das die Temperatur Fühler durchaus Schätzeisen sind. Meine sind z.b. im Lichtschalter Einbaurahmen.

GGf. wäre es mit mit einer Variablenüberwachung einfacher…so nach dem Motto nicht länger wie 30 Min. Fenster auf. Geht dir dann nur auf den Keks wenn du vielleicht lange das Fenster auf haben willst :wink:

ich mache so etwas über [Modul] Notice (Mitteilungen) - man kann eine Benachrichtigung NotveEvent erzeugen, die aber bis zur ersten Meldung pausiert, besteht die Bedingung dann noch, wird gemeldet, ggfs. auch wiederholt.

In Kombination mit Temperaturabsenkung habe ich gerade was reingestellt: [Modul] Lüftungsüberwachung(

1 „Gefällt mir“

Hi,
das ist eigentlich ganz nett, aber schon viel zu komplex.
Ich würde gar nicht nach dem Abfall der Temperatur im Raum gehen, sondern nach der Außentemperatur.

Beispiel:
wenn es draußen unter 15°C ist, das Fenster länger als 15minuten offen dann sende eine Warnung per Push : „Fenster Schlafzimmer ist seit 15min offen“

Der Temperatur Abfall im Raum ist ja realtiv egal, da ich davon ausgehe das es immer mehr als 19°C ist.

@Dustin723
ich habe mit einem durch Aussentemperatur getriggertes Skript so gelöst
unterschiedlich nach den Jahreszeiten
Winter

require_once("fenster_varis.ips.php");

 
				if ($fenster1 == 1)
				     {
					 echo "fenster bad geöffnet"."\n" ;
					 if ($temp < 10)
						   {
                                echo "fenster bad bitte schliessen"."\n" ;
                                $sonos  =   44944;
                                $datei 	=	json_encode( Array( "http://192.168.xxx.xx.82/user/ansage/fenster_bad.wav"));
                                SNS_PlayFiles($sonos,$datei,30);

                                WFC_SendNotification($wf, 'INFO', 'Fenster Bad schliessen', 'fenster_closed', 30);
						   }
					 }

Sommer

	require_once("fenster_varis.ips.php");


if ((date("H") >= 06) AND (date("H") < 22)) 

	{
   		if($aussen > 20)
		{
			if ($fenster1 == 0)
				    {
					echo "fenster bad geschlossen"."\n" ;
					if ($temp < 0)
				           {
                            echo "fenster bad bitte öffnen"."\n" ;


                            $sonos  =   44944;
                            $datei 	=	json_encode( Array( "http://192.168.xxx.xx:82/user/ansage/fenster_bad_oeffnen.wav"));
                            SNS_PlayFiles($sonos,$datei,30);
                            WFC_SendNotification($wf, 'INFO', 'Fenster Bad Öffnen', 'fenster_open', 30);
						   }
					}
				
			else
                    {
                    echo "fenster bad geöffnet"."\n" ;
                    if ($temp > 0)
                        {
                        echo "fenster bad bitte schliessen"."\n" ;


                        $sonos  =   44944;
                        $datei 	=	json_encode( Array( "http://192.168.xxx.xx:82/user/ansage/fenster_bad.wav"));
                        SNS_PlayFiles($sonos,$datei,30);
                        WFC_SendNotification($wf, 'INFO', 'Fenster Bad schliessen', 'fenster_closed', 30);
                        }
                    }
		}
	}

im Sommer abends auch die Aufforderung zum Öffnen

Ich da glaube da fehlt der wichtigste teil :slight_smile:

hab gerade mal was gebastelt, das wäre so in etwas das was ich mir vostellen:
da würde ich ein Event drauf legen welches nur läuft wenn das Fenster auf ist und die Temperatur niedrig genug ist.

Muss man aber leider auf jedes Fenster einzeln legen :frowning:

//Anpassen
$FensterID = 56728;
$Warnungaktiv = GetValue(28974);
$WarnungTimer = GetValue(46953);
$Skripthäufigkeit = (int)(46953/60); //in sekunden 
$WFC_PushNotification = 30508;

//Skript
$Fenstername = IPS_GetName($FensterID);
$FensterStatus = GetValue($FensterID);
$TimerSek = ($WarnungTimer*60);
$ZeitstempelStatus = IPS_GetVariable($FensterID)['VariableChanged'];
$AktuelleZeit = time();
$TimerDauer = ($ZeitstempelStatus - $AktuelleZeit + $TimerSek);
$Warnstop = ($TimerDauer + $Skripthäufigkeit + $WarnungTimer);
$DaueroffenMIN = (int)(-$TimerDauer/60);

echo "Timer   : $TimerDauer \n";
echo "Warnstop: $Warnstop \n";

if (($TimerDauer < 0) & ($TimerDauer > $Warnstop) & ($FensterStatus == 1) & ($Warnungaktiv == true))  
	   {
        WFC_PushNotification($WFC_PushNotification, "Fenster", " $Fenstername offen seit $DaueroffenMIN min ", "full", 0);
        echo "ist wohl offen";
	   }
	else
		{
		echo "keine Warnung";
		}

in den Varis stehen nur dir IDs der Sensoren
demnächst will ich die Skripte noch zusammenfassen und die Jahreszeit abfragen
Die Skripte laufen schon 10J

ja, sonst geht das ja auch nicht. Aber das halt dann 15 Skripte, weil 15 Fenster.
Deswegen habe ich es gemacht, das ist nicht so viel zu ändern ist pro Fenster

Ich hab leider keine Ahnung wie ich ein Skript für alle Fenster machen kann.

Sieht nur so aus weil er die Variablen/Timer anlegt und löscht.

Generell wäre ich bei dir. Ich nutze das so gar nicht selber :wink:
Denn eigentlich wollte ich nur die Temperatur nehmen, wie ich sagte habe ich an einigen Fenstern keine Kontakte.

Ansonsten hast recht einfach nach 15 Min. anmeckern.

@Dustin723
für alle Fenster ist ganz einfach: nimm das Gatter aus dem Store
da kannst du alle Sensoren verknüpfen und das Ergebnis in eine Variable schreiben

Moin @Dustin723,

offensichtlich hängt bei deinem Skript alles von der FensterID ab. Du müsstest also nur alle FensterID in ein Array packen und dann über dein gesamtes Skript eine foreach Schleife laufen lassen. So würden dann alle Fenster verarbeitet. Starten würde ich es einfach zyklisch alle xx Minuten. So ähnlich habe ich das bei mir auch mit einem Skript gelöst.

Gruß
Hans

Stimmt, damit könnte das klappen.
Ich versuche mal in einem anderen Skript mit Arry abzuschreiben :slight_smile: so schlimm kann ein Array ja nicht werden :slight_smile:

lol, das Gatter ist in 15sek fertig

lol… stimmt… ich weiß auch nicht warum einige Leute keine Flugzeuge landen können :-P.
Ich kanns… aber programmieren, das kann ich nicht.

beim OR-Gatter muss nix geproggt werden. Und das mit dem Landen klappt super :grinning:

Hab mal versucht das Skript zu „landen“

bin gespannt obs ne Bruchlandung wird.

<?php
$FensterListe = array ();
array_push($FensterListe, 56728);
array_push($FensterListe, 35147);
array_push($FensterListe, 35147);
array_push($FensterListe, 53501);
array_push($FensterListe, 50847);
array_push($FensterListe, 56351);
array_push($FensterListe, 31109);
array_push($FensterListe, 51651);
array_push($FensterListe, 20343);
array_push($FensterListe, 22222);
array_push($FensterListe, 26960);
array_push($FensterListe, 57773);
array_push($FensterListe, 12791);
array_push($FensterListe, 32381);
array_push($FensterListe, 13088);
array_push($FensterListe, 40758);
array_push($FensterListe, 33837);
array_push($FensterListe, 19326);
array_push($FensterListe, 16256);



//Anpassen

$Warnungaktiv = GetValue(28974);
$WarnungTimer = GetValue(46953);
$Skripthäufigkeit = (int)(46953/60); //in sekunden 
$WFC_PushNotification = 30508;
$outtemp = (int)GetValue (36293);


//------------------------------------------------------------------------------------------------------------------
$AktuelleZeit = time();
$TimerSek = ($WarnungTimer*60);

foreach($FensterListe AS $FensterID)
        {
        
        $FensterParent = IPS_GetParent($FensterID);
        $Fenstername = IPS_GetName ($FensterParent);
        $FensterStatus = GetValue($FensterID);
        $ZeitstempelStatus = IPS_GetVariable($FensterID)['VariableChanged'];
        
        $TimerDauer = ($ZeitstempelStatus - $AktuelleZeit + $TimerSek);
        $Warnstop = ($TimerDauer + $Skripthäufigkeit + $WarnungTimer);
        $DaueroffenMIN = (int)(-$TimerDauer/60);

        echo "-------------------- \n";
        echo "Timer   : $TimerDauer \n";
        echo "Warnstop: $Warnstop \n";
        //echo "Fenster Parant: $FensterParent \n";
        
        

        if (($TimerDauer < 0) & ($WarnungTimer < $Warnstop) & ($FensterStatus == 1) & ($Warnungaktiv == true))  
            {
                WFC_PushNotification($WFC_PushNotification, "Fenster", " $Fenstername offen seit $DaueroffenMIN min. Temperatur außen: $outtemp °C ", "full", 0);
                echo "$Fenstername ist wohl offen \n";
            }
            else
                {
                echo "$Fenstername \n";
                echo "keine Warnung \n";
                }
        }