FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: fritz am 29 Oktober 2017, 23:12:59

Titel: Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: fritz am 29 Oktober 2017, 23:12:59
Guten Tag, FHEMler,

gibt es ein set-Kommando, mit dem man FHEM sinngemäß mitteilen kann: "Setze einen Wert, falls der nicht bereits gesetzt ist"?
Ich dachte an Statusanzeigen: es ist ja oft recht einfach, den Status - und die daraus resultierende Anzeigefarbe zu bestimmen, nicht aber unbedingt den gegenwärtigen Status (insb. wenn er von mehreren Faktoren beeinflusst werden kann).

Ich denke aber, ein solches Verhalten des set-Kommandos ist nur in wenigen Fällen sinnvoll - und ich werde das wohl in Perl implementieren...

Viele Grüße
<F>ritz
Titel: Antw:Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: Jamo am 29 Oktober 2017, 23:30:22
Hallo Fritz,
so was gibt es schon, schau mal in der Commandref nach ,,FILTER",
damit kannst du z.b. set schalter:FILTER=STATE!=off off .
schalter wird nur augeschaltet falls er nicht schon aus war.
Titel: Antw:Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: fritz am 30 Oktober 2017, 00:08:12
Hallo inoma,

Dank für Deine schnelle Antwort - ich habe mir das angesehen und festgestellt, dass ich meine Frage nicht präzise gestellt habe:

Ich habe mir eine Homematic-Statusanzeige geleistet, die mit den 2x8 LEDs. Und ich möchte die jetzt so ansteuern:
Links - Heizungsstatus (rot - Fehler (komplexe Bedingung Sensoren/Aktoren etc.), gelb - Heizung heizt - grün - Heizung heizt nicht, ist aber eingeschaltet - aus - Heizung aus) - und auf der rechten Seite den Status der Fenster im entsprechenden Raum (rot - Fenster länger als (konfigurierbar) 10 Min. offen und draußen ists kalt - gelb - Fenster offen (sonst) - grün - Fenster zu --  LED aus - Fehler am Fensterkontakt)
Es wird ohne Perl schon aufwändig, das zu prüfen - und wenn ich das Ergebnis dann habe, weiß ich im Programm natürlich nicht, ob das nicht schon der aktuelle Wert ist.
Ich möchte aber nicht bei jedem Ereignis für jede Anzeige den Wert versenden, insb. wenn der schon  der aktuelle ist, ich brauche ja mein Nachrichtenkontingent für wichtige Aktionen (Statusanzeige ist nicht wichtig :-)   

Da mir dazu erst einmal keine FHEM-Lösung in den Kopf kommt, dachte ich daran, das als Perl-Funktion updateStatusDisplay (<gerätename>, functionarray) zu schreiben, in der das angegebene Display angesteuert wird und für die einzelnen Elemente die entsprechenden Funktionen aufruft, die dann den Zielzustand zu ermitteln haben. Und nun... wird die Perl-Funktion wohl selbst prüfen müssen, ob sich die LED ändern muss - und dann einen set absetzen - oder ob sich der Wert nicht ändert.

Naja, es geht wohl nicht ohne Selbermachen, wie immer :-)

<F>ritz 
Titel: Antw:Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: amenomade am 30 Oktober 2017, 00:18:57
ZitatIch möchte aber nicht bei jedem Ereignis für jede Anzeige den Wert versenden, insb. wenn der schon  der aktuelle ist, ich brauche ja mein Nachrichtenkontingent für wichtige Aktionen (Statusanzeige ist nicht wichtig :-)

Dann setzt die Werte in Readings von einem Dummy, und setzt event-on-change-readings auf dieses Dummy, und ein notify darauf.

Ansonsten ein DOIF. Der wird keinen Befehl senden, solange der Zustand sich nicht ändert.

Titel: Antw:Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: fritz am 30 Oktober 2017, 00:34:50
Gute Idee, zumal ich eh' schon einen Dummy für jede Heizung habe. Schaue ich mir morgen mal an...

<F>
Titel: Antw:Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: betateilchen am 30 Oktober 2017, 08:38:45
Zitat von: fritz am 29 Oktober 2017, 23:12:59
gibt es ein set-Kommando, mit dem man FHEM sinngemäß mitteilen kann: "Setze einen Wert, falls der nicht bereits gesetzt ist"?

Das set Kommando prüft auf jeden Fall, ob der zu setzende Wert ein anderer ist als der bisherige. Dementsprechen wird ein event ausgelöst oder nicht. Das kannst Du mit den Attributen event-on-change und event-on-update kontrollieren. Somit kannst Du entscheiden, ob Du auf jede Änderung oder auf jede Aktualisierung eines readings reagieren möchtest.
Titel: Antw:Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: fritz am 31 Oktober 2017, 23:56:03
Zitat von: betateilchen am 30 Oktober 2017, 08:38:45
Das set Kommando prüft auf jeden Fall, ob der zu setzende Wert ein anderer ist als der bisherige. Dementsprechen wird ein event ausgelöst oder nicht. Das kannst Du mit den Attributen event-on-change und event-on-update kontrollieren. Somit kannst Du entscheiden, ob Du auf jede Änderung oder auf jede Aktualisierung eines readings reagieren möchtest.

Das Display musste noch warten, zuerst einmal war die Heizungssteuerung familientauglich zu bauen :-)

Aber der Punkt kann in meinen Augen geschlossen werden - kurz: set prüft nicht und es gibt auch keine Variante, die prüfend auf die Werte schaut. (Ich verstehe nur noch nicht, was betateilchen mit dem ersten zitierten Satz wirklich gemeint hat...)

<F>
Titel: Antw:Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: amenomade am 01 November 2017, 00:35:33
Er meint, dass "set" (by design) immer prüft, ob der zu setzende Wert ein anderer ist als der bisherige. Sonst wäre Fhem nicht in der Lage zu entscheiden, ob ein Event abhängig von event-on-change-reading und event-on-update-reading ausgelöst werden muss oder nicht.

set => Wert hat sich geändert?
   ja => event-on-change-reading?  => Event sonst kein Event.
   nein => event-on-update-reading? => Event sonst kein Event.

Deine Problematik ist aber ein bisschen anders. Aber wiederum: mit einem DOIF (bzw. mehere - 1 pro LED) sollte deine Statusanzeige steuerbar sein. Ein DOIF (ohne do always) sendet erst Befehle, wenn der Zustand sich ändert.
Titel: Antw:Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: fritz am 01 November 2017, 00:55:18
Danke. Ja, das ist nicht verkehrt an FHEM, dass die set-Werte (sonst auch Output genannt) wie Readings (sonst auch Input genannt) behandelt werden. Man muss aber etwas aufpassen, denn die Geräte unterscheiden schon streng danach. So habe ich z.B. bei einem Homematic-Thermostat versucht, die Solltemperatur (desired-temp) per set einzustellen. Das geht bis zum FHEM-Modul, aber das Gerät zeigt brav die dort eingestellte Solltemperatur an, eine Änderung (mit dem Stellrad) beginnt dann auch da. Aber das ist nicht weiter tragisch.

Was das DOIF Betrifft, sende ich Dir eine PN...

Viele Grüße - und Dank in die Runde (wobei mir meine noch nicht beantwortete Frage - https://forum.fhem.de/index.php/topic,78700.0.html (https://forum.fhem.de/index.php/topic,78700.0.html) - eigentlich wichtiger ist)
<F>
Titel: Antw:Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: justme1968 am 01 November 2017, 11:04:33
also um der verbreitung von falscher information vorzubeugen:

nein. set prüft nicht ob ein zu setzender wert anders ist als der aktuelle. zumindest nicht generell. und auch die module an die das set weiter geleitet wird machen das meist nicht.

set hat auch erst mal nichts direkt mit den event-.* attributen zu tun.

um ein set bedingt auszuführen gibt es den oben schon angesprochenen devspec FILTER ausdruck.
Titel: Antw:Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: amenomade am 01 November 2017, 11:39:50
ZitatreadingFnAttribute
Die folgenden Attribute werden bei Modulen verwendet, die standardisierte "readings" Aktualisierung der fhem.pl benutzen. Informieren Sie sich in der Liste der Modulattribute wenn Sie wissen möchten ob dies unterstützt wird

Ich dachte, es gilt für alle Modulen, die die Standard-Funktionen von der API https://wiki.fhem.de/wiki/DevelopmentModuleAPI#Readings_.2F_Events nutzen. Anscheinend ist es aber doch nicht der Fall, da diese Funktionen selbst Parameter dafür haben, um die Events zu steuern. Na dann, danke für die Korrektur. Noch was gelernt ;)

Kann man trotzdem davon ausgehen, dass diejenige, die readingFnAttribute implementieren, es ordentlich machen?
Titel: Antw:Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: herrmannj am 01 November 2017, 12:12:27
Zitat von: amenomade am 01 November 2017, 11:39:50
Ich dachte, es gilt für alle Modulen, die die Standard-Funktionen von der API https://wiki.fhem.de/wiki/DevelopmentModuleAPI#Readings_.2F_Events nutzen. Anscheinend ist es aber doch nicht der Fall, da diese Funktionen selbst Parameter dafür haben, um die Events zu steuern. Na dann, danke für die Korrektur. Noch was gelernt ;)

Kann man trotzdem davon ausgehen, dass diejenige, die readingFnAttribute implementieren, es ordentlich machen?
Es gibt da kein "ordentlich" oder "un-ordentlich".

Ob durch ein "set", oder das modul-interne setzen eines readings, dass erzeugen von events sinnvoll ist (oder nicht) hängt vom konkreten Zweck ab.

Beispiel:
Lichtschalter (taster) ist auf "on". Der Benutzer drück noch mal drauf. Status war "on" bleibt "on". Je nach (nachgeschalteter) Logik ist hier ein event "on" absolut wünschenswert. Das kann ich als Anwender benutzen um: die Farben durchzuschalten, Betriebsmode zu verändern ... whatever.

Thermometer steht auf "21.5°". Das modul empfängt ein Telegram vom Sender (Außenthermometer) ... "es ist 21,5°". Event ja ? Event nein ? Als Anwender Interessiere ich mich vielleicht nur für die Änderung der Temperatur, dann brauche ich kein event. Vielleicht möchte ich aber diese Bedingung mit der Luftfeuchte verbinden um zu wissen wann ich lüften kann ? Dann benötige ich das event.

Du sieht: es hängt ab von ... :)
Titel: Antw:Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: amenomade am 01 November 2017, 14:37:30
Mit "ordentlich" meinte ich: wo event-on-change / -update wie erwartet funktionieren.

Ich dachte, dass diese gesamte Logik nich Modul-abhängig sondern irgendwo im Fhem Kernel implementiert ist. Anscheinend ist es aber in einem Modul möglich, z.B. die Funktion readingsBulkUpdate aufzurufen, aber $changed dafür unabhängig von diesen Attribute zu setzen.


Titel: Antw:Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: justme1968 am 01 November 2017, 14:56:57
die event-.* logik ist modul unabhängig und zentral implementiert. und sie funktioniert wie erwartet.

und sie hat überhaupt nichts direkt mit dem set kommando zu tun.
Titel: Antw:Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: amenomade am 01 November 2017, 16:47:02
Ja, hatte ich schon verstanden. Aber nehmen wir mal die Funktion readingsBulkUpdate:

Zitat$changed | optional
   Flag, ob ein Event für dieses Update erzeugt werden soll (Wert: 1). Oder ob definitiv kein Event erzeugt werden soll (Wert: 0). Wenn nicht gesetzt, wird aufgrund entsprechender Attribute in der Definition von $hash entschieden, ob ein Event zu erzeugen ist, oder nicht (Attribute: event-on-change-reading, event-on-update-reading, event-min-interval, ...)

Das heisst, der Modulentwickler kann die Attribute event-on-change/-update umgehen, indem er z.B. $changed = 0 forciert, oder? Genauso kannn er sich zwischen readingsBulkUpdate und readingsBulkUpdateIfChanged entscheiden?
Titel: Antw:Prüft set, ob der Wert bereits gesetzt ist?
Beitrag von: justme1968 am 01 November 2017, 17:27:21
was heißt umgehen? wenn ein modul für bestimmte dinge von vorn herein kein event erzeugen möchte ist das ja nicht verboten. ob per $changed=0 oder per IfCanged.

im allgemeinen werden eh eher zu viel als zu wenig events erzeugt.