IT Intertechio Set on timer

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

Vorheriges Thema - Nächstes Thema

Vladi2010

hallo ich versuche heute eine IT Steckdose dazu zu bewegen, auf Kommando sich für 5 Minuten einzuschalten und danach automatisch Abzuschalten.

Bei Google habe ich folgende Anleitung gefunden:

define IT_SCHALTEN notify MEIN_SCHALTER set IT_DOSE on-till {sprintf("%%02d:%%02d:%%02d",($hour+($min+5)/60)%%24,($min+5)%%60,$sec)}


IT_SCHALTEN ist der Name des notify

MEIN_SCHALTER ist ein Button meiner FS20 Fernbedienung, kann aber auch ein dummy-Device sein, dass ist jedenfalls das Device, auf das das notify reagieren soll.

IT_DOSE ist die Steckdose die geschaltet werden soll

und +5 sind die Minuten der Einschaltdauer.

meine Umsetzung:

define IT_SCHALTEN_test notify FS20_d78404:on {fhem("set Steckdose_M7 on-till {sprintf("% d:% d:% d",($hour+($min+5)/60)%$,($min+5)%`,$sec")}

kann mir jemand halfen was ich falsch mache ?

danke im voraus Andreas

broadway

Bin mir nicht sicher, ob IT einen Befehl on-till kennt. Alternative:

define IT_SCHALTEN notify FS20_abc:on set IT_DOSE on;define IT_OFF at +00:05 set IT_DOSE off
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

Vladi2010

habe es jetzt so gemacht:

define IT_SCHALTEN notify FS20_d78404:on set Steckdose_M7 on;define IT_OFF at +00:01 set Steckdose_M7 off

Es Funktioniert ABER LEIDER NUR DAS ERSTE MAHL

danach wird in der config ;define IT_OFF at +00:01 set Steckdose_M7 off gelöscht


kann man das umgehen ?

broadway

Es wird ja bei jedem Tastendruck erneut definiert! Einmalige ats werden immer nach Ausführung aus der Konfig gelöscht.

Willst du wiederkehrende Aktionen programmieren, gib +*00:05 an (d.h. alle 5 min).
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

Vladi2010

ich will eigentlich nur das sie Steckdose für 5 Minuten angeht und dann wider aus

ist dass was du meinst?

FS20_d78404:on set Steckdose_M7 on;define IT_OFF +*00:01 set Steckdose_M7 off  ...da geht die Steckdose an aber nicht aus

Grüße Andreas

Vladi2010

Jetzt habe ich so was versucht:

set Steckdose_M7 on-till {sprintf("%%02d:%%02d:%%02d",($hour+($min+5)/60)%%24,($min+5)%%60,$sec)}

bekomme aber diese Fehlermeldung:

the at function "sprintf("%%02d:%%02d:%%02d",($hour+($min+5)/60)%%24,($min+5)%%60,$sec)" must return a timespec and not Illegal modulus zero at (eval 542) line 1.
.

kann jemand helfen ?


broadway

Also der Befehl funktioniert einwandfrei. Gerade getestet.

define IT_SCHALTEN notify FS20_d78404:on set Steckdose_M7 on;define IT_OFF at +00:01 set Steckdose_M7 off

Gibst du ihn allerdings in die Kommandozeile ein, wird das at sofort angelegt und nur einmal ausgeführt. Am besten in die cfg oder erst das notify leer  anlegen und dann unter DEF vervollständigen.


(siehe Anhang / see attachement)
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

Zrrronggg!

Versuch mal:

define IT_SCHALTEN notify FS20_d78404:on set Steckdose_M7 on ;; define IT_OFF at +00:05 set Steckdose_M7 off

ZWEI Semikolon.
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


(siehe Anhang / see attachement)
:-)

Erst mal klappt es ( zumindest mit einer FS 20 Fernbedienung )  super  :)
ein AT Befehl wird automatisch angelegt.



jetzt habe ich aber die Fernbedienung durch ein FS-20 Piri-2 ausgetauscht, wird der AT befehl automatisch verlängert ( Übershrieben)  ???

das ganze soll zu Anwesenheit- Überwachung im Badezimmer dienen.
(Licht an wen jemand im Badezimmer ist)

Grüße Andreas




broadway

Zitat von: broadway schrieb am Sa, 13 April 2013 14:15Es wird ja bei jedem Tastendruck erneut definiert!

Egal ob das notify durch Fernbedienung oder piri ausgelöst wird.
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

Vladi2010

dass ist mir schon klar,
mir ist nur nicht klar ob wenn der PIRI mehrmals auslöst sich auch der AT Befehl "verlängert" ?

Zrrronggg!

Wird nicht verlängert, kann man aber lösen:


define IT_SCHALTEN notify FS20_d78404:on set Steckdose_M7 on ;; delete IT_OFF ;; define IT_OFF at +00:05 set Steckdose_M7 off


Dann wird das alte "in 5 Minuten ausmachen" zuerst gelöscht und durch ein neues ersetzt, das wieder 5 Minuten läuft.
Beachte, dass das eine Fehlermeldungen nach dem ersten Auslösung gibt, weil es dann IT_OFF ja noch nicht gibt.
Etwa der Art:
"please define IT_OFF first"

Die kannst du ignorieren.

Es gibt Leute die machen das "sauber", in dem sie erst prüfen ob das zu Löschende define schon  existiert. Das ist aber ein rein kosmetisches Thema, ich mach mir die Mühe nicht und ignoriere einfach die Fehlermeldungen im Log. Funktionieren tut's ja trotzdem.

Bitte denke daran, bei Lichtsteuerung durch PIRI die Sendeabstände des PIRI/PIRA etc möglichst lang zu machen (maximum bei FS20 ist glaube ich 240 Sekunden) sonst läufst du ganz schnell in das 1% Problem

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 Andreas,

ich habe die Ansteuerung einer Lampe (InterTechno-Aktor) über einen PIRU so gelöst:

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


Der PIRU sendet on-old-for-timer, bei jedem Empfang wird das at zum Aussschalten gelöscht (falls vorhanden) und ein neues angelegt.
Wenn der Status des PIRU auf Ein (on) steht, wird on-old-for-timer ignoriert und wieder der Status Ein gesetzt. Damit ist ein dauerhaftes Einschalten möglich (z.B. wenn ich alle paar Minute durchlaufe, damit nicht immer on/off geschaltet wird).

myCreateTimer() ist so definiert:

myCreateTimer($$$)
{
        my ($dev,$state,$timer) = @_;

        Log 3,"create at for $dev state $state in $timer seconds";

        my $h = int($timer / 3600);
        my $m = int($timer / 60) % 60;
        my $s = int($timer % 60);

        my $def_cmd = sprintf (
                "define at_%s_%s at +%02d:%02d:%02d set %s %s",
                $dev, $state, $h, $m, $s, $dev, $state
        );
        fhem($def_cmd);
}


Das at löst einen off für den PIRU aus, der dann wieder einen off an den IT sendet. Somit stimmen die Status überein:

define n_fl_se_Melder_off notify fl_se_Melder:off {    \
        Log 3, "fl_se_Melder:off ";;                   \
        if ( Value("at_fl_se_Melder_off") ) {          \
                Log 3, "delete at_fl_se_Melder_off";;  \
                fhem ("delete at_fl_se_Melder_off");;  \
        }                                              \
        if ( Value("fl_li_Lampe") ne "off" ) {         \
                fhem ("set fl_li_Lampe off");;         \
        }                                              \
}



Den Ein-Event habe ich auf einen dimupdown eines FS20-Tasters gelegt (wieder per notify).


Jan

Zrrronggg!

Wow. Das ist ja rund 20x mal mehr Code!
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 jsb73 ,
habe deine Variante jetzt probiert, da bei der vorherigen Variante sich der AT Befehl nicht verlängert hat.

ich habe es mit OpenOffice Writer ersetzt:

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");;\
        }                                                           \
}

myCreateTimer($$$)
{
        my ($dev,$state,$timer) = @_;

        Log 3,"create at for $dev state $state in $timer seconds";

        my $h = int($timer / 3600);
        my $m = int($timer / 60) % 60;
        my $s = int($timer % 60);

        my $def_cmd = sprintf (
                "define at_%s_%s at +%02d:%02d:%02d set %s %s",
                $dev, $state, $h, $m, $s, $dev, $state
        );
        fhem($def_cmd);
}

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");;         \
        }                                              \
}


beim Abspeichern bekomme ich aber folgende Fehlermeldung:

Unknown command myCreateTimer($$$), try help Unknown command {, try help Unknown command my, try help Unknown command Log, try help Unknown command my, try help Unknown command my, try help Unknown command my, try help Unknown command my, try help Unknown command "define, try help Unknown command $dev,, try help Unknown command ), try help Unknown command fhem($def_cmd), try help Unknown command }, try help

kannst du mir da helfen ?

danke im Voraus Andreas