Hauptmenü

neues Modul DOIF

Begonnen von Damian, 21 Mai 2014, 15:53:18

Vorheriges Thema - Nächstes Thema

Puschel74

Schon klar - mitdenken und eines der vielen vorhandenen Beispiele abwandeln ist wohl nicht.
Was machst du nur wenn das Forum mal 2 Wochen down ist oder Damian mal 2 Wochen auf Urlaub  8)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Damian

Zitat von: Puschel74 am 07 November 2014, 19:09:39
Schon klar - mitdenken und eines der vielen vorhandenen Beispiele abwandeln ist wohl nicht.
Was machst du nur wenn das Forum mal 2 Wochen down ist oder Damian mal 2 Wochen auf Urlaub  8)

Das ist schon ok, dass er hier danach fragt. Die Sache mit dem Reading als Timertrigger ist schon was besonders und funktioniert, obwohl ich mir bei der Programmierung von DOIF keine Gedanken zu solch einem Fall gemacht habe.

Gruß

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

Puschel74

Natürlich ist es ok, aber ist wohl nicht zu viel verlangt das man erstmal selbst seine grauen Zellen bemüht und wenn man dann nicht weiter kommt mal eben fragt.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Spartacus

Hallo Damian,
ich habe doch noch einmal eine Frage zum DOIF:

Folgender Code:
define GartenBeleuchtung DOIF (\
([17:00-22:30|56] or\
[17:00-22:30] and  [Feiertag:tomorrow] ne "none" or\
[17:00-21:00|01234] and [Feiertag:tomorrow] eq "none" or\
[17:00-02:00] and [Feiertag:state] eq "Silverster" \
) and [myTwilight:twilight_weather] <30) (set EnO_switch_FF94C082 on) DOELSE (set EnO_switch_FF94C082 off)
attr GartenBeleuchtung cmdState on|off
attr GartenBeleuchtung room Gartenlicht
attr GartenBeleuchtung wait 900:900


Das Listing sieht dann so aus:
NR         446
   NTFY_ORDER 50-GartenBeleuchtung
   STATE      off
   TYPE       DOIF
   Readings:
     2014-11-07 22:30:00   cmd_event       timer_2
     2014-11-07 22:30:00   cmd_nr          2
     2014-11-08 00:00:02   e_Feiertag_state none
     2014-11-08 00:00:02   e_Feiertag_tomorrow none
     2014-11-08 10:47:43   e_myTwilight_twilight_weather 100
     2014-11-07 22:30:00   state           off
     2014-11-07 18:16:48   timer_1_c1      08.11.2014 17:00:00|56
     2014-11-07 22:30:00   timer_2_c1      08.11.2014 22:30:00|56
     2014-11-07 18:16:48   timer_3_c1      08.11.2014 17:00:00
     2014-11-07 22:30:00   timer_4_c1      08.11.2014 22:30:00
     2014-11-07 18:16:48   timer_5_c1      08.11.2014 17:00:00|01234
     2014-11-07 21:00:00   timer_6_c1      08.11.2014 21:00:00|01234
     2014-11-07 18:16:48   timer_7_c1      08.11.2014 17:00:00
     2014-11-08 02:00:00   timer_8_c1      09.11.2014 02:00:00
     2014-11-08 10:44:32   wait_timer      no timer
   Condition:
     0          (DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"56") or DOIF_time($hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"") and  ReadingValDoIf('Feiertag','tomorrow','') ne "none" or DOIF_time($hash->{realtime}{4},$hash->{realtime}{5},$wday,$hms,"01234") and ReadingValDoIf('Feiertag','tomorrow','') eq "none" or DOIF_time($hash->{realtime}{6},$hash->{realtime}{7},$wday,$hms,"") and ReadingValDoIf('Feiertag','state','') eq "Silverster" ) and ReadingValDoIf('myTwilight','twilight_weather','') <30
   Days:
     0          56
     1          56
     4          01234
     5          01234
   Devices:
     0           Feiertag myTwilight
     all         Feiertag myTwilight
   Do:
     0          set EnO_switch_FF94C082 on
     1          set EnO_switch_FF94C082 off
   Helper:
     last_timer 8
     sleeptimer -1
   Internals:
   Readings:
     0           Feiertag:tomorrow Feiertag:state myTwilight:twilight_weather
     all         Feiertag:tomorrow Feiertag:state myTwilight:twilight_weather
   Realtime:
     0          17:00:00
     1          22:30:00
     2          17:00:00
     3          22:30:00
     4          17:00:00
     5          21:00:00
     6          17:00:00
     7          02:00:00
   State:
   Time:
     0          17:00:00
     1          22:30:00
     2          17:00:00
     3          22:30:00
     4          17:00:00
     5          21:00:00
     6          17:00:00
     7          02:00:00
   Timecond:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
   Timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
   Timerfunc:
   Timers:
     0           0  1  2  3  4  5  6  7
Attributes:
   cmdState   on|off
   room       Gartenlicht
   wait       600:600


Mir ist nicht ganz klar, wie das zu lesen ist, bzw. Wie kann ich erkennen, welche Aktion als Nächste ansteht.
Der Hintergrund ist, ich möchte in einer Visualisierung die nächste geplante und tatsächliche Einschalt- und  Ausschaltzeit anzeigen. Ich weiß, bei "twilight_weather" geht das mit der geplanten Zeit nicht da würde ich dann auf "ss_weather" wechseln, da es für twilight_weather ja keine Uhrzeit gibt. Wie kann ich erkennen, welcher der 8 Timer als nächstes relevant wird!

z.B.
Heute ist Samstag: Hier sollte dann 17:00-22:30 als geplante Zeit angezeigt werden, die tatsächle Schaltzeit leite ich dann wie ab? Kann man das über "cmd_nr" und "cmd_event" irgendwie ermitteln?

Ich hoffe es ist einigermaßen klar, was ich hier erreichen möchte!
Danke und Gruß,
Christian
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

Damian

Das ist nicht so einfach. Alle Timer die du siehst triggern und zwar genau um die Zeit, die da steht. Welche Auswirkung das für das Schalten hat, das hängt von der dazugehörigen Bedingung (c1, c2, ...) ab, ob sie zum Zeitpunkt der Triggerung wahr ist oder eben nicht. Z. B. triggert die erste Bedingung immer um 17:00 und 22:30 Uhr, wahr ist sie aber nur am Freitag und Samstag zwischen 17:00 und 22:30 Uhr.

Gruß

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

Brockmann

Zitat von: Spartacus am 08 November 2014, 11:06:14
Ich weiß, bei "twilight_weather" geht das mit der geplanten Zeit nicht da würde ich dann auf "ss_weather" wechseln, da es für twilight_weather ja keine Uhrzeit gibt. Wie kann ich erkennen, welcher der 8 Timer als nächstes relevant wird!
Nur als Hinweis:
Ich weiß nicht, warum Du von twilight_weather auf ss_weather wechseln willst, aber eines solltest Du dabei beachten. DOIF stellt seine Timer immer zu einem bestimmten Zeitpunkt x mit den dann aktuellen Werten ein (wie und wann genau, weiß ich nicht mehr, steht hier irgendwo in diesem mittlerweile recht länglichen Thread). Der Witz bei ss_weather ist ja aber, dass das im Laufe des Tages mehrfach aktualisiert wird, wenn sich die Wetterbedingungen ändern. Davon bekommt das DOIF dann aber nichts mehr mit und passt den Schaltzeitpunkt nicht an. Deshalb würde ich bei der Lösung bleiben, direkt den Twilight_weather-Wert abzufragen oder eben auf das Event ss_weather zu triggern.

Spartacus

Hallo,
ok! Danke für die Antworten. Dann muss ich mir zwecks Übersicht eine statische Tabelle bauen und dann die geplanten und die tatsächlichen Werte anzeigen.

Gruß
Christian
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

Damian

Zitat von: Brockmann am 09 November 2014, 10:12:48
DOIF stellt seine Timer immer zu einem bestimmten Zeitpunkt x mit den dann aktuellen Werten ein (wie und wann genau, weiß ich nicht mehr, steht hier irgendwo in diesem mittlerweile recht länglichen Thread).

Zum ersten mal bei der Definition des Moduls und dann erst, wenn der gesetzte Timer getriggert hat, zwischendurch wird der Timer nicht aktualisiert, insbesondere nicht wenn ein Reading mit [{ReadingsVal... zum Timer gemacht wurde, auch nicht wenn sich dieser ändert. Mit anderen Worten, einmal gesetzter Timer bleibt solange bestehen, bis er triggert.

Gruß

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

igami

Hallo Christian,

versuch es mal mit etwas in der folgenden Art:

define ntfy_redefine_GartenBeleuchtung notify myTwilight:twilight_weather {my $DEF=InternalVal('GartenBeleuchtung','DEF','DEF error');;fhem("modify GartenBeleuchtung $DEF")}

soetwas in der Art nutze ich bei uns in der Firma auch um Schaltzeiten komfortabel via DropDown zu ändern.
Dadurch wird das DOIF einfach neu initialisiert und auch die Werte neu ausgelesen.

Grüße
Igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Damian

Zitat von: igami am 09 November 2014, 13:04:06
Hallo Christian,

versuch es mal mit etwas in der folgenden Art:

define ntfy_redefine_GartenBeleuchtung notify myTwilight:twilight_weather {my $DEF=InternalVal('GartenBeleuchtung','DEF','DEF error');;fhem("modify GartenBeleuchtung $DEF")}

soetwas in der Art nutze ich bei uns in der Firma auch um Schaltzeiten komfortabel via DropDown zu ändern.
Dadurch wird das DOIF einfach neu initialisiert und auch die Werte neu ausgelesen.

Grüße
Igami

ja, mit modify kann man natürlich das Modul immer neu initialisieren, allerdings wird dadurch die Zustandsverwaltung des Moduls zunichtegemacht. Wenn nur Timer definiert sind, ist es sicherlich nicht so kritisch.

Gruß

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

det.

Hallo Damian,
komme mit der Lichtsteuerung meines Hausflures beim Öffnen der Haustür nicht weiter (soll nach Ausschalten nicht sofort beim nächsten Türöffnen wieder angehen oder wenn man vor dem Verlassen bereits ausgeschaltet hat). Es gab da mal einen Wiki Artikel, habe das mit Deinem Modul umgesetzt, u.a. weil das genial nur numerische Werte aus meinem 1-wire Helligkeitsmodul rausfiltert. Läuft, nur die Sache mit der Zeitsteuerung geht offenbar nicht, weil die time() kein Device ist. Habe jetzt recht lange ohne Erfolg probiert und bin guter Hoffnung, dass Du mit einer Lösung helfen kannst.
define flurlichtsteuerung DOIF (([OWX_26_0A9116000000:light:d]<10) and ([SCHb_Haustuer] eq "off") and [opentime()<time()]) (set Flur on-for-timer 320)
define storeLastOff notify Flur:off { $data{lastOffTime} = opentime() }
sub
opentime()
{
  my $startzeit= time()+180;
   return $startzeit;
}

Flur ist ein HM Schalter; Schb_Haustür eine alte 2 Kanal FS20 Sünde...
LG
det.

Damian

Zitat von: det. am 09 November 2014, 19:09:08
Hallo Damian,
komme mit der Lichtsteuerung meines Hausflures beim Öffnen der Haustür nicht weiter (soll nach Ausschalten nicht sofort beim nächsten Türöffnen wieder angehen oder wenn man vor dem Verlassen bereits ausgeschaltet hat). Es gab da mal einen Wiki Artikel, habe das mit Deinem Modul umgesetzt, u.a. weil das genial nur numerische Werte aus meinem 1-wire Helligkeitsmodul rausfiltert. Läuft, nur die Sache mit der Zeitsteuerung geht offenbar nicht, weil die time() kein Device ist. Habe jetzt recht lange ohne Erfolg probiert und bin guter Hoffnung, dass Du mit einer Lösung helfen kannst.
define flurlichtsteuerung DOIF (([OWX_26_0A9116000000:light:d]<10) and ([SCHb_Haustuer] eq "off") and [opentime()<time()]) (set Flur on-for-timer 320)
define storeLastOff notify Flur:off { $data{lastOffTime} = opentime() }
sub
opentime()
{
  my $startzeit= time()+180;
   return $startzeit;
}

Flur ist ein HM Schalter; Schb_Haustür eine alte 2 Kanal FS20 Sünde...

dann eher so, ohne notify und ohne subroutine  ;) :

define flurlichtsteuerung DOIF ([Flur] eq "off")
  ({$data{lastOffTime}=time()+180})
DOELSEIF ([OWX_26_0A9116000000:light:d]<10 and [SCHb_Haustuer] eq "off" and $data{lastOffTime} < time())
  (set Flur on-for-timer 320)

attr flurlichtsteuerung do always


Gruß

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

det.

Hallo Damian,
perfekt, vielen Dank!!!  :)  Funktioniert genau wie ich mir es vorgestellt hatte. Das Brett vor dem Kopf resultierte aus dem Tausch das FS20 UP Aktors heute gegen einen HM Aktor und der irrigen Vorstellung, den Code nur leicht anpassen zu müssen. Da die Frage zu der Problematik hier schon mehrmals kam, haben sicher einige User Verwendung für Deine Lösung.
LG
det.

kumue

Hallo zusammen,

mein DOIF soll nur am Sonntag zu einer bestimment Zeit ausgeführt werden. Also habe ich ([18:30-23:00|0]) definiert.
Aber es wird auch an den anderen Wochentagen ausgeführt.
Vermute, es liegt am Pipe-Zeichen. Änderungen mache ich in der GUI über DEF.
Habe Pipe
- aus der commandreferenz kopiert
- normal über die Tastatur eingegeben
- über den ASCII Code U+007C  (VERTICAL LINE)
Half alles nix.
Bei den Updates bin ich auf dem neusten Stand.
Vielleicht hat jemand einen Tipp....

Danke im voraus.
Gruß Kai

Damian

Zitat von: kumue am 11 November 2014, 11:30:45
Hallo zusammen,

mein DOIF soll nur am Sonntag zu einer bestimment Zeit ausgeführt werden. Also habe ich ([18:30-23:00|0]) definiert.
Aber es wird auch an den anderen Wochentagen ausgeführt.
Vermute, es liegt am Pipe-Zeichen. Änderungen mache ich in der GUI über DEF.
Habe Pipe
- aus der commandreferenz kopiert
- normal über die Tastatur eingegeben
- über den ASCII Code U+007C  (VERTICAL LINE)
Half alles nix.
Bei den Updates bin ich auf dem neusten Stand.
Vielleicht hat jemand einen Tipp....

Danke im voraus.
Gruß Kai

Die Syntax ist korrekt. Mache bitte list <dein doif-modul> in der commandozeile und poste hier den Output.

Gruß

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