Hauptmenü

jeden 2. tag schalten

Begonnen von satprofi, 11 April 2014, 09:59:22

Vorheriges Thema - Nächstes Thema

satprofi

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?
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

marvin78

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

betateilchen

#2
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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

satprofi

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.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

satprofi

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

gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Deudi

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.
Gigabyte Brix, Ubuntu 16.04.3 LTS, Homematic, Z-Wave, EnOcean, Shelly@MQTT, SIGNALduino, JeeLink DAVIS-Sketch

satprofi

und wie definiere ich die geraden tage? %1 ?
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

satprofi

gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

satprofi

#10
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.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

satprofi

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") }}
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

betateilchen

vermutlich ein Fehler in der regexp.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

satprofi

? regexp ?
wo soll ich da jetzt suchen?

REGEXP    myTwilight.*:aktEvent:.*ss

m.f.g.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!