[erledigt] stateFormat Attribute im notify Device

Begonnen von mchilli, 25 März 2021, 13:17:33

Vorheriges Thema - Nächstes Thema

mchilli

Hallo,
ich hatte mir für eine Regelung ein notify zu Hilfe genommen und in diesem auch ein zwei userreadings zwischen gespeichert. Diese wollte ich dann per "stateFormat" mit in die Übersicht ausgeben lassen.
Nun zum einen gibt es scheinbar kein offizielles stateFormat in notifys darum musste ich mir eines über "userattr" erschummeln  :), was allerdings trotzdem prima klappte!
Die Werte wurden wunderbar formatiert ausgegeben bis das notify einmal getriggert wurde, danach wird der Internal STATE wieder auf "active" geschrieben ohne das "stateFormat" zu beachten.
Setzt man nun das notify manuell auf inactive oder active wird STATE wieder nach "stateFormat" richtig formatiert.

Wäre es denn möglich offiziell das Attribute "stateFormat" mit einzubinden oder gebe es zumindest eine Möglichkeit dieses merkwürdige Triggerverhalten zu ändern?

MfG MCHilli
Mehr als 3, der eine macht das, der andere was ganz anderes und einer was ganz ähnliches, was ein anderer auch machen soll.

rudolfkoenig

Ich fuerchte ich brauche etwas zum Nachstellen, da die Beschreibung fuer mich nicht eindeutig ist.
Laut Quellen sollte state sich nur beim definieren, Attribut setzen oder fuer den active/inactive Befehl aendern.

mchilli

#2
Also die Definition des Devices? Kein Problem:
defmod BD_Heizungsregelung notify BD_Thermostat_Clima:desired-temp:.*|BD_Thermostat_Clima:measured-temp:.* {\
  my $istWert = ReadingsVal($NAME, 'measured-temp', 99);;\
  my $sollWert = ReadingsVal($NAME, 'desired-temp', 99);;\
  my $lastWert = ReadingsVal($SELF, 'last-temperature', 99);;\
  my $upperOffset = AttrVal($SELF, 'offsetHigh', 1);;\
  my $lowerOffset = AttrVal($SELF, 'offsetLow', 0);;\
  if ($sollWert != 99 and $istWert != 99 ) {\
    if ($istWert <= ($sollWert+$lowerOffset)) {\
      if ($istWert <= $lastWert) {\
        fhem('setreading '.$SELF.' heater-state on');;\
      }\
    } elsif ($istWert >= ($sollWert+$upperOffset)) {\
      if ($istWert >= $lastWert) {\
        fhem('setreading '.$SELF.' heater-state off');;\
      }\
    }\
    fhem('setreading '.$SELF.' last-temperature '.$istWert);;\
  } else {\
    Log 1, $SELF.": Error cant get reading"\
  }\
}
attr BD_Heizungsregelung userattr offsetLow:slider,-3,0.1,3,1 offsetHigh:slider,-3,0.1,3,1 stateFormat:textField-long
attr BD_Heizungsregelung devStateIcon on:temp_temperature_max@red off:temp_temperature_min@blue inactive:general_aus@red:active active:general_an@blue:inactive
attr BD_Heizungsregelung group Heizungsregelung
attr BD_Heizungsregelung offsetHigh 1.8
attr BD_Heizungsregelung offsetLow 0.5
attr BD_Heizungsregelung room Thermostate
attr BD_Heizungsregelung showtime 0
attr BD_Heizungsregelung stateFormat heater-state\
state

setstate BD_Heizungsregelung active
setstate BD_Heizungsregelung 2021-03-25 20:18:12 heater-state off
setstate BD_Heizungsregelung 2021-03-25 20:18:12 last-temperature 17.2
setstate BD_Heizungsregelung 2021-03-25 12:05:34 state active



Also ich möchte momentan lediglich den zustand der Heizung sehen(an oder aus) und die möglichkeit haben die Regelung(notify) ein bzw aus zu schalten.
Das klappt auch so im ersten moment ganz gut ich sehe beide Icons und kann über das zweite Icon ein und aus schalten. Sobald es dann einmal getriggert wird
ändert sich das State wieder in "active" und zeigt den "heater-state" nicht mehr an.
Mehr als 3, der eine macht das, der andere was ganz anderes und einer was ganz ähnliches, was ein anderer auch machen soll.

mchilli

Ok hab es gerade selber nochmal einmal mit einem Test System ausprobiert. Fhem neu installiert und habe dasselbe verhalten.
defmod BD_Heizungsregelung notify test_dummy:state:.* {\
  fhem('setreading '.$SELF.' heater-state on');;\
  fhem('setreading '.$SELF.' last-temperature 25');;\
}
attr BD_Heizungsregelung userattr offsetLow:slider,-3,0.1,3,1 offsetHigh:slider,-3,0.1,3,1 stateFormat:textField-long
attr BD_Heizungsregelung devStateIcon on:temp_temperature_max@red off:temp_temperature_min@blue inactive:general_aus@red:active active:general_an@blue:inactive
attr BD_Heizungsregelung group Heizungsregelung
attr BD_Heizungsregelung offsetHigh 1.8
attr BD_Heizungsregelung offsetLow 0.5
attr BD_Heizungsregelung room Thermostate
attr BD_Heizungsregelung showtime 0
attr BD_Heizungsregelung stateFormat heater-state\
state

setstate BD_Heizungsregelung active
setstate BD_Heizungsregelung 2021-03-25 20:18:12 heater-state off
setstate BD_Heizungsregelung 2021-03-25 20:18:12 last-temperature 17.2
setstate BD_Heizungsregelung 2021-03-25 12:05:34 state active


Sobald man über:
trigger test_dummy state:whatever
triggert ändert sich der STATE auf "active" und ignoriert das vorgegebene stateFormat. Wenn man dann wieder über z.B. das Icon das notify aktiviert oder deaktiviert, wird STATE wieder richtig formatiert.

MfG
Mehr als 3, der eine macht das, der andere was ganz anderes und einer was ganz ähnliches, was ein anderer auch machen soll.

rudolfkoenig

notify generiert keine Events, damit es nicht zu Endlosschleife oder sinnlose CPU-Belastung kommt. stateFormat ist Teil der readingFnAttributes (event-on-change-reading, etc), mit dem man auf Events reagiert. stateFormat in notify einzubauen wuerde nur falsche Hoffnungen wecken.

Hier erzeugst Du die Events selbst mit setreading $SELF, was ich als Hack einstufe. Dann kann man das Hack auch weitertreiben, und stateFormat als userattr anlegen.

Das Zuruecksetzen auf active war dem "showtime 0" verschuldet. Das habe ich jetzt zwar ausgebaut, mit dem Seiteneffekt-Bug, dass das Setzen von "attr showtime 0"  den letzten Zeistempel zunaechst nicht aendert. Es bleibt weiterhin der Schoenheitsfehler, dass nach dem FHEM-Start bis zum ersten passenden Event (oder Klick) Status auf active gesetzt wird.

mchilli

Verstehe, also entstand die Entscheidung daraus, keine Möglichkeit zu bieten aus versehen einen Endlosloop zu bauen.
Ok das meine Methode ein bisschen hacky ist dachte ich mir schon, allerdings wollte ich die zwischengespeicherten Werte nicht extra in ein anderes Device schreiben. So finde ich es ersichtlicher wozu welcher Wert gehört.
Trotzdem besten Dank das ich meinen "Hack" nun doch so nutzen kann.

MfG MCHilli
Mehr als 3, der eine macht das, der andere was ganz anderes und einer was ganz ähnliches, was ein anderer auch machen soll.