Moin
Gibt es ein Reading welches z.B. auf 1 gesetzt ist wenn die aktuelle Config nicht gespeichert ist?Wenn ja, wo kann ich es finden bzw. woher weiß FHEMWeb dass die Config nicht gespeichert ist?
Wenn nicht, kann man sich solch ein Reading anlegen?
Ich möchte mir in FTUI nämlich eine Benachrichtgung einbauen wenn die Config nicht gespeichert ist.
Grüße^^
Könnte so gehen:
define savestate dummy
attr savestate userReadings savestate {@structChangeHist}
define global_notify notify global:.* set savestate 1
Lasse mich aber gerne eines Besseren belehren.
Gruß
Hans
Zitat von: Hans Franz am 02 Februar 2016, 17:03:25
Könnte so gehen:
define savestate dummy
attr savestate userReadings savestate {@structChangeHist}
define global_notify notify global:.* set savestate 1
Das machts leider nicht.
Davon mal abgesehen, dass ich nicht weiß was {@structChangeHist} ist...
Hatte das notify auf global:SAVE.* gestzt. das läuft 1A wenn ich speichere. Aber nichts setzt den dummy wenn die Config verändert ist.
Grüße^^
{@structChangeHist} in der Kommandozeile ergibt bei mir (bei rotem Fragezeichen) die Anzahl der modifizierten Änderungen. Ergibt Null (oder Nichts) nach dem Sichern. Ist aus FHEMWEB geklaut.
Gruß
Hans
Edit:
Zitatmodifizierten Änderungen
So'n Quatsch ;)
Dass es auf global:SAVE nichts macht ist klar (wobei das nichtmal stimmt). Es soll ja auch dann was tun, wenn du andere Dinge machst, als speichern. Du musst das notify entweder, wie von Hans Franz beschrieben, auf
global:.*
setzen oder auf sowas
global:(ATTR|DEFINED|DELETED|DELETEATTR|MODIFIED|RENAMED|SAVE).*
define unsaved at +*00:00:10 { if(@structChangeHist) {CommandSetReading(undef,'unsaved unsaved 1')} else {CommandSetReading(undef,'unsaved unsaved 0')} }
Zitat von: marvin78 am 02 Februar 2016, 19:35:40
Dass es auf global:SAVE nichts macht ist klar
Das habe ich nicht behauptet! Wenn ich auf Save-Config klicke wird dieses event ausgelöst und würde mir den Dummy zurück setzen.
Dann klappt also das hier nicht:
define savestate dummy
attr savestate userReadings savestate {@structChangeHist}
wobei ich mit userReadings schon öfter Probleme hatte dass sie nicht gesetzt werden. Z.B. bei WebViewControl und GPIO. Auch hier nicht.
Aber bei z.B. GDS funktionieren die userReadings.... <<< Anderes Thema...
Ich werde das mit {@structChangeHist} weiter testen...
Und natürlich den Vorschlag von betateilchen. Wobei da nur "Chinesisch" für mich steht ;D
Danke schon mal für die Antworten. Ich werde testen, testen, testen
Grüße^^
Das userReading kann nur wirken, wenn ein Event ausgelöst wird. Das passiert über das notify (für Änderungen eben NICHT auf SAVE sondern auf eben diese Änderung).
Ja gut...
Man sollte einfach nicht darüber nachdenken wie das funktionieren soll... Aber so läuft es natürlich.
define savestate dummy
attr savestate userReadings savestate {@structChangeHist}
define notify_savestate notify global:.* set savestate 1
Danke an alle^^
Man sollte einfach nicht darüber nachdenken wie das funktionieren soll
Doch. Genau das sollte man. Dann kommt man nämlich nicht auf die Idee, es anders zu machen, als vorgeschlagen, weil man weiß, warum es so vorgeschlagen wurde.
und meine Lösung braucht nur ein einziges device und nicht zwei - und keine userReadings :P
Zitat von: betateilchen am 02 Februar 2016, 20:37:57
und meine Lösung braucht nur ein einziges device und nicht zwei - und keine userReadings :P
Die Readings sind aber von Vorteil. Habe den Dummy gleich noch 2 spendiert um Text und HEX-Farbe an FTUI zu übergeben :)
betateilchens Lösung ist eindeutig eleganter. Das Reading steckt nun im at und du kannst auch dem at noch weitere Readings hinzufügen.
Du kannst das aber auch alles in das notify stecken:
define global_notify notify global:.* {(@structChangeHist) ? CommandSetReading(undef,'global_notify unsaved 1') : CommandSetReading(undef,'global_notify unsaved 0')}
Gruß
Hans
Zitat von: roman1528 am 03 Februar 2016, 00:01:57
Die Readings sind aber von Vorteil. Habe den Dummy gleich noch 2 spendiert
Irgendwann, wenn Du fhem "verstanden" hast, solltest Du über diese Aussage nochmal nachdenken ;)
Zitat von: betateilchen am 03 Februar 2016, 07:09:10
Irgendwann, wenn Du fhem "verstanden" hast, solltest Du über diese Aussage nochmal nachdenken ;)
Ich denke es ist ein riesiges Perl Unverständniss. Deswegen steht da für mich nur Bahnhof.
Aber klar. natürlich kann man dem notify auch Readings verpassen... Wie doof XD
Eins müsstet ihr mir aber noch verraten. Da ich ja mehrere Readings habe... Wie ist das Trennzeichen zwischen den Befehlen?
{(@structChangeHist) ? CommandSetReading(undef,'notify_savestate savestate 1'), CommandSetReading(undef,'notify_savestate color #B22222')........
{(@structChangeHist) ? CommandSetReading(undef,'notify_savestate savestate 1'); CommandSetReading(undef,'notify_savestate color #B22222')........
{(@structChangeHist) ? CommandSetReading(undef,'notify_savestate savestate 1') CommandSetReading(undef,'notify_savestate color #B22222')........
Das funktioniert schonmal alles nicht :D
Grüße^^
- in dem was Du da tust, stehen gar keine Befehle (fhem) drin, sondern Funktionsaufrufe (perl)
- in dem Codeschnipsel gibt es zwei Codeblöcke. Wenn Du das Beispiel von mir mit der if Abfrage verwendest, wird Dir das klarer. Die Variante mit ? und : hatte ich absichtlich nicht verwendet um genau diese jetzt bei Dir bestehende Verwirrung zu vermeiden.
Zitat von: betateilchen am 03 Februar 2016, 13:18:05
- in dem was Du da tust, stehen gar keine Befehle (fhem) drin, sondern Funktionsaufrufe (perl)
- in dem Codeschnipsel gibt es zwei Codeblöcke. Wenn Du das Beispiel von mir mit der if Abfrage verwendest, wird Dir das klarer. Die Variante mit ? und : hatte ich absichtlich nicht verwendet um genau diese jetzt bei Dir bestehende Verwirrung zu vermeiden.
Super! Ich danke dir.
Mit if/else und meinen quasi nicht vorhandenen Perl-Kenntnissen funktioniert das jetzt.
define notify_savestate notify global:.* { if(@structChangeHist) {CommandSetReading(undef,'notify_savestate savestate 1');; CommandSetReading(undef,'notify_savestate color #B22222');; CommandSetReading(undef,'notify_savestate text Config nicht<br/>gespeichert!')} else {CommandSetReading(undef,'notify_savestate savestate 0');; CommandSetReading(undef,'notify_savestate color #FFFFFF');; CommandSetReading(undef,'notify_savestate text Config<br/>gespeichert!')} }
Grüße^^
Noch kurz zur Erklärung:
CommandSetReading(undef,'notify_savestate savestate 1')
und
fhem("setReading notify_savestate savestate 1")
bewirken exakt das gleiche.
Als Entwickler verwende ich gerne die erste Variante, da ich weiß, dass aus der zweiten Variante fhem-intern auch nur ein "CommandSetReading()" gebaut wird.
Für den Anwender ist eigentlich die zweite Variante vorgesehen, weil sie sich besser "selbst erklärt".