Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

duke-f

Klingt logisch - wenn man es verstanden hat. Und es erklärt, warum es in den Tests immer funktioniert. Morgen früh (bzw. übermorgen) wird sich's zeigen.

Besten Dank

(Muss zugeben: Das mit "do always" hatte schon jemand erwähnt - ich hab's aber offensichtlich falsch verstanden).
Cubietruck, 3 Raspberry Pis,
CUL868, RFXtrx433, CUL433, SCC868, HM-USB,
IRTrans, EZcontrol XS1, IguanaWorks USB IR Transceiver
ESPEasy, Fritz!Box, Samsung TV+BD, LMS, Squeezelite

flurin

#1276
Zitat von: duke-f am 03 Februar 2015, 12:59:21
(Muss zugeben: Das mit "do always" hatte schon jemand erwähnt - ich hab's aber offensichtlich falsch verstanden).

Hallo duke-f

Ich hatte mich auch gefragt, warum du es nicht einfach ausprobiert hast  :)

http://forum.fhem.de/index.php/topic,33019.msg253904.html#msg253904

Gruss
flurin

duke-f

Cubietruck, 3 Raspberry Pis,
CUL868, RFXtrx433, CUL433, SCC868, HM-USB,
IRTrans, EZcontrol XS1, IguanaWorks USB IR Transceiver
ESPEasy, Fritz!Box, Samsung TV+BD, LMS, Squeezelite

dieda

@Duke-F: Warum realisierst du das nicht mit einem DOIF und einem Kalender?
Komponenten:
Sensoren und Aktoren: FS20, Max!, Zigbee, Zwave
IODev:  Cul1101, MaxLan, ZWAVE, Deconz
Router: KD-Fritte (6360)
Sonstiges: Raspberries,  1x LMS,1 FHEM, 1 x zum Testen,  Logitech-Clients,  Onkyo, SamsungTV, Squeezebox, TabletUIs

duke-f

Zitat von: dieda am 03 Februar 2015, 16:59:16
@Duke-F: Warum realisierst du das nicht mit einem DOIF und einem Kalender?
1. Weil immer zu unvorhersehbaren Zeiten mein Sonderfall "Cottbus" auftreten kann. Dann will ich nur eine Taste drücken (bisher ein Button im Webinterface, künftig auch einen Knopf auf einer Fernbedienung) und am nächsten Morgen werde ich eine Stunde früher geweckt. Am nächsten Tag ist dann automatisch wieder der Normalzustand eingestellt.

Diese Sonderfälle können auch an Wochenenden auftreten.
2. Bin noch nicht so weit mit den Kalendern....
Cubietruck, 3 Raspberry Pis,
CUL868, RFXtrx433, CUL433, SCC868, HM-USB,
IRTrans, EZcontrol XS1, IguanaWorks USB IR Transceiver
ESPEasy, Fritz!Box, Samsung TV+BD, LMS, Squeezelite

dieda

Das kann man doch einbauen. Oder verstehe ich da was falsch. Entweder du nimmst einen dynamischen Terminkalender oder einen Dummy, den du mit abfragst.
Komponenten:
Sensoren und Aktoren: FS20, Max!, Zigbee, Zwave
IODev:  Cul1101, MaxLan, ZWAVE, Deconz
Router: KD-Fritte (6360)
Sonstiges: Raspberries,  1x LMS,1 FHEM, 1 x zum Testen,  Logitech-Clients,  Onkyo, SamsungTV, Squeezebox, TabletUIs

Spartacus

Hallo,
ich muss noch mal mit meiner "Dummy-Ferienauswert-Prozedur" kommen.

Ich habe Dummies, die über eine Sub mit den Tagen bis zum jeweiligen FerienStart bzw. FerienEnde befüllt werden.
Nun möchte ich ein FerienStart und FerienEnde Dummy definieren, welches mir unabhängig vom Ferientyp (Sommerferien, Osterferien, etc) einen Countdown anzeigt. Also die Dummies FerienStart und FerienEnde herunterzählt. Die Zahl wird dann später über einen Sonos angesagt. Die SonosDevices sind auf einem 2.ten fhem Rechner, der per fhem2fhem gekoppelt ist.

Aber wie kann ich in meinem DOIF auf den Wert des richtigen Ferientyps (hier die "6" von e_cnt.OS.start.Ferien.dum_STATE) zugreifen um "Test" korekt zu setzten?
Oder ist der Ansatz falsch und es muss anders gelöst werden...

DEF        ([cnt.OS.start.Ferien.dum] <= 10 or
[cnt.PG.start.Ferien.dum] <= 10 or
[cnt.SO.start.Ferien.dum] <= 10 or
[cnt.HB.start.Ferien.dum] <= 10 or
[cnt.WE.start.Ferien.dum] <= 10)
({fhem "set Test (ReadingsVal("%","state",""))})
DOELSE (set Test 0)
   NAME       SchulferienStart
   NR         774
   NTFY_ORDER 50-SchulferienStart
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2015-02-03 17:26:27   cmd_event       cnt.OS.start.Ferien.dum
     2015-02-03 17:26:27   cmd_nr          1
     2015-02-03 17:26:27   e_cnt.OS.start.Ferien.dum_STATE 6
     2015-02-03 17:26:27   error           {fhem "set Test (ReadingsVal("%","state",""))}: Can't find string terminator '"' anywhere before EOF at (eval 153) line 1.

     2015-02-03 17:26:27   state           cmd_1
   Condition:
     0          InternalDoIf('cnt.OS.start.Ferien.dum','STATE','') <= 10 or  InternalDoIf('cnt.PG.start.Ferien.dum','STATE','') <= 10 or InternalDoIf('cnt.SO.start.Ferien.dum','STATE','') <= 10 or InternalDoIf('cnt.HB.start.Ferien.dum','STATE','') <= 10 or InternalDoIf('cnt.WE.start.Ferien.dum','STATE','') <= 10
   Devices:
     0           cnt.OS.start.Ferien.dum cnt.PG.start.Ferien.dum cnt.SO.start.Ferien.dum cnt.HB.start.Ferien.dum cnt.WE.start.Ferien.dum
     all         cnt.OS.start.Ferien.dum cnt.PG.start.Ferien.dum cnt.SO.start.Ferien.dum cnt.HB.start.Ferien.dum cnt.WE.start.Ferien.dum
   Do:
     0          {fhem "set Test (ReadingsVal("%","state",""))}
     1          set Test 0
   Helper:
     last_timer 0
     sleeptimer -1
   Internals:
     0           cnt.OS.start.Ferien.dum:STATE cnt.PG.start.Ferien.dum:STATE cnt.SO.start.Ferien.dum:STATE cnt.HB.start.Ferien.dum:STATE cnt.WE.start.Ferien.dum:STATE
     all         cnt.OS.start.Ferien.dum:STATE cnt.PG.start.Ferien.dum:STATE cnt.SO.start.Ferien.dum:STATE cnt.HB.start.Ferien.dum:STATE cnt.WE.start.Ferien.dum:STATE
   Readings:
   State:
   Timerfunc:
   Trigger:
Attributes:

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: Spartacus am 03 Februar 2015, 17:39:44
Hallo,
ich muss noch mal mit meiner "Dummy-Ferienauswert-Prozedur" kommen.

Ich habe Dummies, die über eine Sub mit den Tagen bis zum jeweiligen FerienStart bzw. FerienEnde befüllt werden.
Nun möchte ich ein FerienStart und FerienEnde Dummy definieren, welches mir unabhängig vom Ferientyp (Sommerferien, Osterferien, etc) einen Countdown anzeigt. Also die Dummies FerienStart und FerienEnde herunterzählt. Die Zahl wird dann später über einen Sonos angesagt. Die SonosDevices sind auf einem 2.ten fhem Rechner, der per fhem2fhem gekoppelt ist.

Aber wie kann ich in meinem DOIF auf den Wert des richtigen Ferientyps (hier die "6" von e_cnt.OS.start.Ferien.dum_STATE) zugreifen um "Test" korekt zu setzten?
Oder ist der Ansatz falsch und es muss anders gelöst werden...

DEF        ([cnt.OS.start.Ferien.dum] <= 10 or
[cnt.PG.start.Ferien.dum] <= 10 or
[cnt.SO.start.Ferien.dum] <= 10 or
[cnt.HB.start.Ferien.dum] <= 10 or
[cnt.WE.start.Ferien.dum] <= 10)
({fhem "set Test (ReadingsVal("%","state",""))})
DOELSE (set Test 0)
   NAME       SchulferienStart
   NR         774
   NTFY_ORDER 50-SchulferienStart
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2015-02-03 17:26:27   cmd_event       cnt.OS.start.Ferien.dum
     2015-02-03 17:26:27   cmd_nr          1
     2015-02-03 17:26:27   e_cnt.OS.start.Ferien.dum_STATE 6
     2015-02-03 17:26:27   error           {fhem "set Test (ReadingsVal("%","state",""))}: Can't find string terminator '"' anywhere before EOF at (eval 153) line 1.

     2015-02-03 17:26:27   state           cmd_1
   Condition:
     0          InternalDoIf('cnt.OS.start.Ferien.dum','STATE','') <= 10 or  InternalDoIf('cnt.PG.start.Ferien.dum','STATE','') <= 10 or InternalDoIf('cnt.SO.start.Ferien.dum','STATE','') <= 10 or InternalDoIf('cnt.HB.start.Ferien.dum','STATE','') <= 10 or InternalDoIf('cnt.WE.start.Ferien.dum','STATE','') <= 10
   Devices:
     0           cnt.OS.start.Ferien.dum cnt.PG.start.Ferien.dum cnt.SO.start.Ferien.dum cnt.HB.start.Ferien.dum cnt.WE.start.Ferien.dum
     all         cnt.OS.start.Ferien.dum cnt.PG.start.Ferien.dum cnt.SO.start.Ferien.dum cnt.HB.start.Ferien.dum cnt.WE.start.Ferien.dum
   Do:
     0          {fhem "set Test (ReadingsVal("%","state",""))}
     1          set Test 0
   Helper:
     last_timer 0
     sleeptimer -1
   Internals:
     0           cnt.OS.start.Ferien.dum:STATE cnt.PG.start.Ferien.dum:STATE cnt.SO.start.Ferien.dum:STATE cnt.HB.start.Ferien.dum:STATE cnt.WE.start.Ferien.dum:STATE
     all         cnt.OS.start.Ferien.dum:STATE cnt.PG.start.Ferien.dum:STATE cnt.SO.start.Ferien.dum:STATE cnt.HB.start.Ferien.dum:STATE cnt.WE.start.Ferien.dum:STATE
   Readings:
   State:
   Timerfunc:
   Trigger:
Attributes:

Christian

... (set Test  [cnt.OS.start.Ferien.dum]) ...

einfacher wird es wohl nicht gehen, siehe Commandref zu DOIF "Nutzung von Readings, Stati oder Internals im Ausführungsteil"


Gruß

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

duke-f

Zitat von: dieda am 03 Februar 2015, 17:15:12
Das kann man doch einbauen. Oder verstehe ich da was falsch. Entweder du nimmst einen dynamischen Terminkalender oder einen Dummy, den du mit abfragst.

Das ist ja schon richtig, aber genau das meinte ich mit "Bin noch nicht so weit mit den Kalendern" Ich hab hier leider nicht die Zeit, mich so ausgiebig wie gewünscht mit FHEM auseinanderzusetzen. Sachlich hast Du natürlich 100%ig recht - werde das auch mal angehen. Jetzt ist es aber einfach noch schneller, wenn der entsprechende Anruf Nachmittags kommt: "Morgen ist Termin" eine Taste auf der Fernbedienung zu drücken, als diesen Termin im dynamischen Kalender einzutragen - zumal die Person, die den Kalender erstrangig betrifft eine andere ist als die, die FHEM regelt.  ;)
Cubietruck, 3 Raspberry Pis,
CUL868, RFXtrx433, CUL433, SCC868, HM-USB,
IRTrans, EZcontrol XS1, IguanaWorks USB IR Transceiver
ESPEasy, Fritz!Box, Samsung TV+BD, LMS, Squeezelite

Spartacus

Zitat von: Damian am 03 Februar 2015, 17:44:22
... (set Test  [cnt.OS.start.Ferien.dum]) ...

einfacher wird es wohl nicht gehen, siehe Commandref zu DOIF "Nutzung von Readings, Stati oder Internals im Ausführungsteil"


Gruß

Damian
Hi Damian,
danke für Deine Antwort! Deine Lösung hätte nur für die Osterferien funktioniert, aber nicht für den Rest! Allerdings hast Du mir trotzdem geholfen! Jetzt habe ich es so gelöst:
([cnt.OS.start.Ferien.dum] <= 10) (set Test  [cnt.OS.start.Ferien.dum])
DOELSEIF
([cnt.PG.start.Ferien.dum] <= 10) (set Test  [cnt.PG.start.Ferien.dum])
DOELSEIF
([cnt.SO.start.Ferien.dum] <= 10) (set Test  [cnt.SO.start.Ferien.dum])
DOELSEIF
([cnt.HB.start.Ferien.dum] <= 10) (set Test  [cnt.HB.start.Ferien.dum])
DOELSEIF
([cnt.WE.start.Ferien.dum] <= 10) (set Test  [cnt.WE.start.Ferien.dum])
DOELSE (set Test 0)


Vielleicht geht es noch einfacher, aber so funzt es auf jeden Fall!
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

knochenmuehle

habe eine offenes Fenster Warung ge doif't und dabei das Problem, dass meine Fensterkontakte 2x open melden, einmal zur vccu und einmal zum Heizkörperthermostaten.

Somit bekomme ich auch 2x auf dem Tablet die Ansage, dass noch ein Fenster auf ist. Wie kann ich das ändern ?


define di_Fenster_Bad1_offen DOIF ([MK_Bad1:state] eq "open" and [THLP:temperature] < 16)(set Tablet ttsSay "Das Fenster im Badezimmer ist noch auf.")
attr di_Fenster_Bad1_offen cmdState auf|zu
attr di_Fenster_Bad1_offen do always
attr di_Fenster_Bad1_offen room at_notify
attr di_Fenster_Bad1_offen wait 900


Gruß Andreas

Damian

Zitat von: knochenmuehle am 03 Februar 2015, 19:37:49
habe eine offenes Fenster Warung ge doif't und dabei das Problem, dass meine Fensterkontakte 2x open melden, einmal zur vccu und einmal zum Heizkörperthermostaten.

Somit bekomme ich auch 2x auf dem Tablet die Ansage, dass noch ein Fenster auf ist. Wie kann ich das ändern ?


define di_Fenster_Bad1_offen DOIF ([MK_Bad1:state] eq "open" and [THLP:temperature] < 16)(set Tablet ttsSay "Das Fenster im Badezimmer ist noch auf.")
attr di_Fenster_Bad1_offen cmdState auf|zu
attr di_Fenster_Bad1_offen do always
attr di_Fenster_Bad1_offen room at_notify
attr di_Fenster_Bad1_offen wait 900


Gruß Andreas

mit Fragezeichen, wenn Temperaturabfrage nicht triggern soll:

define di_Fenster_Bad1_offen DOIF ([MK_Bad1:state] eq "open" and [?THLP:temperature] < 16)(set Tablet ttsSay "Das Fenster im Badezimmer ist noch auf.")...


Gruß

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

knochenmuehle

ne, der Fensterkontakt (Homematic) sendet 2x, einmal zur vccu und einmal zum Heizkörperthermostat

Gruß Andreas

Damian

Zitat von: knochenmuehle am 03 Februar 2015, 20:05:43
ne, der Fensterkontakt (Homematic) sendet 2x, einmal zur vccu und einmal zum Heizkörperthermostat

Gruß Andreas

Innerhalb welcher Zeit?

Wenn es innerhalb von 900 Sekunden ist, dann ist das lt. deiner Definition egal.

Gruß

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

knochenmuehle

es kommt 2x sofort nacheinander, hatte ohne wait gestetet.
mit nem ? bei der Temp. klappts jetzt.
als Trigger nehme ich jetzt auch das Fenster_auf reading des Thermostaten

damit funktioniert das ganze jetzt aber nur wenn sich die Temp innerhalb der 900 sek nicht ändert, oder ?


([RT_BZ_1_WindowRec:trig_MK_Bad1] eq "open" and [?THLP:temperature] < 16)(set Tablet ttsSay "Das Fenster im Badezimmer ist noch auf.")


A.