Hallo,
so wie ich benutzen auch einige andere hier das attribut "disable" um ein at oder notify in Abhängigkeit von diversen anderen Zuständen zu deaktivieren bzw. wieder zu aktivieren.
In diesem Anwendungsfall ist "disabled" ein Status vergleichbar mit dem on/off einer Lampe und kein Attribut, welches zur Struktur des devices gehört.
Daher würde ich mir wünschen, bei notify und at zusätzlich zum Attribut "disable" ein "set <device> disabled" bzw. "set <device> active" zu ermöglichen. Dieses hat für den Anwender folgende Vorteile:
- ein mit "set <device> disabled" deaktiviertes at bzw. notify behält seinen Zustand automatisch bei einem Neustart von FHEM, da dieser im STATEFILE gespeichert wird.
- ein mit "set <device> disabled" deaktiviertes at bzw. notify bewirkt keine Strukturänderung und somit kein rotes Fragezeichen und muss nicht extra mit "save" gesichert werden.
- ein mit "attr <device> disable 1" deaktiviertes Modul ist weiterhin am roten Fragezeichen erkennbar und muss weiterhin explizit gesichert werden.
Somit ist es je nach Anwendungsfall möglich, ein at oder notify über seinen state oder ein Attribut zu deaktivieren.
Die notwendigen Änderungen fallen recht klein aus:
fhem.pl
nach return 1 if($attr{$devname}{disable});
die Zeile
return 1 if($defs{$devname}{STATE} eq "disabled");
einfügen.
91_notify.pm
in notify_Set:
%sets anpassen:
my %sets = (addRegexpPart=>2, removeRegexpPart=>1, disabled=>0, active=>0);
und dann
elsif($cmd eq "disabled") {
readingsSingleUpdate($hash, "state", "disabled", 1);
}
elsif($cmd eq "active") {
readingsSingleUpdate($hash, "state", "active", 1);
}
anhängen.
für 90_at.pm liefer ich die Änderungen gerne morgen Abend nach, wenn das überhaupt so akzeptiert wird.
Gruß
Thomas
Verstehe ich das richtig: du baust das als set, damit das Fragezeichen im Frontend nicht erscheint?
Wenn ueberhaupt, dann wuerde ich das Problem direkter und generischer loesen und fuer CommandAttr eine -skipStructChange Option einbauen. Btw. zu einem Patch gehoert auch Doku.
Hallo Rudolf,
das ging ja schnell. Vielen Dank für die Antwort.
Ich baue das nicht ein, um ein rotes Fragezeichen zu umgehen, sondern weil ich der Meinung bin, das es sich in genanntem Anwendungsfall - nämlich dem zustandsabhängigen (automatischen) setzten des Attributs nicht um ein Attribut sondern um einen State handelt, der auch im Statefile gespeichert werden sollte. (Wenn ich das richtig verstehe, wäre das mit der vorgeschlagenen -skipStructChange Option nicht so.) Somit wäre seine Behandlung gleich derer z. B. eines dummies - die Verwendung ist ja auch vergleichbar. Damit würde bei einem Neustart dann auch genau so verfahren und der aktuelle Zustand ohne explizites Speichern erhalten bleiben. Falls Du das so akzeptieren würdest werde ich selbstverständlich gerne auch einen vollständigen Patch mit Doku schreiben.
Gruß
Thomas
Hallo Rudolf,
da Du (noch?) nicht widersprochen hast, habe ich mal die entsprechenden Patches erstellt:
91_notify.pm:
@@ -128 +128 @@
- my %sets = (addRegexpPart=>2, removeRegexpPart=>1);
+ my %sets = (addRegexpPart=>2, removeRegexpPart=>1, disabled=>0, active=>0);
@@ -161,0 +162,2 @@
+ } elsif($cmd eq "disabled") {
+ readingsSingleUpdate($hash, "state", "disabled", 1);
@@ -162,0 +165,4 @@
+ elsif($cmd eq "active") {
+ readingsSingleUpdate($hash, "state", "active", 1) if(!AttrVal($me, "disable", undef));
+ }
+
@@ -348,0 +355,11 @@
+ <li>disabled
+ <ul>
+ Disables the current device.<br>
+ </ul>
+ </li>
+ <li>active
+ <ul>
+ Enables the current device if disabled by setting the device disabled.
+ Does not enable the device if Attribute "disable" is set.
+ </ul>
+ </li>
@@ -535,0 +553,9 @@
+ <li>disabled
+ <ul>
+ Deaktiviert das entsprechende Gerät.<br>
+ </ul></li>
+ <li>active
+ <ul>
+ Aktiviert das entsprechende Gerät, wenn es über das set-Kommando "disabled" deaktiviert wurde.
+ Aktiviert das entsprechende Gerät nicht, wenn das Attribut "disable" gesetzt ist.
+ </ul></li>
90_at.pm:
@@ -113 +113 @@
- my $val = AttrVal($name, "disable", undef) ?
+ my $val = IsDisabled($name) ?
@@ -208 +208 @@
-
+ my %sets = (modifyTimeSpec=>1, disabled=>0, active=>0);
@@ -212,4 +212,5 @@
- return "Unknown argument $a[1], choose one of $cmd"
- if($a[1] ne "modifyTimeSpec");
-
- my ($err, undef) = GetTimeSpec($a[2]);
+ return "Unknown argument $a[1], choose one of $cmd disabled active"
+ if(!defined($sets{$a[1]}));
+
+ if($a[1] eq "modifyTimeSpec") {
+ my ($err, undef) = GetTimeSpec($a[2]);
@@ -224,0 +226,11 @@
+ }
+
+ elsif($a[1] eq "disabled") {
+ readingsSingleUpdate($hash, "state", "disabled", 1);
+ return undef;
+ }
+ elsif($a[1] eq "active") {
+ readingsSingleUpdate($hash, "state", "Next: " . FmtTime($hash->{TRIGGERTIME}),1) if(!AttrVal($hash->{NAME}, "disable", undef));
+ return undef;
+ }
+
@@ -440,0 +453,11 @@
+ </li><br>
+ <a name="disabled"></a>
+ <li>disabled<br>
+ Disables the current device.<br>
+ Note: If applied to an <a href="#at">at</a>, the command will not be executed,
+ but the next time will be computed.
+ </li><br>
+ <a name="active"></a>
+ <li>active<br>
+ Enables the current device if disabled by setting the device disabled.
+ Does not enable the device if Attribute "disable" is set.
@@ -594,0 +618,12 @@
+ </li><br>
+ <a name="disabled"></a>
+ <li>disabled<br>
+ Deaktiviert das entsprechende Gerät.<br>
+ Hinweis: Wenn angewendet auf ein <a href="#at">at</a>, dann wird der
+ Befehl nicht ausgeführt, jedoch die nächste
+ Ausführungszeit berechnet.
+ </li><br>
+ <a name="active"></a>
+ <li>active<br>
+ Aktiviert das entsprechende Gerät, wenn es über das set-Kommando "disabled" deaktiviert wurde.
+ Aktiviert das entsprechende Gerät nicht, wenn das Attribut "disable" gesetzt ist.
@@ -607 +642 @@
- Deaktiviert das entsprechende Ger&aauml;t.<br>
+ Deaktiviert das entsprechende Gerät.<br>
fhem.pl:
@@ -698 +698 @@
-
+ return 1 if($defs{$devname}{STATE} eq "disabled");
...das ist das erste mal, dass ich einen Patch erstelle - bitte um Nachsicht, wenn ich was falsch gemacht habe.
Gruß
Thomas
Sorry, bin noch am ueberlegen.
Ich finde es problematisch, dass das Gleiche leicht unterschiedliche Wirkung hat, jenachdem, ob man das ueber set oder ueber attr angibt, das wird viele verwirren, und die Leute werden sich beschweren, dass z.Bsp. FHEM2FHEM oder structure kein set disable kennt.
Ich brauche eine Loesung mit weniger Potential zum Verwirren.
Verstehe ich. Vielleicht kann man der möglichen Verwirrung mit einer anderen Bezeichnung vorbeugen. Z. B. standby oder inactive...
Ich habe inactive/active gewaehlt und die Aenderungen eingebaut.
Was mir aufgefallen ist:
- ich musste notify_SetState einfuegen und at_SetState anpassen, sonst ueberlebt ein "set inactive" kein shutdown
- ich habe die Doku erweitert, und versucht die Unterschiede zw. disable und inactive zu erlaeutern
- patch bitte mit "diff -u" erstellen, Einrueckungsstil und die Zeilenbreite von 80 Zeichen bitte beachten.
Habs getestet und eingecheckt.
Ich denke jetzt wird es dann an weiteren "Befehlen" das gleiche problem geben, z.b. Presence und DOIF / IF sollten sich auch so verhalten, oder?
Das haengt davon ab, ob diese Module aus Programmen heraus deaktiviert werden muessen.
Nach "set inactive" ist kein save notwendig, und nach shutdown (evtl. vom aussen ausgeloest) wird der Status behalten.
Hallo Rudolf,
vielen Dank für Deine Mühe. Das mit dem Setstate war mir noch nicht aufgefallen. Die Tips bzgl. patches werde ich in Zukunft beachten. Werde die Module ab Montag nochmal ausgiebig testen.
Gruß
Thomas
Kann es sein, dass ein at, das auf inactive gesetzt wurde nun bei jeder eigentlichen Ausführung ein event erzeugt. Ich habe ein at, dass jede Sekunde einen Funktion aufruft, welches aber zu 99% der Zeit auf disabled ist. Wenn ich das nun mit set XXX active/inactive versuche, erzeugt dieses at sekündlich ein Event, auch wenn es auf inactive steht.
Aus dem Eventmonitor
2015-03-08 10:45:42.905 at at.036.AlarmCountdown Next: 10:45:43
2015-03-08 10:45:43.904 at at.036.AlarmCountdown Next: 10:45:44
2015-03-08 10:45:44.902 at at.036.AlarmCountdown Next: 10:45:45
2015-03-08 10:45:45.905 at at.036.AlarmCountdown Next: 10:45:46
2015-03-08 10:45:46.904 at at.036.AlarmCountdown Next: 10:45:47
2015-03-08 10:45:47.901 at at.036.AlarmCountdown Next: 10:45:48
2015-03-08 10:45:48.901 at at.036.AlarmCountdown Next: 10:45:49
2015-03-08 10:45:49.904 at at.036.AlarmCountdown Next: 10:45:50
2015-03-08 10:45:50.902 at at.036.AlarmCountdown Next: 10:45:51
2015-03-08 10:45:51.905 at at.036.AlarmCountdown Next: 10:45:52
2015-03-08 10:45:52.903 at at.036.AlarmCountdown Next: 10:45:53
2015-03-08 10:45:53.901 at at.036.AlarmCountdown Next: 10:45:54
list des ats:
Internals:
COMMAND {alarmCountdown("at.Alarm.on","AlarmCountdown") if (Value("at.Alarm.on") ne "")}
DEF +*00:00:01 {alarmCountdown("at.Alarm.on","AlarmCountdown") if (Value("at.Alarm.on") ne "")}
NAME at.036.AlarmCountdown
NR 705
NTM 10:47:39
PERIODIC yes
RELATIVE yes
REP -1
STATE inactive
TIMESPEC 00:00:01
TRIGGERTIME 1425808059.89317
TRIGGERTIME_FMT 2015-03-08 10:47:39
TYPE at
Readings:
2015-03-08 10:47:38 state inactive
Attributes:
alias Alarm Countdown Timer
room Funktionen
verbose 0
Ja, hat aber wenig mit dieser Aenderung zu tun, das kam auch bei attr disable.
Habs abgestellt.