VISU_PostNotificationEx verhindert das setzten eines Status im Frontend

Hallo,
bei der Programmierung eines Moduls ist mir ein nicht erklärbares Verhalten aufgefallen,
wenn ich mir meinen Code so anschaue, sollte hier alles korrekt sein.

Infos zum Modul bzw. zum Verhalten:
Beim Überschreiten eines Grenzwertes für die Luftfeuchtigkeit, wird der Status gesetzt und auch gleichzeitig eine Push Nachricht mit einer Info dazu an den User geschickt.

Die Push-Nachricht kann deaktiviert und aktiviert werden.
Wenn keine Push-Nachricht gesendet wird funktioniert alle ohne Probleme.
Sobald die Push-Nachricht aktiviert ist tritt das Problem auf.

Meine Erwartung bzw. wie ich es mir Vorstelle:

  • Der Slider für „Grenzwert“ wird verschoben, anschließend findet die Prüfung statt = neuer Sliderwert wird gesetzt im Frontend
  • Danach kommt die Abarbeitung zum feststellen + setzten des Status: luftfeuchtigkeit();
  • Als nächstes kommt das senden der Nachricht: feuchtigkeitsmeldung()

Da das ganze nacheinander passiert, würde ich nicht erwarten das die Nachricht keinen Einfluss hat. Ihr könnte sehen, das sich der Wert der Status-Variablen setzt wie es erwartet wird nur das verschieben des Sliders hängt bzw. dieser verschiebt sich nicht, erst nach einem zweiten Klick.
Zur Verdeutlichung habe ich das ganze in einem Video nachgestellt.

2024-07-16 03-37-08.mkv (961,3 KB)

Der entsprechende Code dazu:

    public function RequestAction($Ident, $Value) {
        switch ($Ident) {
            case "grenzwert":
                $this->SetValue($Ident, $Value);
                $this->luftfeuchtigkeit();
                $this->feuchtigkeitsmeldung();
                break;
            case "meldeverzoegerung":
                $this->SetValue($Ident, $Value);
                $this->feuchtigkeitsmeldung();
                break;
            default:
                throw new Exception("Invalid Ident");
        }
    }

    
    public function luftfeuchtigkeit() {
        // Wenn der Grenzwert oder die Luftfeuchtigkeit aktualisiert wird, eine Prüfung durchführen
        $ist_luftfeuchtigkeit       = GetValue($this->ReadPropertyInteger("ID-Luftfeuchtigkeit"));
        $grenzwert                  = GetValue($this->GetIDForIdent("grenzwert"));
        if ($ist_luftfeuchtigkeit > $grenzwert) {
            // Status setzen + Feuchtigkeitsmeldung senden
            SetValue($this->GetIDForIdent("status_lueften"), true);
        } else {
            // Status zurücksetzen
            SetValue($this->GetIDForIdent("status_lueften"), false);
            $this->feuchtigkeitsmeldung();
        }
    }

 
    public function feuchtigkeitsmeldung() {
    // Senden einer Push-Nachricht, wenn der Grenzwert über die Zeit der Meldeverzögerung überschritten wird
    $ident  = $this->GetIDForIdent("status_lueften");
    $status = $this->GetValue("status_lueften");
    $meldeverzoegerung = GetValue($this->GetIDForIdent("meldeverzoegerung"));

    $content    = IPS_GetVariable($ident);
    $result     = time() - $content['VariableChanged'];
    $minuten    = $result / 60;
    $minuten    = $minuten + 1/60;

    $pushID     = $this->ReadPropertyInteger("ID-Webfront");
    $pushstatus = $this->ReadPropertyBoolean("ID-Push");
    $bufferdata = $this->GetBuffer("PushNachricht");

    if ($status == true) {
        if ($minuten > $meldeverzoegerung && $pushstatus == true && $bufferdata != "Sent") {
            VISU_PostNotificationEx($pushID, "Luftfeuchtigkeit!", "Die Luftfeuchtigkeit ist zu hoch!", "Alert", "alarm", 0);
            $this->SetBuffer("PushNachricht", "Sent");
        }
    }
    else {
        $this->SetBuffer("PushNachricht", "Reset");
    }
    }

Ist $pushID wirklich eine Instanz vom Typ Kachel Visualisierung? Und warum ist Target bei VISU_PostNotificationEx auf 0?
Ist das Root Objekt bei dir in der Visu verfügbar?
Wäre hier nicht z.b. die Instanz von deinem Modul sinnvoll?
Michael

Hi Nall-chan,
das ist wirklich die ID vom Webfront, falls es nicht so wäre, würde ich erwarten, das ich keine Notifikation im Webfront sehe.

Die VISU_PostNotificationEx hatte ich auf 0 gesetzt, weil ich hier keine Aktion bzw. kein wechseln auf eine bestimmte Seite möchte bzw. es nicht angedacht ist.

Ich habe als Target jetzt auch mal auf die ID meiner Modul-Intanz gesetzt und getestet,
das gleicher verhalten.

Gib mir bitte noch einen Denkanstoß zu deiner Frage / Hinweis, ich komme leider nicht drauf:

  • Was meinst du mit dem Root-Objekt genau?

Also falsch, oder wie?
Das muss eine Kachel Visualisierung Instanz sein.
Michael

TargetID 0 ist das Root Objekt.
Also das oberste Element in deinem Objektbaum.
Siehe auch deine Frage zum erstellen von Links.
0= oberstes Element
Michael

Eine Kachel-Visualisierung ist vorhanden, diese ist auch ausgewählt:

Das Root-Objekt ist in der Virtualisierung verfügbar, das wäre in diesem Fall dann
„IP-Symcon Notebook“ (im Video zu sehen)

objektbaum

Ich habe mir das ganze gerade nochmal im normalen Webfront angesehen, hier kann ich keine Verzögerung feststellen.

Wenn ich die Grenze überschneide erhalte ich im Webfront keine Benachrichtigung, da die Benachrichtigung nur in der Kachelvisualisierung erscheint, nicht im Webfront.
(Aufgrund des Befehls zum senden der Nachricht, ist das ist hier korrekt.)

Im Webfront, wo ich die Aktionen durchführe verglichen zur Kachelvisualisierung, kann man sehen das die Variable jedes mal geschalten wird und nicht hängt. Sobald ich die Kachel-Visualisierung bediene, dann bleibt es wieder hängen, wie auf dem ersten Video zu sehen.

Vielleicht kann man das so nicht vergleichen wie ich es gemacht habe, aber die Aktion in der Kachel-Visualisierung ist im Enddefekt die gleiche, egal ob dort oder im Webfrontend geändert, oder nicht?

@Parzival Kannst du dir das mal ansehen? Das könnte nach einem Bug in der Visu klingen?

paresy

1 „Gefällt mir“

Es scheint aktuell ein Problem in der Visu zu geben, wenn das ausgeführte Aktionsskript/ die Aktion einen kleinen Moment dauert. In diesem Fall das versenden der Push Nachricht. Der Slider blockiert bis die Aktion ausgeführt wurde. Das ist noch ein bisschen hakelig. Wir schauen uns das an. In der Zwischenzeit kannst du mit dem RegisterOnceTimer die Pushnachricht verschicken, ohne dass die restliche Ausführung warten muss.

Super, vielen Dank für die Rückmeldung und den genannten Workaround.
Werde ich vorerst so implementieren.

Mit dem nächsten Update aktualisiert sich der Slider wieder direkt. Ähnlich wie im WebFront.

1 „Gefällt mir“

@Parzival
Die Änderung ist im aktuellen Update des Testkanals schon enthalten, oder?

  • Fix: Slider aktualisieren ihren Wert direkt, auch wenn ein Aktionsskript länger braucht

Sollte eigentlich. Ist das Verhalten immer noch das gleiche?

Ich habe auf die aktuelle Version des Testing-Kanals geupdatet, Version: 7.2, 19.07.2024
Das Verhalten hat sich aber aktuell noch nicht gebessert und ist noch gleich.