Vorschlag/Wunsch: (set) disabled als state für at und notify

Begonnen von Thomas_Homepilot, 03 März 2015, 09:23:48

Vorheriges Thema - Nächstes Thema

Thomas_Homepilot

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
Rock64, RasPi mit AddOn-Board
Devices: Homematic, LaCrosse, SMLUSB, OneWire, Viessmann, Dect200, ZWave, PCA301, Zigbee

rudolfkoenig

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.

Thomas_Homepilot

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
Rock64, RasPi mit AddOn-Board
Devices: Homematic, LaCrosse, SMLUSB, OneWire, Viessmann, Dect200, ZWave, PCA301, Zigbee

Thomas_Homepilot

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&auml;t.<br>
+        </ul></li>
+    <li>active
+    <ul>
+        Aktiviert das entsprechende Ger&auml;t, wenn es &uuml;ber das set-Kommando "disabled" deaktiviert wurde.
+        Aktiviert das entsprechende Ger&auml;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&auml;t.<br>
+        Hinweis: Wenn angewendet auf ein <a href="#at">at</a>, dann wird der
+        Befehl nicht ausgef&uuml;hrt, jedoch die n&auml;chste
+        Ausf&uuml;hrungszeit berechnet.
+        </li><br>
+    <a name="active"></a>
+    <li>active<br>
+        Aktiviert das entsprechende Ger&auml;t, wenn es &uuml;ber das set-Kommando "disabled" deaktiviert wurde.
+        Aktiviert das entsprechende Ger&auml;t nicht, wenn das Attribut "disable" gesetzt ist.
@@ -607 +642 @@
-        Deaktiviert das entsprechende Ger&aauml;t.<br>
+        Deaktiviert das entsprechende Ger&auml;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
Rock64, RasPi mit AddOn-Board
Devices: Homematic, LaCrosse, SMLUSB, OneWire, Viessmann, Dect200, ZWave, PCA301, Zigbee

rudolfkoenig

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.

Thomas_Homepilot

Verstehe ich. Vielleicht kann man der möglichen Verwirrung mit einer anderen Bezeichnung vorbeugen. Z. B. standby oder inactive...
Rock64, RasPi mit AddOn-Board
Devices: Homematic, LaCrosse, SMLUSB, OneWire, Viessmann, Dect200, ZWave, PCA301, Zigbee

rudolfkoenig

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.

der-Lolo

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?

rudolfkoenig

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.

Thomas_Homepilot

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
Rock64, RasPi mit AddOn-Board
Devices: Homematic, LaCrosse, SMLUSB, OneWire, Viessmann, Dect200, ZWave, PCA301, Zigbee

karl0123

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

rudolfkoenig

Ja, hat aber wenig mit dieser Aenderung zu tun, das kam auch bei attr disable.
Habs abgestellt.