[suche Idee] devStateIcon für notify active/disabled

Begonnen von betateilchen, 24 Februar 2015, 20:54:19

Vorheriges Thema - Nächstes Thema

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Irgendwer/-was überschreibt mir immer noch den STATE in einem notify mit einem Timestamp, was dazu führt, dass das devStateIcon nicht funktioniert.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Ich konkretisiere das Problem: Nach einem fhem Neustart zeigt das notify kein devStateIcon an, obwohl während des Startens ein "attr <device> disable 0" gesetzt wird.

Temporär habe ich dadurch Abhilfe geschaffen, dass ich per notify auf global:INITIALIZED das Attribut einfach nochmal setze - dann stimmt plötzlich das Icon. Aber schön ist dieser Workaround nicht.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Du musst es noch mehr konkretisieren (== define + alle attr + Vorgang), da bei mir folgendes ein restart ueberlebt:

define n notify a { Log 1, "$NAME $EVENT" }
attr n devStateIcon active:dog_silhouette disabled:scene_sleeping
attr n disable 1

betateilchen

Es ist ein showTime Problem.

Ich verstehe einfach die Logik nicht, dass ich in JEDEM Device (in einer Liste von devices, die ein notify auslösen können) das Attribut setzen muss, anstatt einfach im notify selbst die Möglichkeit zu haben, die Timestamp Anzeige abzuschalten. Wenn ich in einem notify KEINEN Timestamp sehen möchte, dann bezieht sich das definitiv auf das notify selbst und hat für mich nichts damit zu tun, welches Device auch immer das notify auslöst.

Wehe, man vergisst, das Attribut auch nur bei einem einzigen Device zu setzen...

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Da ich keine andere Möglichkeit gefunden habe, das Problem in den Griff zu bekommen, habe ich jetzt die 91_notify.pm geändert:


      $ntfy->{STATE} =
        AttrVal($ln,'showtime',0) ? $dev->{NTFY_TRIGGERTIME} : 'active';


In AttrVal() den default auf 0 gesetzt anstatt wie bisher auf 1 - und schon ist Ruhe. Damit umgehe ich den Zwang, ein Attribut gesetzt haben zu müssen - und das dann auch noch auf 0.


-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

ZitatIch verstehe einfach die Logik nicht, dass ich in JEDEM Device (in einer Liste von devices, die ein notify auslösen können) das Attribut setzen muss

Das sollte nicht der Fall sein, und ich kann das auch nicht nachvollziehen.
Kannst du mir bitte zeigen, wie man das Problem reproduziert?

betateilchen

Zitat von: rudolfkoenig am 11 März 2015, 07:07:38
Das sollte nicht der Fall sein, und ich kann das auch nicht nachvollziehen.

Nachvollziehen läßt sich das doch ganz einfach im Coding von 91_notify.pm, dort steht im Original:

$ntfy->{STATE} =
        AttrVal($ln,'showtime',1) ? $dev->{NTFY_TRIGGERTIME} : 'active';


Daraus ergibt sich doch zwangsläufig, dass ein Timestamp immer dann in den STATE von notify geschrieben wenn


  • das attribut showtime im auslösenden device auf 1 steht
  • das attribut showtime im auslösenden device überhaupt nicht vorhanden ist

Und genau der zweite Punkt ist das Problem: Ein Timestamp wird nämlich nur dann nicht nach STATE geschrieben, wenn ein auslösendes device das attribut showtime besitzt UND dieses attribut auf 0 steht. Dieses Problem verschärft sich mit der Anzahl der devices, die ein bestimmtes notify triggern können.

Durch meine Änderung, den default-Wert in AttrVal() auf 0 statt auf 1 zu setzen, habe ich für mich das Problem nun zuverlässig gelöst.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Zitatdas attribut showtime im auslösenden device auf 1 steht

Das ist natuerlich falsch interpretiert. $ln ist nicht das ausloesende device, sondern das notify selbst.

betateilchen

Also muss das Attribut doch im notify selbst gesetzt werden?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Ja, das finde ich auch intuitiv. Und wieso "doch"?

betateilchen

Zitat von: rudolfkoenig am 11 März 2015, 11:38:40
Und wieso "doch"?

Weil ich irgendwie im Rahmen einer bereits neulich geführten Diskussion zu showtime im Hinterkopf behalten habe, dass showtime vom auslösenden Device (dessen Triggertime ja wohl auch verwendet wird) gesteuert würde.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!