Notification Control / Push Notification - Queue

Hallo,
eine generelle Frage zu Push Notifications. Gibt es dafür eine Warteschlange bzw. eine Kontrolle, ob die Nachrichten auch am Symcon-Server angekommen sind?
Mit kommt es so vor, dass Nachrichten nicht versendet werden, wenn zum Zeitpunkt des Versendens keine Internetverbindung besteht.

In meinem Fall will ich eine Nachricht senden, wenn die erste DSL-Leitung ausgefallen ist. Jedoch dauert es kurz, bis auf die zweite Leitung umgeroutet wird. Die Meldung des Ausfalls habe ich nicht bekommen. Die der Wiederkehr schon.

Grüße
Stefan

Warteschlange. Nein. Kontrolle. Ja. Du kannst auf das versenden reagieren und bekommst ein False zurück falls die Nachricht nicht versendet werden konnte. Dann kannst du es ja entsprechend nach paar Sekunden erneut versuchen.

paresy

Alles klar, dann weiß ich hier bescheid. Mal sehen, wie ich das möglichst universell lösen kann. Vielleicht ein extra script global für das versenden von Notifications welches dann die Aufgabe einer queue übernimmt.

Schön wäre, wenn das nativ wäre.

Somit wäre dieser post am besten unter Funktionswünsche -> IP-Symcon aufgehoben :slight_smile:

Bitte so nicht verwenden. Erklärung hier: https://www.symcon.de/forum/threads/41717-Notification-Control-Push-Notification-Queue?p=427791#post427791

Ich hab mal auf die Schnelle was zusammengebastelt, falls jemand das auch brauchen kann und es die Funktion nicht nativ geben wird.

PushNotification (Script)

<?php

// InstanzID    ID des WebFront Konfigurators
// Titel    Titel der Meldung (maximal 32 Zeichen). Kann auch leer sein.
// Text    Text der Meldung (maximal 256 Zeichen).
// Sound    Wird in den Apps ab Version 3.0.6 ausgewertet
// TargetID    Es kann beim Öffnen der Push Nachricht direkt zu einem Objekt gesprungen werden. (ab Version 5.0)

function PushNotification($InstanzID, $Titel, $Text, $Sound, $TargetID){
       $result = WFC_PushNotification($InstanzID, $Titel, $Text, $Sound, $TargetID);
    
   
    if ($result == false){
        $queue = IPS_GetChildrenIDs($GLOBALS['PushNotificationID']);
        $queuecount = count($queue);
        $varID = IPS_CreateVariable (3);
        IPS_SetParent($varID,$GLOBALS['PushNotificationID']);
        IPS_SetName ($varID, $queuecount);
        setvalue($varID,$InstanzID.",".$Titel.",".$Text.",".$Sound.",".$TargetID);
    }
    
}

?>

Check-Queue (Script wird zyklisch aufgerufen)

<?php

$queue = IPS_GetChildrenIDs(ips_getparent($_IPS['SELF']));

foreach ($queue as &$value) {
    if ($value != $_IPS['SELF']){
        $string = GetValueString($value);
        $data = explode(',',$string);
        $InstanzID = $data['0'];
        $Titel = $data['1'];
        $Text = $data['2'];
        $Sound = $data['3'];
        $TargetID = $data['4'];
        $result = WFC_PushNotification($InstanzID, $Titel, $Text, $Sound, $TargetID);
        if ($result == true){
            IPS_DeleteVariable ($value);
        }
    } 
}

?>

Benutzung:

<?php

include('31693 /*[Include\PushNotification]*/.ips.php');
$GLOBALS['PushNotificationID'] = 31693 /*[Include\PushNotification]*/;

PushNotification(123456 /*[WebFront]*/, 'Info', 'Queue Test', '', 0);

?>

Werden die Zeile include und GLOBALS in die __autoload.php eingetragen, so ist die Funktion als Befehl PushNotification genau gleich wie WFC_PushNotification einsetzbar. Oder man trägt die zwei Zeilen nur in die Scripte ein, in denen es auch verwendet wird um den Overhead zu reduzieren.

Struktur der Scripte:
struktur.png

Grüße
Stefan

Wer solch ein Konstrukt verwendet, soll auch ein passendes Limit / Abbruch-Kriterium einbauen. Aktuell hatten wir das Problem, dass die Subskription beim User abgelaufen ist und die Queue somit nur großer wurde und jede Minute auf unseren Server mit tausenden von Anfragen eingeschlagen hat. Bitte unbedingt ein Limit definieren, und die Versuchsintervalle exponentiell steigen lassen.

paresy

Hi Paresy,
vielleicht kann sich ja auch einfach Symcon darum kümmern, dass keine Benachrichtigungen verlohren gehen, wenn mal ein paar Minuten kein Internet vorhanden ist.
Warum muss sich hier der zahlende (Subscription) Kunde selbst darum kümmern, dass nichts weg kommt?

Natürlich kann Symcon auch WFC_PushNotification im nächsten Update so anpassen, dass der Befehlt gar nicht mehr zu einem Connect auf den Server führt, wenn die Subscription abgelaufen ist - die Information dazu ist ja vorhanden, sonst könnte es ja nicht in der Webconsole angezeigt werden.

Also hier die Idee für euch - unbedingt ein Limit / Abbruch-Kriterium in WFC_PushNotification einbauen - Sowas sollte man nicht dem Kunden überlassen und sollte von den Profis übernommen werden.

Grüße
Stefan

Hi Stefan,

das mit den Limits haben wir auf jeden Fall schon geplant und es wird zeitnah kommen. Bzgl. Queueing nehme ich aber ebenfalls gerne mit auf. :slight_smile:

paresy

Hier noch eine kleine Ergänzung für einen Abbruch der Foreach Schleife. Somit wird beim ersten Fehler in der Queue nicht alle Meldungen aus der Queue am Server getestet.

<?php

$queue = IPS_GetChildrenIDs(ips_getparent($_IPS['SELF']));

foreach ($queue as &$value) {
    if ($value != $_IPS['SELF']){
        $string = GetValueString($value);
        $data = explode(',',$string);
        $InstanzID = $data['0'];
        $Titel = $data['1'];
        $Text = $data['2'];
        $Sound = $data['3'];
        $TargetID = $data['4'];
        $result = WFC_PushNotification($InstanzID, $Titel, $Text, $Sound, $TargetID);
        if ($result == true){
            IPS_DeleteVariable ($value);
        }
        if ($result == false){
           break;
        }
    } 
}

?>

Somit werden die Serveranfragen auf eine pro Minute reduziert, falls ein Fehler vorliegt.

Grüße
Stefan

Perfekt. Vielen Dank!

paresy