IT Intertechio Set on timer

Begonnen von Vladi2010, 12 April 2013, 23:17:14

Vorheriges Thema - Nächstes Thema

Zrrronggg!

Mal meinen Code probiert?


Nichts gegen jsb73 Lösung die sicher elegant ist (Z.B. keine Fehlermeldungen im Log als Kollateraleffekt hat) und auch mehr Anwendungsfälle abdeckt. Sie ist nur auch wesentlich komplexer, hat 20x mehr Code und bietet für den Anfänger einiges an, Stellen wo was schief gehen kann (wie du jetzt weisst)

Aber für deinen Bedarf funktioniert vielleicht auch die russische "Lada-Methode"  (Lada Methode = Auto ist unelegant, hat wenig Features und klappert, fährt aber, ist günstig und lässt sich mit Zange und Hammer reparieren)

define IT_SCHALTEN notify FS20_d78404:on set Steckdose_M7 on ;; delete IT_OFF ;; define IT_OFF at +00:05 set Steckdose_M7 off
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Vladi2010

hallo Zrrronggg!

probiere gerade dein Vorschlag ;)

ich habe noch eine Frage zwischendurch, wenn ich mehrere Sensoren betreiben will die immer nur die eine Steckdose schalten also Sensor1 oder Sensor2 oder Sensor3,...   muss ich dass so schreiben ?

FS20_5d5900|FS20_481c0|0FS20_d78404:on set Steckdose_M7 on ; delete IT_OFF ; define IT_OFF at +00:05 set Steckdose_M7 off

Grüße Andreas

Zrrronggg!

ich glaube nicht dass das geht.

Ich würde das eher so machen:

define IT_SCHALTEN1 notify FS20_d78404:on set Steckdose_M7 on ;; delete IT_OFF ;; define IT_OFF at +00:05 set Steckdose_M7 off
define IT_SCHALTEN2 notify FS20_5d5900:on set Steckdose_M7 on ;; delete IT_OFF ;; define IT_OFF at +00:05 set Steckdose_M7 off
define IT_SCHALTEN3 notify FS20_481c0:on set Steckdose_M7 on ;; delete IT_OFF ;; define IT_OFF at +00:05 set Steckdose_M7 off



Und ich würde meinen Sendern andere Namen geben als "FS20_d78404"
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

jsb73

Hallo,

die myCreateTimer() muss in FHEM/99_myUtils.pm zuerst definiert und das Modul neu geladen sein. Hatte ich vergessen, dazu zu schreiben :-( Danach die Notifies definieren.

Jan

jsb73

Zitat von: Zrrronggg! schrieb am Di, 16 April 2013 16:55Aber für deinen Bedarf funktioniert vielleicht auch die russische "Lada-Methode"  (Lada Methode = Auto ist unelegant, hat wenig Features und klappert, fährt aber, ist günstig und lässt sich mit Zange und Hammer reparieren)

So ein Teil schaue ich nicht mal mehr mit dem Achtersteven an ;-) Gab mal Zeiten, da habe ich von dem Teil geträumt...

Zrrronggg!

Dann setze eben anstatt LADA die MIR ein.  :-)


Ich bin mir (als Westeler) nicht sicher, ob ich in Sibirien lieber einen Lada oder was akteuelles von sagen wir VW vollgestopft mit Elektronic hätte... wen mein Leben davon abhinge, dass das angeht und Teil fährt.

FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Vladi2010

also das hier funktioniert und ist für einen Anfänger wie mich auch leicht nachvollziehbar, danke Zrrronggg!  :)

define IT_SCHALTEN1 notify FS20_d78404:on set Steckdose_M7 on ;; delete IT_OFF ;; define IT_OFF at +00:05 set Steckdose_M7 off
define IT_SCHALTEN2 notify FS20_5d5900:on set Steckdose_M7 on ;; delete IT_OFF ;; define IT_OFF at +00:05 set Steckdose_M7 off
define IT_SCHALTEN3 notify FS20_481c0:on set Steckdose_M7 on ;; delete IT_OFF ;; define IT_OFF at +00:05 set Steckdose_M7 off

nich desto trotz will ich auch das von jsb73 verstehen wollen,
jsb73 wass meinst du mit "die myCreateTimer() muss in FHEM/99_myUtils.pm zuerst definiert und das Modul neu geladen sein. Hatte ich vergessen, dazu zu schreiben :-( Danach die Notifies definieren."  ??

kannst du das genauer erläutern ? ist der Skript von dir den ich auf mich umgeschrieben habe richtig ?

danke an alle die sich mit mir die Mühe machen
Andreas

jsb73

Hallo,

im Verzeichnis FHEM gibt es ein File 99_myUtils.pm, dort kannst Du eigene Perl-Funktionen definieren. Danach mit reload 99_myUtils das Modul laden oder fhem neu starten.

Dein Code ist:

define Anwesenheit_BAD notify FS20_5d5900:on { \
  my $timer = $EVTPART1;; \
  Log 3, "FS20_5d5900:on-old-for-timer ".$timer;; \
  if ( OldValue("FS20_5d5900") eq "Ein" ) { \
    Log 3, "FS20_5d5900 permanent Ein";; \
    fhem("set FS20_5d5900 Ein");; \
  } else { \
    if ( Value("at_FS20_5d5900_off") ){ \
      Log 3, "Anwesenheit_BAD: delete at_FS20_5d5900_off";; \
      fhem ("delete at_FS20_5d5900_off");; \
    } \
    if ( Value(" Steckdose_M7") ne "on" ) { \
      fhem ("set Steckdose_M7 on");; \
    } \
    myCreateTimer($NAME,"off",$timer);; \
    fhem ("setstate FS20_5d5900 on $timer");;\
    } \
  }



Damit würde ein on-Event für die Adresse 1111 eines FS20-Senders (5d59 ist der Housecode) verarbeitet. Ein on-Event hat aber keine Zeitangabe, daher ist $EVTPART1 nicht gesetzt. Der Sender müsste ein "on-for-timer xxx" senden und das Notify muss

define Anwesenheit_BAD notify FS20_5d5900:on-for-timer.* { \

definieren. Ein PIRU sendet z.B. "on-old-for-timer xxx", so ist mein Beispiel auch definiert.
Das erste if prüft, ob der alte Status Ein war (Du musst also "eventMap on:Ein" als Attribut des FS20 setzen). In dem Fall wird ein "set ... Ein" gesetzt, was den FS20 wieder auf Ein schaltet. Damit bleibt der alte Status bzw. wird wieder gesetzt. Das dient dazu, die on-for-timer zu übersteuern und den Aktor permanent auf Ein zu halten.

Im else-Zweig wird geprüft, ob ein at_FS20_5d5900_off existiert und wenn ja, dieses gelöscht. Das verhindert die Warnung im Log.
Das nächste if prüft, ob die Steckdose auf on steht. Hier ist in Value(" Steckdose_M7") ein Leerzeichen zu viel! Damit wird ein Funk-Befehl nicht gesendet, wenn er nicht nötig ist.
Der Aufruf von myCreateTimer legt ein at_FS20_5d5900_off an, dass nach xxx Sekunden ein off-Event auslöst. Für das off-Event benötigst Du ein weiteres notify, dass ein off an die Steckdose sendet. Somit sind FS20-Sender-Status und Steckdose synchronisiert und werden korrekt angezeigt.

Das setstate muss

fhem ("setstate FS20_5d5900 on-for-timer $timer");;

lauten. Das benötigst Du aber nur um ein on-old-for-timer in ein on-for-timer bei der Status-Anzeige zu wandeln. Ist also eher Kosmetik wegen der FS20-Icons.

Wenn ich richtig zähle (daher die Einrückung), fehlt ein "} \" vor der letzten Klammer.

Dein off-notify:

define n_FS20_5d5900_off notify FS20_5d5900:off { \
  Log 3, "FS20_5d5900:off ";; \
  if ( Value("at_FS20_5d5900_off") ) { \
   Log 3, "delete at_FS20_5d5900_off";; \
   fhem ("delete at_FS20_5d5900_off");; \
  } \
  if ( Value(" Steckdose_M7") ne "off" ) { \
    fhem ("set Steckdose_M7 off");; \
  } \
}

löscht ein evtl vorhandenes at_FS20_5d5900_off und sendet ein off an die Steckdose. Scheint OK.


Damit Du mit einem on-Event die Steckdose einschaltest, benötigst Du:

define n_FS20_5d5900_no notify FS20_5d5900:on { \
  Log 3, "FS20_5d5900:on";; \
  if ( Value("at_FS20_5d5900_off") ) { \
   Log 3, "delete at_FS20_5d5900_off";; \
   fhem ("delete at_FS20_5d5900_off");; \
  } \
  if ( Value(" Steckdose_M7") ne "on" ) { \
    fhem ("set Steckdose_M7 on");; \
  } \
}



Also 3 Events:
* on-for-timer (oder on-old-for-timer) kommt vom Bewegungsmelder und schaltet für xxx Sekunden ein
* on  kommt von der Web-Oberfläche oder einem Schalter im 2-Kanal-Mode
* off dito


Ein FS20-Taster sendet entweder linke Taste on und rechte Taste off für die selbe FS20-Adresse im 2-Kanal-Mode (bei einem 4-fach Taster) oder je Taste ein toggle für eine andere Adresse im 4-Kanal-Mode.
Ich habe einen Bewegungsmelder, der für die Adresse 1234 ein on-old-for-timer sendet und einen FS20-Taster, der on/off für die selbe Adresse sendet (bzw. toggle, dann wirds halt komplizierter).


Vermutlich habe ich Dich mit meinem Beispiel für den Bewegungsmelder ungewollt verwirrt. Wenn Du einen Taster mit on/off einsetzt, benötigst Du natürlich ein on-notifiy, dass xxx Sekunden einschaltet:

define Anwesenheit_BAD notify FS20_5d5900:on { \
  my $timer = 600;; \
  Log 3, "FS20_5d5900:on timer: ".$timer;; \
  if ( Value("at_FS20_5d5900_off") ){ \
    Log 3, "Anwesenheit_BAD: delete at_FS20_5d5900_off";; \
    fhem ("delete at_FS20_5d5900_off");; \
  } \
  if ( Value("Steckdose_M7") ne "on" ) { \
    fhem ("set Steckdose_M7 on");; \
  } \
  myCreateTimer($NAME,"off",$timer);; \
  fhem ("setstate FS20_5d5900 on-for-timer $timer");;\
}

Damit wird bei on vom Schalter die Steckdose 600s eingeschaltet und der Status des Schalters auf "on-for-timer 600" (also Icon Lampe gelb mit Uhr) gesetzt. Nach 600s wird ein off-Event für den Schalter erzeugt, was Schalter und Steckdose auf off setzen.
Der Status des Schalters wird auf on gesetzt, wenn der Funkbefehl "on" vom Schalter empfangen wird. Dann kannst Du aber ein dauer-on nicht von einem on-for-timer unterscheiden, weil Du ja nicht weisst, ob der Schalter oder die Web-Oberfläche ein on gesendet hat. Dafür kannst Du die Steckdose am Schalter ein- und ausschalten.

Wenn der Schalter im 4-Kanal-Mode läuft, sendet er ein toggle. In den Fall geht:

define Anwesenheit_BAD notify FS20_5d5900:toggle { \
  my $timer = 600;; \
  Log 3, "FS20_5d5900:toggle timer: ".$timer;; \
  if ( OldValue("FS20_5d5900") eq "Ein" ) { \
    Log 3, "FS20_5d5900 permanent Ein";; \
    fhem("set FS20_5d5900 Ein");; \
  } else { \
    if ( Value("at_FS20_5d5900_off") ){ \
      Log 3, "Anwesenheit_BAD: delete at_FS20_5d5900_off";; \
      fhem ("delete at_FS20_5d5900_off");; \
    } \
    if ( Value(" Steckdose_M7") ne "on" ) { \
      fhem ("set Steckdose_M7 on");; \
    } \
    myCreateTimer($NAME,"off",$timer);; \
    fhem ("setstate FS20_5d5900 on-for-timer $timer");;\
    } \
  } \
}

Dann wird bei einem kurzen Tastendruck immer eingeschaltet. Dauer-on geht dann über die Web-Oberfläche.

Ein langer (>1s) Tastendruck liefert übrigens ein dimupdown-Befehl, den Du gesondert verwenden kannst:

define n_FS20_5d5900_off notify FS20_5d5900:dimupdown { \
  Log 3, "FS20_5d5900:dimupdown";; \
  fhem ("set FS20_5d5900 off");; \
  } \
}



Wichtiger Unterschied: ein "set xxx on" schaltet auf on und verarbeitet das notify für on, ein "setstate xxx on" setzt nur den Status.


So dass war jetzt wohl der komplette Kurs, kannst Dir raussuchen, was Du machen willst ;-)

Jan

Vladi2010

Hallo jsb73

danke für die Anleitung,

ich werde es mir jetzt ausdrucken und versuche es zu " Verdauen"  ;-)

Grüße Andreas