DOIF mit indirekten Zeitangaben

Begonnen von Damian, 25 Februar 2015, 19:19:38

Vorheriges Thema - Nächstes Thema

Damian

Liebe DOIF-Nutzer,

da offensichtlich Readings als Zeitangaben oft benutzt werden, bastle ich gerade an einer neuen Version von DOIF.

Bei dieser Version kann man Readings, Stati oder Internals als Zeitangaben direkt in der Bedingung angeben.

Beispiel:

define Zeit dummy
set Zeit 16:00


DOIF ([[Zeit]]) (set lampe on)

ebenso geht auch, wenn im Dummy beginnzeit und endzeit die entsprechende Zeit steht:

DOIF ([[beginnzeit]-[endezeit]]) (set lampe on)

Genauso lassen sich auch Readings oder Internals in der gewohnten Weise angeben.

Das Besondere an dieser Syntax im Gegensatz zu Angaben der Art [{ReadingsVal... ist, dass eine Änderung der Zeit im Status oder Reading sofort zu einer Anpassung der Zeit im Modul führt.

Die ersten Tests sind vielversprechend  :)

Gruß

Damian

Nachtrag: aktuelle Version ist bereits über Update verfügbar
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

Juchu. Das spart ne Menge Code und macht es sauberer.

maxritti

Daumen hoch dafür.
Ich hoffe, dass aus dem "vielversprechend" bald das "erfolgreich implementiert" kommt.  :)

Schon mal schönen Dank für das neue Feature.

Damian

#3
Angehängt ist eine Vorabversion zum Testen. Ich musste die interne Mimik zum Setzen der Timer ändern. Sie werden jetzt erst gesetzt, wenn das System hochgefahren ist. Damit wird sichergestellt, das alle Readings oder Stati gesetzt sind.

Auszug aus der Doku:

Schalten mit indirekten Zeitangaben

Statt fester Zeitangaben können auch Stati, Readings oder Internals angegeben werden. Diese müssen eine Zeitangabe im Format HH:MM oder HH:MM:SS beinhalten.

Anwendungsbeispiel

define time dummy
set time 08:00
define di_time DOIF ([[time]])(set lamp on)


oder Angaben mit Zeitintervallen

define begin dummy
set begin 08:00

define end dummy
set end 10:00

define di_time DOIF ([[begin]-[end]])(set radio on) DOELSE (set radio off)


Bei einer Änderung des angegebenen Status oder Readings wird die geänderte Zeit sofort im Modul aktualisiert.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

flurin

#4
Hi Damian

Vielen Dank für das neue Feature!

Folgendes habe ich getestet:

define di_time_var DOIF ([[start_time]]) (set flex_lamp on)

define di_time_var DOIF ([[start_time]-[end_time]]) (set flex_lamp on) DOELSE (set flex_lamp off)

define di_time_var DOIF ([[start_time]-11:12]) (set flex_lamp on) DOELSE (set flex_lamp off)

alles OK

jedoch

define di_time_var DOIF ([10:44-[end_time]]) (set flex_lamp on) DOELSE (set flex_lamp off)

geht nicht.

Gruss
flurin

Damian

#5
Zitat von: flurin am 27 Februar 2015, 10:50:15


define di_time_var DOIF ([10:44-[end_time]]) (set flex_lamp on) DOELSE (set flex_lamp off)

geht nicht.

Gruss
flurin

habe es gefixt.

Wie konnte ich nur fehlende Klammern in diesem Ausdruck übersehen :)

  if ($timer =~ /^(\+)?((\{.*\})|(\[.*\])|([0-9][0-9](:[0-5][0-9]){1,2}))(\|[0-8]+$|-(\+)?(([0-9][0-9](:[0-5][0-9]){1,2})|({.*})|(\[.*\]))|$)(\|[0-8]+$|$)/) {

neuer Version im Anhang

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

flurin

#6
Zitat von: Damian am 27 Februar 2015, 14:15:22
habe es gefixt.

neuer Version im Anhang

Wow!, das ging aber schnell  :)

Test bei mir: passed

Da wird sich Spartacus auch darüber freuen; damit sollte er sein Problem lösen können.

Gruss
flurin

moonsorrox

Zitat von: Damian am 27 Februar 2015, 14:15:22
Wie konnte ich nur fehlende Klammern in diesem Ausdruck übersehen :)

  if ($timer =~ /^(\+)?((\{.*\})|(\[.*\])|([0-9][0-9](:[0-5][0-9]){1,2}))(\|[0-8]+$|-(\+)?(([0-9][0-9](:[0-5][0-9]){1,2})|({.*})|(\[.*\]))|$)(\|[0-8]+$|$)/) {

;) :D ;)

ich habe auch schon ein wenig mal getestet, funktioniert Super  ;D
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Spartacus

Hallo Damin, hallo flurin.
das ist wirklich eine tolle Sache! Ganz lieben Dank für die Anpassungen und Tests.
Aber die Anwendung habe ich noch nicht durchschaut! :(

Meine SUB "OffTimeLicht" bzw. "OffTimeLichtX" liefert mir die Ausschaltzeit als "22:00" bzw. "16:30-22:00" zurück!

Das hier gibg schon forher, mit dem berichteten Triggerproblem:

([19:55-{OffTimeLichtX}]) (set Lampe on)
DOELSE
(set Lampe off)


...und hier gibt es einen Fehler:
([19:55-[{OffTimeLichtX}]]) (set Lampe on)
DOELSE
(set Lampe off)

liefert mir einen Fehler!
Wie muss ich das korrekt anwenden?
Muss ich die OffTime vorher erst in ein Dummy kopieren?
Sorry, ich brauche immer etwas länger...

Gruß,
Christian

Hier noch mal der Code von flurin

sub OffTimeLichtX ()
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

if (ReadingsVal("hl.01.Feiertag","today","") =~ m/Silvester/)
{
  return ("02:30:00")
}
elsif ((ReadingsVal("hl.01.Feiertag","tomorrow","")=~ m/none/) && ($wday =~ m/[01234]/))
{
  return ("22:00:00")
}
elsif ((ReadingsVal("hl.01.Feiertag","tomorrow","") !~ m/none/) || ($wday =~ m/[56]/))
{
  return ("23:00:00")
}
}
sub OffTimeLicht ($)
{
my ($start_time) = @_;
my $ret;
 
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

if (ReadingsVal("hl.01.Feiertag","today","") =~ m/Silvester/)
{
  $ret = "02:30";
}
elsif ((ReadingsVal("hl.01.Feiertag","tomorrow","")=~ m/none/) && ($wday =~ m/[01234]/))
{
  $ret = "22:00";
}
elsif ((ReadingsVal("hl.01.Feiertag","tomorrow","") !~ m/none/) || ($wday =~ m/[56]/))
{
  $ret = "23:00";
}

if ($start_time ne "") {
  $ret = $start_time." - ".$ret;
}
return $ret;
}
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

flurin

#9
Zitat von: Spartacus am 27 Februar 2015, 20:07:02
Muss ich die OffTime vorher erst in ein Dummy kopieren?

Ja, ich würde es so lösen:

define end_time dummy

define di_end_time_set DOIF ([06:30]) ( {my $OffTime = OffTimeLicht();;;; fhem("set end_time $OffTime") }  )
attr di_end_time_set do always

define di_time_var DOIF ([06:30-[end_time]]) (set flex_lamp on) DOELSE (set flex_lamp off)
attr di_time_var do always


Edit: Diese Variante nicht verwenden -> siehe weiter unten.

OffTimeLicht mit dem Returnwert "16:30-22:00" kannst Du arkivieren. Das wird evtl. später noch implementiert; wir waren unserer Zeit voraus  :)

Gruss
flurin

moonsorrox

ähm, ne Frage arbeiten die anderen DOIFs mit dem neuen Modul noch..?
Meine ganzen anderen Beleuchtungen sind aus und bei meiner Außenbeleuchtung hat die Umschaltung nicht gearbeitet um kurz vor 21uhr
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Damian

Zitat von: flurin am 27 Februar 2015, 21:06:05
Ja, ich würde es so lösen:

define end_time dummy

define di_end_time_set DOIF ([06:30]) ( {my $OffTime = OffTimeLicht();;;; fhem("set end_time $OffTime") }  )
attr di_end_time_set do always

define di_time_var DOIF ([06:30]-[end_time]]) (set flex_lamp on) DOELSE (set flex_lamp off)
attr di_time_var do always


OffTimeLichtX kannst Du arkivieren. Das wird evtl. später noch implementiert; wir waren unserer Zeit voraus  :)

Gruss
flurin

oder als Einzeiler in einem DOIF-Modul:  ;)

define di_time_var DOIF ([06:30]-[end_time]]) (set flex_lamp on, set end_time {(OffTimeLicht())}) DOELSE (set flex_lamp off)

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: moonsorrox am 27 Februar 2015, 21:15:16
ähm, ne Frage arbeiten die anderen DOIFs mit dem neuen Modul noch..?
Meine ganzen anderen Beleuchtungen sind aus und bei meiner Außenbeleuchtung hat die Umschaltung nicht gearbeitet um kurz vor 21uhr

ja, bei mir funktionieren alle 20 Module wir bisher. Dann musst du das Verhalten analysieren.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

flurin

#13
Zitat von: Damian am 27 Februar 2015, 21:22:28
oder als Einzeiler in einem DOIF-Modul:  ;)

define di_time_var DOIF ([06:30-[end_time]]) (set flex_lamp on, set end_time {(OffTimeLicht())}) DOELSE (set flex_lamp off)

Gruß

Damian

Ja, ich habe bei mir auch eine ähnliche Version mit einem DOIF ausprobiert. Ich wollte nur die einzelnen Schritte mit Bezug auf Deine Doku darlegen.

Gruss
flurin

Damian

Zitat von: flurin am 27 Februar 2015, 21:30:34
Ja, ich habe bei mir auch eine ähnliche Version mit einem DOIF ausprobiert. Ich wollte nur die einzelnen Schritte mit Bezug auf Deine Doku darlegen.

Gruss
flurin

ja, aber statt ( {my $OffTime = OffTimeLicht();;;; fhem("set end_time $OffTime") }  ) würde ich immer

(set end_time {(OffTimeLicht())}) nehmen.

Ich reagiere allergisch, wenn ich vier Semikolons hintereinander sehe :)

Gruß

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF