FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: satprofi am 11 April 2014, 09:59:22

Titel: jeden 2. tag schalten
Beitrag von: satprofi am 11 April 2014, 09:59:22
hallo.
habe ein aquarium, wo ich die lampen abwechselnd schalten will.
mit täglichen befehlen klappte es, mit diesem aber nicht mehr:



define REV_C1on at *09:00:10 { if ($wday == 1) || ($wday == 3) || ($wday == 5) { fhem("set REV_C1 on } }
define REV_C1on2 at *11:00:10 { if ($wday == 0) || ($wday == 2) || ($wday == 4) || ($wday == 6) { fhem("set REV_C1 on } }
define REV_C1off at *22:00:10 set REV_C1 off
define REV_C1off2 notify myTwilight.*:aktEvent:.*ss_weather { if ($wday == 1) || ($wday == 3) || ($wday == 5) { fhem("set REV_C1 off } }

define REV_C2on at *11:00:10 { if ($wday == 1) || ($wday == 3) || ($wday == 5) { fhem("set REV_C2 on } }
define REV_C2on2 at *09:00:10 { if ($wday == 0) || ($wday == 2) || ($wday == 4) || ($wday == 6) { fhem("set REV_C2 on } }
define REV_C2off notify myTwilight.*:aktEvent:.*ss_weather { if ($wday == 0) || ($wday == 2) || ($wday == 4) || ($wday == 6) { fhem("set REV_C2 off } }
define REV_C2off2 at *22:00:10 set REV_C2 off



ziel dieser handlung sollte sein, die lampen gleichmässig zu "belasten".
im webif sehe ich die geplanten schaltzeiten aber.

wo übersehe ich den fehler?
Titel: Antw:jeden 2. tag schalten
Beitrag von: marvin78 am 11 April 2014, 10:09:14
Du hast da einige Klammern falsch und/oder zu viel und Anführungszeichen fehlen.

Beispiel:


define REV_C1on at *09:00:10 { if ($wday == 1) || ($wday == 3) || ($wday == 5) { fhem("set REV_C1 on } }


sollte so funktionieren


define REV_C1on at *09:00:10 { if ($wday == 1 || $wday == 3 || $wday == 5) { fhem("set REV_C1 on") }}
Titel: Antw:jeden 2. tag schalten
Beitrag von: betateilchen am 11 April 2014, 10:12:20
Das geht viel einfacher:



{my @d = split(localtime(time)); if($d[7] % 2) {macheIrgendwasAnJedemZweitenTag} }



Erklärung:
Der Split der localtime liefert im 8. Element den Wert yday. Das ist der Tag im laufenden Jahr.
Mit der Modulo Funktion wird geprüft, ob der Tag der 1./3./5. usw Tag im Jahr ist. Wenn ja, wird etwas ausgeführt.

Das Problem bei der Verwendung von wday ist nämlich, dass man damit die 7 Tage einer Woche nicht wirklich sinnvoll in zweier Intervalle aufteilen kann.
Titel: Antw:jeden 2. tag schalten
Beitrag von: satprofi am 11 April 2014, 11:07:08
Zitat von: marvin78 am 11 April 2014, 10:09:14
Du hast da einige Klammern falsch und/oder zu viel und Anführungszeichen fehlen.

Beispiel:


define REV_C1on at *09:00:10 { if ($wday == 1) || ($wday == 3) || ($wday == 5) { fhem("set REV_C1 on } }


sollte so funktionieren


define REV_C1on at *09:00:10 { if ($wday == 1 || $wday == 3 || $wday == 5) { fhem("set REV_C1 on") }}


hallo.
habe mir das ganze aus den beiträgen von suchfunktion rausgepickt.
Titel: Antw:jeden 2. tag schalten
Beitrag von: satprofi am 11 April 2014, 11:23:12
Zitat von: betateilchen am 11 April 2014, 10:12:20
Das geht viel einfacher:



{my @d = split(localtime(time)); if($d[7] % 2) {macheIrgendwasAnJedemZweitenTag} }



Erklärung:
Der Split der localtime liefert im 8. Element den Wert yday. Das ist der Tag im laufenden Jahr.
Mit der Modulo Funktion wird geprüft, ob der Tag der 1./3./5. usw Tag im Jahr ist. Wenn ja, wird etwas ausgeführt.

Das Problem bei der Verwendung von wday ist nämlich, dass man damit die 7 Tage einer Woche nicht wirklich sinnvoll in zweier Intervalle aufteilen kann.

hallo.
bedeutet aber das am 365. u. 1. des folgejahres geschlten wird, oder?

würde dein beispiel so klappen ?

define REV_C1on at *11:00:10 {my @d = split(localtime(time)); if($d[7] % 2) { fhem("set REV_C1 on") }}

Titel: Antw:jeden 2. tag schalten
Beitrag von: betateilchen am 11 April 2014, 11:30:03
Zitat von: satprofi am 11 April 2014, 11:23:12
bedeutet aber das am 365. u. 1. des folgejahres geschlten wird, oder?

Ja. Ausser in Schaltjahren 8) Aber Du hast eben den "Fehler" nur einmal im Jahr und nicht einmal pro Woche.

Zitat von: satprofi am 11 April 2014, 11:23:12
würde dein beispiel so klappen ?

wahrscheinlich nicht direkt. Du solltest das in zwei Schritten anlegen.

Zuerst das at "leer" anlegen:


define REV_C1on at *11:00:10 {}


Danach in der Detailansicht des at auf DEF klicken und das hier


*11:00:10 {my @d = split(localtime(time)); if($d[7] % 2) { fhem("set REV_C1 on") }}


per copy & paste übernehmen.

Warum zwei Schritte? Weil da ein paar "Spezialzeichen" drin sind, die man sonst maskieren müsste. Beim Einfügen in das DEF macht fhem das automatisch richtig.
Titel: Antw:jeden 2. tag schalten
Beitrag von: Deudi am 11 April 2014, 11:34:36
Du kannst dir auch einfach eine dummy Variable machen, die du nach jedem Schalten zwischen 0 und 1 hin- und her setzt. Die einen Lampen schaltest du, wenn der dummy auf 0 steht, die anderen bei 1. Dann ist das völlig unabhängig von irgendwelchen Monats- oder Jahreswechseln. Vielleicht schaltest du die gleichen Lampen dann aber nach einem FHEM Restart.
Titel: Antw:jeden 2. tag schalten
Beitrag von: satprofi am 11 April 2014, 11:40:58
und wie definiere ich die geraden tage? %1 ?
Titel: Antw:jeden 2. tag schalten
Beitrag von: betateilchen am 11 April 2014, 11:44:03
nein. Brauchst Du doch gar nicht separat zu definieren, denn wenn nicht ungerade, dann ist gerade. Das geht problemlos in einer einzigen Definition:

{my @d = split(localtime(time)); if($d[7] % 2) {macheIrgendwasAnUngearadenTagen} else {macheIrgendwasAnGeradenTagen}}

Aber der Vollständigkeit halber und um Deine Frage technisch zu beantworten:

if(!($d[7] % 2))

liefert die Unterscheidung auf gerade Tage.
Titel: Antw:jeden 2. tag schalten
Beitrag von: satprofi am 11 April 2014, 11:54:25
thx. alles klar.
Titel: Antw:jeden 2. tag schalten
Beitrag von: satprofi am 11 April 2014, 12:07:59
klappt leider nicht.
habe deine vorgehensweise beachtet, das steht jetzt in DEF

*12:06:10 {my @d = split(localtime(time)); if($d[7] % 2) { fhem("set REV_C1 on") }}


trotzdem schaltet es nur manuel, nicht autom.

[edit]
klar, weil heute ein gerader Tag im jahr ist!
Klappt jetzt, mit "else" wurde die 2. lampe geschalten

tolles forum hier.
Titel: Antw:jeden 2. tag schalten
Beitrag von: satprofi am 14 April 2014, 19:25:19
hallo.
habe jetzt ein notify angelegt, aber da funktioniert das ganze leider nicht mehr.
wo ist da der fehler?


myTwilight.*:aktEvent:.*ss {my @d = split(localtime(time)); if($d[7] % 2) { fhem("set REV_C2 off") } else { fhem("set REV_C1 off") }}
Titel: Antw:jeden 2. tag schalten
Beitrag von: betateilchen am 14 April 2014, 19:37:50
vermutlich ein Fehler in der regexp.
Titel: Antw:jeden 2. tag schalten
Beitrag von: satprofi am 14 April 2014, 19:42:47
? regexp ?
wo soll ich da jetzt suchen?

REGEXP    myTwilight.*:aktEvent:.*ss

m.f.g.
Titel: Antw:jeden 2. tag schalten
Beitrag von: betateilchen am 14 April 2014, 19:44:04
da...

myTwilight.*:aktEvent:.*ss
Titel: Antw:jeden 2. tag schalten
Beitrag von: satprofi am 14 April 2014, 19:50:01
aber da funkts ja


myTwilight.*:aktEvent:.*ss_civil set AquaLamp2_4000K off

Titel: Antw:jeden 2. tag schalten
Beitrag von: betateilchen am 14 April 2014, 19:51:43
das ist ja auch eine andere regexp.

Ich kenne Twilight nicht und weiss nicht, wie die Events dort aussehen, auf die man triggern muss.
Titel: Antw:jeden 2. tag schalten
Beitrag von: Dietmar63 am 14 April 2014, 20:11:58
Ich habe es so geschafft:

Twilight.*:aktEvent:.*ss_weather.*      set StehlampeTisch on; define yy at +00:00:05 set StehlampeTV on
Titel: Antw:jeden 2. tag schalten
Beitrag von: Dietmar63 am 14 April 2014, 20:16:20
Es scheint mir daran zu liegen, dass der Regexp in 91_notify.pm merkwürdig abgefragt wird. Habe es seinerzeit mit Logs getraced , und herausgefunden, dass öfters mal ein .* hilft


die Ereignisse werden folgendermaßen gebildet:


2014.04.14 21:05:56 3: ------------>>>>Twilight:condition_txt: Partly Cloudy<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:condition: 29<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_weather: 19:52:45<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_weather: 06:47:33<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_indoor: 20:08:58<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_indoor: 06:31:20<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss: 20:08:58<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr: 06:31:20<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_civil: 20:50:46<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_civil: 05:49:33<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_naut: 21:35:33<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_naut: 05:04:46<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_astro: 22:26:03<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_astro: 04:14:15<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:condition_txt: Partly Cloudy<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:condition: 29<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_weather: 19:52:45<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_weather: 06:47:33<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_indoor: 20:08:58<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_indoor: 06:31:20<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss: 20:08:58<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr: 06:31:20<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_civil: 20:50:46<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_civil: 05:49:33<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_naut: 21:35:33<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_naut: 05:04:46<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_astro: 22:26:03<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_astro: 04:14:15<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:condition_txt: Partly Cloudy<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:condition: 29<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_weather: 19:52:45<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_weather: 06:47:33<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_indoor: 20:08:58<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_indoor: 06:31:20<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss: 20:08:58<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr: 06:31:20<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_civil: 20:50:46<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_civil: 05:49:33<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_naut: 21:35:33<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_naut: 05:04:46<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_astro: 22:26:03<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_astro: 04:14:15<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:condition_txt: Partly Cloudy<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:condition: 29<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_weather: 19:52:45<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_weather: 06:47:33<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_indoor: 20:08:58<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_indoor: 06:31:20<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss: 20:08:58<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr: 06:31:20<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_civil: 20:50:46<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_civil: 05:49:33<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_naut: 21:35:33<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:sr_naut: 05:04:46<<<
2014.04.14 21:05:56 3: ------------>>>>Twilight:ss_astro: 22:26:03<<<


das Event was du abfragen willst sollte so aussehen:
"Twilight:aktEvent: ss"

Eigentlich sollte der regExp myTwilight.*:aktEvent:.*ss  darauf passen - blicke auch nicht durch.
Titel: Antw:jeden 2. tag schalten
Beitrag von: CP am 15 Mai 2018, 21:52:28
Hallo zusammen,

ich hoffe, der Thread wird noch gelesen  ;)

ich habe ein problem mit der ursprünglichen Lösung.

Ich habe mir ein Testscript gebastelt, dass alle Minute prüft, ob die Minuten gerade oder ungerade sind. (Bei Tagen dauert mir der Test zu lange  8)).


define TestScript at +*00:01:00 {my @d = split(localtime(time));; if(($d[1] % 2)) { fhem("set TestDummy 1") } else { fhem("set TestDummy 0")}}


Leider ist das Ergebnis immer 0 (also der else-Pfad). Im Log finde ich dann folgende Zeile:


2018.05.15 21:48:13 1: PERL WARNING: Use of uninitialized value $d[1] in modulus (%) at (eval 1665271) line 1.


Mir ist jetzt nicht klar, was mir fehlt. Die Variable $d wird doch direkt vorher initialisiert...
Titel: Antw:jeden 2. tag schalten
Beitrag von: Wzut am 16 Mai 2018, 07:40:06
Zitat von: CP am 15 Mai 2018, 21:52:28
Mir ist jetzt nicht klar, was mir fehlt. Die Variable $d wird doch direkt vorher initialisiert...
Dann gib mal in der Webkonsole ein:
{localtime(time)}
und um an die Minuten in $d[1] zu kommen ändere dein Beispiel
my @d = split(":",localtime(time));
BTW : localtime(time) liefert bei mir keinen Wert für den Tag des Jahres : Wed May 16 07:36:17 2018