Löschen der eigenen Readings beim Initialisieren

Begonnen von iamandy, 29 August 2016, 22:16:57

Vorheriges Thema - Nächstes Thema

iamandy

Hallo  :)

Vielleicht habe ich es ja übersehen, kann man verhindern das DOIF seine eigenen UserReadings löscht wenn man die Def. ändert bzw. speichert und es dabei automatisch neu Initialisiert?

Ich finde das unpraktisch. Wenn man zB im DOIF noch IF verwendet das auf ein eigenes UserReading referenziert, denn für das IF kann ich nicht mit notexist arbeiten... Im Moment behelfe ich mir mit Dummy in die ich dieses speichere, aber finde es überflüssig und hätte es gerne im DOIF.

Versteht Ihr was ich meine?

Ellert

#1
Ich verwende in solchen Fällen ReadingsVal("doif","meinreading","defaultwert") statt [doif:meinreading]

Du könntest auch ein DOELSEIF-Zweig nutzen, um nach einem Modify das Reading zusetzen

.
.
.
DOELSEIF (["^global$:MODIFIED $SELF$"]) (setreading $SELF meinreading einwert)

iamandy

Hallo Ellert,

das sind beides super hilfen! Danke!

Weiß man denn warum die Readings beim Init unbedingt gelöscht werden? Ich verstehe die Idee dahinter nicht. Fhem macht sich ja viel Arbeit Readings aller Devices zB beim Shutdown Restart zu sichern und wiederherzustellen...

Vielleicht kann man ja beim nächsten DOIF Update eine "notresetreadings" Option einbauen  ;)

Liebe Grüße
Andreas

Ellert

Das Attribut notexist ist meistens ausreichenend, eigentlich müsste IF erweitert werden und prüfen, ob ein Gerät, das in einer Bedingung abgefragt wird von einem DOIF stammt und ob dort das Attribut notexist gesetzt ist.

@Damian: Hälst Du das für sinnvoll und machbar.

Damian

Zitat von: Ellert am 31 August 2016, 12:13:06
Das Attribut notexist ist meistens ausreichenend, eigentlich müsste IF erweitert werden und prüfen, ob ein Gerät, das in einer Bedingung abgefragt wird von einem DOIF stammt und ob dort das Attribut notexist gesetzt ist.

@Damian: Hälst Du das für sinnvoll und machbar.

IF ist im Gegensatz zu DOIF nur ein Befehl, der nichts anderes macht als die IF-Syntax in Perl-if zu überführen. In der Commandref zu IF kann man auch sehen, wie die Übersetzung aussieht z. B.

ZitatIF ([living_room:temperature] > 12) (set lamp on, set lamp2 off)

entspricht:

{if (ReadingVal('living_room','temperature','') > 12) {fhem('set lamp on');;fhem('set lamp2 off')}}

Daran kann man erkennen, dass einfach in ReadingVal übersetzt wird mit einem leeren Initialisierungsstring.


Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

iamandy

Also wenn ich ehrlich sein darf hätte ich gerne beides  :D :

1. DOIF könnte auf das löschen der UserReadings verzichten, bzw es optional lassen. Dann muss man nicht auf Dummys ausweichen wenn man den letzten echten Wert benötigt.

2. Eine Global Option für fehlende Werte für IF.
Wenn ich es richtig verstanden habe ist der 3. Parameter der "falls" der 1. 2. nicht existiert? Also statt "if (ReadingVal('living_room','temperature','') > 12)" dann "if (ReadingVal('living_room','temperature','#GlobaleAlternative#') > 12)". Dann könnte man GlobaleAlternative=1 setzen und hätte etwas mehr ruhe bei noch nicht gesetzten Reading...

Zwei Wünsche eines sehr fhem Begeisterten Users  :D

Ellert

Zitat von: Damian am 31 August 2016, 18:22:49
IF ist im Gegensatz zu DOIF nur ein Befehl, der nichts anderes macht als die IF-Syntax in Perl-if zu überführen. In der Commandref zu IF kann man auch sehen, wie die Übersetzung aussieht z. B.

Daran kann man erkennen, dass einfach in ReadingVal übersetzt wird mit einem leeren Initialisierungsstring.


Gruß

Damian

Ja, das hatte ich gesehen, bei DOIF war es vor längerer Zeit auch so gelöst.

Beim IF erhält man deshalb ja auch noch mit Verboselevel 2 eine Meldung "... IF: unknown reading: du1:nv", das könnte als irritierend empfunden werden.

Es wäre etwas komfortabler, wenn IF erkennen würde, ob es in einem DOIF verwendet wird und ob dort mit notexist eine Vorgabe gemacht wird, um diese statt "" zu verwenden.

Damian

Zitat von: Ellert am 31 August 2016, 20:54:51
Ja, das hatte ich gesehen, bei DOIF war es vor längerer Zeit auch so gelöst.

Beim IF erhält man deshalb ja auch noch mit Verboselevel 2 eine Meldung "... IF: unknown reading: du1:nv", das könnte als irritierend empfunden werden.

Es wäre etwas komfortabler, wenn IF erkennen würde, ob es in einem DOIF verwendet wird und ob dort mit notexist eine Vorgabe gemacht wird, um diese statt "" zu verwenden.


ja, an IF wollte ich nicht mehr viel ändern, weil es einige ungelöste Probleme damit gibt. Prinzipiell kann man IF-Abfragen (mehr oder weniger elegant) durch Umstellung in DOIF-Bedingung unterbringen.

Langfristig will ich DOIF weiter aufbohren.

Ein default-Wert wollte ich auch pro Reading/Status realisieren:

[mydevice:<myreading>,<default Value>:<Filter>]

Viel mächtiger soll aber dieses Features werden:

-Ereignistrigger mit Ausgabeformatierung:

["<RegEx Ereignis>",<default value>:d|<Spalte>|"<RegEx für Output>":<Output>]

Damit könnte man solche Sachen einfach realisieren:

([":temperatur",0:d] > 40) (set msg "Temperatur vom Device $DEVICE ist überschritten")

Gruß

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: iamandy am 31 August 2016, 19:11:48
Also wenn ich ehrlich sein darf hätte ich gerne beides  :D :

1. DOIF könnte auf das löschen der UserReadings verzichten, bzw es optional lassen. Dann muss man nicht auf Dummys ausweichen wenn man den letzten echten Wert benötigt.

2. Eine Global Option für fehlende Werte für IF.
Wenn ich es richtig verstanden habe ist der 3. Parameter der "falls" der 1. 2. nicht existiert? Also statt "if (ReadingVal('living_room','temperature','') > 12)" dann "if (ReadingVal('living_room','temperature','#GlobaleAlternative#') > 12)". Dann könnte man GlobaleAlternative=1 setzen und hätte etwas mehr ruhe bei noch nicht gesetzten Reading...

Zwei Wünsche eines sehr fhem Begeisterten Users  :D

Aufräumen/Initialisieren des Moduls bei DEF-Änderungen ist unabdingbar, sonst gibt es keinen sauberen Ausgangszustand mit unüberschaubaren Folgen. Da Readings vom Modul dynamisch erzeugt werden, werden grundsätzlich alle gelöscht, alles anders wäre mir zu aufwändig. Readings, die Definitionsänderungen des Moduls überleben sollen, würde in einem separaten dummy auslagern.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Zitat von: Ellert am 31 August 2016, 20:54:51Es wäre etwas komfortabler, wenn IF erkennen würde, ob es in einem DOIF verwendet wird und ob dort mit notexist eine Vorgabe gemacht wird, um diese statt "" zu verwenden.
Einfacher wäre es wahrscheinlich, wenn IF einen weiteren, optionalen Parameter (hidden) von DOIF bekommt, in welchem der notexist drin steht.

iamandy

Zitat von: Damian am 31 August 2016, 22:07:04
Aufräumen/Initialisieren des Moduls bei DEF-Änderungen ist unabdingbar, sonst gibt es keinen sauberen Ausgangszustand mit unüberschaubaren Folgen. Da Readings vom Modul dynamisch erzeugt werden, werden grundsätzlich alle gelöscht, alles anders wäre mir zu aufwändig. Readings, die Definitionsänderungen des Moduls überleben sollen, würde in einem separaten dummy auslagern.

Gruß

Damian

Ich kann das mit dem Aufräumen auf der einen Seite gut verstehen. Doch die UserReadings haben ja nur indirekt mit dem DOIF zu tun und werden vom User selbst bestimmt. Daher könnte man die auch vom Init unangetastet lassen. Es könnte ja eine Option sein die man setzen muss wenn man die UserReadings nicht löschen will, dann kann es auch kein Komplikationen mit existirenden DOIF geben.

Gleiches auch für IF. Wenn Du da ne Option (gerne auch Global) einbauen würdest die einen Alternativwert einbaut, nur wenn die Option gestzt wird, sollte es altes auch nicht stören solange es ungesetzt ist.

Naja, Wünsche  ;)

Ich merke halt das so ein IF im DOIF sehr hilfreich sein kann und mehrere DOELSEIF nicht immer schöner sind. Zudem finde ich es übersichtlicher wenn ich Readings fürs DOIF auch im DOIF speichern kann. Jetzt ist das mit dem INIT ja nur wärend des Entwickelns des DOIF relevant, aber wenn man wie ich gefühlte 200 anläufe benötigt bis das DOIF 100% das tut was ich will, dann wäre ein nicht löschen schon toll :)


Damian

Zitat von: iamandy am 01 September 2016, 10:56:57
Ich kann das mit dem Aufräumen auf der einen Seite gut verstehen. Doch die UserReadings haben ja nur indirekt mit dem DOIF zu tun und werden vom User selbst bestimmt. Daher könnte man die auch vom Init unangetastet lassen. Es könnte ja eine Option sein die man setzen muss wenn man die UserReadings nicht löschen will, dann kann es auch kein Komplikationen mit existirenden DOIF geben.

und wenn ein Userreading mit e_ anfängt, habe ich schon ein Problem.

Zitat
Gleiches auch für IF. Wenn Du da ne Option (gerne auch Global) einbauen würdest die einen Alternativwert einbaut, nur wenn die Option gestzt wird, sollte es altes auch nicht stören solange es ungesetzt ist.

IF ist ein Befehl und kein Modul, daher hat es keine Attribute.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF