Notification nach bestimmter Zeit

Hi Leute und Hohoho!

Irgendwo steckt mein Denkapparat in der Sackgasse.

Ich habe gestern vergessen meine Garage zu schließen. Stand also über Nacht offen. Ich habe bereits eine Script, welches eine Push schickt, wenn die Garage geöffnet wird. Nun hätte ich auch gern ein solches, wenn die Garage nach Zeit X immer noch offen ist (bis sie wieder geschlossen wird natürlich.

Wie gehe ich am besten vor? Welche Variablen Mappe ich am besten rein?

Danke euch und ein frohes Fest,

Flo

Hi,

hier mal mein Ansatz (Fragment):

	$ARR = IPS_GetVariable($VarID);
	$s   = intval((time() - $ARR['VariableUpdated']));

Nimm z.B. die Variable, die den Status „geschlossen/geöffnet“ enthält und prüfe zyklisch, ob die Anzahl Sekunden
bereits überschritten wurde seit der letzten Änderung
.
Geht bestimmt schicker / anders, ist ja auch nur als „Schnellstarthilfe“ gedacht :slight_smile:

LG Tom

Hallo,

ich mache verzögerte Meldungen oder Aktionen immer nach diesem Schema:


<?php
$scriptName = IPS_GetName($_IPS['SELF']) . '(' . $_IPS['SELF'] . ')';

$alert = GetValueBoolean(35841); // hier wird eine oder mehrere Variable(n) angefragt, in diesem Fall true = Alarm
$msg_ts = GetValueInteger(53995); // Timestamp der Meldung

$sec4firstMsg = 15 * 60; // 15 Minuten
$sec4nextMsg = 24 * 60 * 60; // 1 Tag

$msg = '';
$sec2sleep = 0;

if ($_IPS['SENDER'] == 'TimerEvent') {
    if ($alert == false) {
        // MELDUNG: Gerät ist wieder erreichbar
        $msg = 'normal operation resumed';
        SetValueInteger(53995, 0);
    } else {
        // MELDUNG: Gerät ist nicht erreichbar
        // 24h abwarten für weitere Meldungen
        $msg = 'sent notification';
        $sec2sleep = $sec4nextMsg;
    }
} else {
    if ($alert == false) {
        if ($msg_ts && time() - $msg_ts > $sec4firstMsg) {
            // nur ok-meldung, wenn der Timer schon angelaufen war und einer erste Meldung erzeugt hatte
            // MELDUNG: Gerät ist wieder erreichbar
        }
        $msg = 'normal operation';
        SetValueInteger(53995, 0);
    } else {
        // 15 Minuten bis zur ersten Meldung
        $msg = 'delay notification';
        $sec2sleep = $sec4firstMsg;
        SetValueInteger(53995, time());
    }
}

IPS_SetScriptTimer($_IPS['SELF'], $sec2sleep);
IPS_LogMessage($scriptName, 'alert=' . ($alert ? 'true' : 'false') . ' => ' . $msg);

Das Script bietet

  1. nach Eintritt des Ereignisses wird eine bestimmte Zeit gewartet, bevor es die erste Aktion gibt
  2. nach der ersten Aktion wird ein längerer Zeitraum gewartet, bis eine erneute oder andere Aktion erfolgt.

Man braucht also für jeder dieser Aktionen / Meldungen
a) des angepasste Script
b) eine Integer-Variable zum Merken des Timestamps der Auslösung

Das Script wird typischerweise durch Änderung einer oder mehrerer Variablen getriggert.

Gruß
demel

Nimm dies…
https://www.symcon.de/forum/showthread.php?p=239960
Michael

Hi,

ich prüfe, ob mein Garagentor noch offen ist mit einem Fensterkontakt. Wenn der TRUE meldet, wird eine Symcon Alarmanlage mit einer Zeitverzögerung von 3600 Sekunden scharf geschalten. Wird das Garagentor geschlossen wird die Alarmanlage ausgeschalten, ansonsten bekomme ich nach 60 Minuten eine Push Meldung, dass das Tor noch offen ist. Für verschiedene Fensterkontakte habe ich ähnliches eingerichtet.

Oliver

Hallo Demel,

cooles Skript, damit geht es viel einfacher wie mit meiner „Alarmanlagenlösung“

in deinem Script hast du

$msg = ‚sent notification‘; bzw.
$msg = ‚delay notification‘;

was bewirken diese Befehle?
Sendest du unterschiedliche Nachrichten nach Zeit eins und zwei?
wenn ja, wie machst du das?

Oliver

$msg wird weiter unten per IPS_LogMessage() ausgegeben, sonst bewirkt das weiter nichts.

delay notification sagt nur aus, das es zwar einen Auslöser gab, aber die initial Wartezeit nicht überschritten wurde, sent notification, das ich eine Meldung verschickt haben.

Wenn man eine andere Meldung verschicken will, nach delay bzw dann in der Wiederholung, würde ich den Code so anpassen:


    } else { 
        // MELDUNG: Gerät ist nicht erreichbar 
        // 24h abwarten für weitere Meldungen 
        $msg = 'sent notification'; 
        $sec2sleep = $sec4nextMsg; 
    } 

ersetzen durch


    } else {
        if (time() - $msg_ts < $sec4nextMsg) {
            $msg = 'sent notification';
            // 1. MELDUNG: Gerät ist nicht erreichbar
        } else {
            $msg = 'sent reminder';
            // ERINNERUNG: Gerät ist nicht erreichbar
        }
        // 24h abwarten für weitere Meldungen
        $sec2sleep = $sec4nextMsg;
    }

Ist aber ungetestet …

demel

hat geklappt, danke

Oliver

Hallo zusammen,

ich habe mich mal an Nall-chan’s Modul versucht. Wie zu erwarten, macht es das, was es soll. Leider passt es nicht so ganz auf meinen Anwendungsfall. Vielleicht hast du hierzu eine Idee, wie ich dein Modul hierzu anwenden kann.

Dazu habe ich einen Screenshot gemacht, der die Funktion besser veranschaulichen soll:

Der Pufferspeicher meiner Heizung fordert unter bestimmten Bedingungen den Pelletofen an A04.
Ist alles gut und erreicht der Temperaturfühler im Ofen eine bestimmte Temperatur schaltet die Zirkulationspumpe A05.

Was ich also bräuchte, ist eine Meldung wenn die Zirkulationspumpe A05 nach 30 Minuten noch nicht angefordert wurde.

Hast du hierzu eine Idee?

Danke und Gruß, Alfred