Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

Zephyr

75 Seiten? Na wenn sich hier jemals wieder eine Lösung anfindet... :-/

Hallo,

ich habe mit einem EnOcean Schalter (PTM 210) in Verbindung mit DOIF ein Problem. Es scheint so auszusehen als würde jedes Mal wenn der Schalter insgesamt irgendeinen Event generiert das DOIF komplett ausgeführt inklusive dem kompletten Neulesen aller Zustände. Das Funktionsprinzip beim EnOcean Schalter ist, dass beim Drücken des Schalters in FHEM ein Event erzeugt wird und beim Loslassen des Schalters. Das Einzige Reading, das sich ändert ist das Reading "buttons:pressed|released". Meine DOIF Konstruktion prüft nun schon ob die Schalter auch wirklich gedrückt wurden. Trotzdem werden zwei Befehle direkt nacheinander ausgeführt.
Mein DOIF sieht so aus:
([wz_licht_stehlampe_schreibtischlampe_sw_01:channelB] eq "BI" and [wz_licht_schreibtisch_ac_01:pct] eq 0 and [wz_licht_stehlampe_schreibtischlampe_sw_01:buttons] eq "pressed") (set wz_licht_schreibtisch_ac_01 pct 50)
        DOELSEIF ([wz_licht_stehlampe_schreibtischlampe_sw_01:channelB] eq "BI" and [wz_licht_schreibtisch_ac_01:pct] ne 0 and [wz_licht_stehlampe_schreibtischlampe_sw_01:buttons] eq "pressed") (set wz_licht_schreibtisch_ac_01 pct 100)
        DOELSEIF ([wz_licht_stehlampe_schreibtischlampe_sw_01:channelB] eq "B0" and [wz_licht_schreibtisch_ac_01:pct] ne 0 and [wz_licht_stehlampe_schreibtischlampe_sw_01:buttons] eq "pressed") (set wz_licht_schreibtisch_ac_01 pct 0)


Und im Eventmonitor passiert folgendes, wenn ich die Taste "BI" drücke und die Lampe vorher ausgeschalten war:
2015-01-15 20:13:43 DOIF di_wz_licht_stehlampe_schreibtischlampe_sw_01 cmd_nr: 2
2015-01-15 20:13:43 DOIF di_wz_licht_stehlampe_schreibtischlampe_sw_01 cmd_event: wz_licht_schreibtisch_ac_01
2015-01-15 20:13:43 DOIF di_wz_licht_stehlampe_schreibtischlampe_sw_01 cmd_2
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 bri: 128
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 onoff: 1
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 pct: 50
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 dim50%
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 bri: 254
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 pct: 100
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 on
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 rgb: 000000
2015-01-15 20:13:43 HUEDevice wz_licht_schreibtisch_ac_01 rgb: 000000
2015-01-15 20:13:43 DOIF di_wz_licht_stehlampe_schreibtischlampe_sw_01 cmd_nr: 1
2015-01-15 20:13:43 DOIF di_wz_licht_stehlampe_schreibtischlampe_sw_01 cmd_event: wz_licht_stehlampe_schreibtischlampe_sw_01
2015-01-15 20:13:43 DOIF di_wz_licht_stehlampe_schreibtischlampe_sw_01 cmd_1
2015-01-15 20:13:43 EnOcean wz_licht_stehlampe_schreibtischlampe_sw_01 buttons: pressed
2015-01-15 20:13:43 EnOcean wz_licht_stehlampe_schreibtischlampe_sw_01 channelB: BI
2015-01-15 20:13:43 EnOcean wz_licht_stehlampe_schreibtischlampe_sw_01 BI
2015-01-15 20:13:43 EnOcean wz_licht_stehlampe_schreibtischlampe_sw_01 buttons: released
2015-01-15 20:13:43 EnOcean wz_licht_stehlampe_schreibtischlampe_sw_01 buttons: released


Wie man sehen kann wird kurz hintereinander Command 1 und dann 2 ausgeführt. Das Resultat ist, dass zuerst die Lampe auf 50% und dann auch 100% gedimmt wird. Das wollte ich nun eigentlich nicht. :-/

Meine defines für die Geräte sehen so aus:

define wz_licht_stehlampe_schreibtischlampe_sw_01 EnOcean 002A7176
attr wz_licht_stehlampe_schreibtischlampe_sw_01 IODev TCM310
attr wz_licht_stehlampe_schreibtischlampe_sw_01 room EnOcean,Wohnzimmer
attr wz_licht_stehlampe_schreibtischlampe_sw_01 subType switch

define wz_licht_schreibtisch_ac_01 HUEDevice 1
attr wz_licht_schreibtisch_ac_01 userattr lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0
attr wz_licht_schreibtisch_ac_01 IODev huebridge_orpheus
attr wz_licht_schreibtisch_ac_01 alias Schreibtisch

define di_wz_licht_stehlampe_schreibtischlampe_sw_01 DOIF ([wz_licht_stehlampe_schreibtischlampe_sw_01:state] eq "BI" and [wz_licht_schreibtisch_ac_01:pct] eq 0) (set wz_licht_schreibtisch_ac_01 pct 50)\
        DOELSEIF ([wz_licht_stehlampe_schreibtischlampe_sw_01:state] eq "BI" and [wz_licht_schreibtisch_ac_01:pct] ne 0) (set wz_licht_schreibtisch_ac_01 pct 100)\
        DOELSEIF ([wz_licht_stehlampe_schreibtischlampe_sw_01:state] eq "B0" and [wz_licht_schreibtisch_ac_01:pct] ne 0) (set wz_licht_schreibtisch_ac_01 pct 0)
attr di_wz_licht_stehlampe_schreibtischlampe_sw_01 room EnOcean,Wohnzimmer


Hat von euch einer eine Lösung dafür parat?

Viele Grüße
Zephyr
FHEM 5.5 auf Fritz!Box 7390 und Beagle Bone black mit RFXtrx433

Damian

Zitat von: Zephyr am 15 Januar 2015, 20:18:18
75 Seiten? Na wenn sich hier jemals wieder eine Lösung anfindet... :-/

Na ja, ob du in einem Thread mit Tausend Antworten suchst oder in zweihundert mit fünf Antworten macht für die Suchfunktion keinen Unterschied. Bei diesem Thread hier werde ich allerdings angetriggert, bei zweihundert anderen aber nicht. Daher kann ich dir nun recht schnell helfen.

Lösung deines Problems sollte recht einfach sein. Durch das Schalten des Lichtest triggerst du dein Modul selbst. Daher solltest du deine Abfrage für den Lichtstatus mit Fragezeichen beginnen, damit dein Modul nicht erneut getriggert wird (das ist in der commandref des Moduls auch erklärt). Eigentlich reicht der trigger für "buttons", alles andere sind reine Abfragen. Also:

([?wz_licht_stehlampe_schreibtischlampe_sw_01:channelB] eq "BI" and [?wz_licht_schreibtisch_ac_01:pct] eq 0 and [wz_licht_stehlampe_schreibtischlampe_sw_01:buttons] eq "pressed") (set wz_licht_schreibtisch_ac_01 pct 50)
        DOELSEIF ([?wz_licht_stehlampe_schreibtischlampe_sw_01:channelB] eq "BI" and [?wz_licht_schreibtisch_ac_01:pct] ne 0 and [wz_licht_stehlampe_schreibtischlampe_sw_01:buttons] eq "pressed") (set wz_licht_schreibtisch_ac_01 pct 100)
        DOELSEIF ([?wz_licht_stehlampe_schreibtischlampe_sw_01:channelB] eq "B0" and [?wz_licht_schreibtisch_ac_01:pct] ne 0 and [wz_licht_stehlampe_schreibtischlampe_sw_01:buttons] eq "pressed") (set wz_licht_schreibtisch_ac_01 pct 0)


Gruß

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

Damian

Zitat von: Spartacus am 15 Januar 2015, 20:12:04
Hallo,
ich möchte hier erreichen, dass outdoorlight immer mindestens 30min eingeschaltet wird, bzw. nicht einschaltet, wenn zwischen Sonnenuntergang und fixer Abschaltzeit weniger als 30min liegen.

(
[{sunset_abs("HORIZON=-2",0,"16:30","21:30")}-22:30|56] or
[{sunset_abs("HORIZON=-2",0,"16:30","21:30")}-22:30] and [?hl.01.Feiertag:tomorrow] ne "none" or
[{sunset_abs("HORIZON=-2",0,"16:30","21:00")}-21:30|01234] and [?hl.01.Feiertag:tomorrow] eq "none" or
[{sunset_abs("HORIZON=-2",0,"16:30","21:30")}-02:00] and [?hl.01.Feiertag] eq "Silvester")
(set outdoorlight on)
DOELSE (set outdoorlight off)


Das funktioniert so halbwegs mit diesem Code, hat aber einen Haken. Im Sommer ist es um 21:30 teilweise noch zu hell für eine Gartenbeleuchtung und es macht eigentlich keinen Sinn das Licht einzuschalten; hier wird aber spätestens um 21:30 bzw. 21:00 eingeschaltet, egal wie dunkel es ist. Da die Abschaltzeit immer fix sein soll, kann ich nicht mit "wait" arbeiten; geht bei Zeiten m.E. sowieso nicht.

Wichtig ist, dass ich aber eine Mindestbrenndauer erreichen will, die von der Ausschaltzeit abzuziehen ist. Der Trigger zum Einschalten kommt dann, wenn "Ausschaltzeit"-"Mindestbrenndauer"<= "Sonnenuntergang(dunkel)" ist.

Hat jemand eine Idee, wie man das am Besten umsetzt?
Christian
Da man mit Zeitangaben der Form HH:MM schlecht rechnen kann, muss man es immer wieder umrechnen, um eine Minutendifferenz zu bilden, um damit schlussendlich den tatsächlichen Einschalt und Ausschaltzeitpunkt zu definieren. Das würde ich in Perl-Routinen auslagern, die man dann mit [{begin}-{end}] in der Bedingung angeben kann. Alles andere dürfte in der Bedingung von DOIF recht unübersichtlich werden.

Gruß

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

Ironangel

Hallo Damian,

ich habe auch ein Problem mit DOIF. Ist wahrscheinlich ein Anfängerproblem und deshalb war ich auch im Anfängerforum aber da schreibe ich nur mit mir selbst. Ich möchte mein Problem gerne hier schildern.

Ich habe meinen Netatmo im FHEM integriert. Jetzt möchte ich, dass bei überschreiten des Co2 Wertes von 1300 eine Lampe anggeht (WifiLight). und diese erst wieder ausgeht, wenn der Wert 800 erreicht hat. Ich komme aber nicht klar. Mein Code funktioniert nicht und ich komme als Anfänger trotz Lesen der Referenz nicht dahinter. Kannst Du mir auf die Sprünge helfen? Anbei mein Code:


([netatmo_indoor:co2]>"1300") (set LED_CO_Warnung on) DOELSEIF ([netatmo_indoor:co2]<"800") (set LED_CO_Warnung off) DOELSE (set LED_Mediteran on)


VG,
Jörg

Damian

Zitat von: Ironangel am 15 Januar 2015, 22:15:09
Hallo Damian,

ich habe auch ein Problem mit DOIF. Ist wahrscheinlich ein Anfängerproblem und deshalb war ich auch im Anfängerforum aber da schreibe ich nur mit mir selbst. Ich möchte mein Problem gerne hier schildern.

Ich habe meinen Netatmo im FHEM integriert. Jetzt möchte ich, dass bei überschreiten des Co2 Wertes von 1300 eine Lampe anggeht (WifiLight). und diese erst wieder ausgeht, wenn der Wert 800 erreicht hat. Ich komme aber nicht klar. Mein Code funktioniert nicht und ich komme als Anfänger trotz Lesen der Referenz nicht dahinter. Kannst Du mir auf die Sprünge helfen? Anbei mein Code:


([netatmo_indoor:co2]>"1300") (set LED_CO_Warnung on) DOELSEIF ([netatmo_indoor:co2]<"800") (set LED_CO_Warnung off) DOELSE (set LED_Mediteran on)


VG,
Jörg

Dann poste hier das Ergebnis von: list dein_doif_modul.

Gruß

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

Ironangel

Das?


Internals:
   DEF        ([netatmo_cojones_indoor:co2] > "1300") (set LED_CO_Warnung on) DOELSE (set LED_Mediteran on)
   NAME       netatmo
   NR         35
   NTFY_ORDER 50-netatmo
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2015-01-15 22:07:55   cmd_event       netatmo_cojones_indoor
     2015-01-15 22:07:55   cmd_nr          2
     2015-01-15 22:27:56   e_netatmo_cojones_indoor_co2 837
     2015-01-15 22:07:55   state           cmd_2
   Condition:
     0          ReadingValDoIf('netatmo_cojones_indoor','co2','') > "1300"
   Devices:
     0           netatmo_cojones_indoor
     all         netatmo_cojones_indoor
   Do:
     0          set LED_CO_Warnung on
     1          set LED_Mediteran on
   Helper:
     last_timer 0
     sleeptimer -1
   Internals:
   Readings:
     0           netatmo_cojones_indoor:co2
     all         netatmo_cojones_indoor:co2
   State:
   Timerfunc:
Attributes:
   room       Home

Damian

Zitat von: Ironangel am 15 Januar 2015, 22:30:41
Das?


Internals:
   DEF        ([netatmo_cojones_indoor:co2] > "1300") (set LED_CO_Warnung on) DOELSE (set LED_Mediteran on)
   NAME       netatmo
   NR         35
   NTFY_ORDER 50-netatmo
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2015-01-15 22:07:55   cmd_event       netatmo_cojones_indoor
     2015-01-15 22:07:55   cmd_nr          2
     2015-01-15 22:27:56   e_netatmo_cojones_indoor_co2 837
     2015-01-15 22:07:55   state           cmd_2
   Condition:
     0          ReadingValDoIf('netatmo_cojones_indoor','co2','') > "1300"
   Devices:
     0           netatmo_cojones_indoor
     all         netatmo_cojones_indoor
   Do:
     0          set LED_CO_Warnung on
     1          set LED_Mediteran on
   Helper:
     last_timer 0
     sleeptimer -1
   Internals:
   Readings:
     0           netatmo_cojones_indoor:co2
     all         netatmo_cojones_indoor:co2
   State:
   Timerfunc:
Attributes:
   room       Home


Bei:

([netatmo_cojones_indoor:co2] > "1300") (set LED_CO_Warnung on) DOELSE (set LED_Mediteran on)

und

e_netatmo_cojones_indoor_co2 837

ist der Zustand

state           cmd_2


funktioniert also, wie programmiert.

Gruß

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

Ironangel

#1147
Ja, aber nicht wie gewollt.

Ich möchte das die Lampe bei >1300 angeht und erst wieder ausgeht wenn der Wert <800 erreicht und dann erst wieder bei >1300 usw.... Also die Lampe soll anbleiben bei 1300 - 800 aber nicht schon bei 800 wieder angehen.

Damian

Zitat von: Ironangel am 15 Januar 2015, 22:36:22
Ja, aber nicht wie gewollt.

Ich möchte das die Lampe bei >1300 angeht und erst wieder ausgeht wenn der Wert <800 erreicht und dann erst wieder bei >1300 usw....

Das hast du aber, wie du sieht, nicht definiert. Wo soll die 800 sein? Wo soll der Ausschaltbefehl sein?

Du hast doch nur:

([netatmo_cojones_indoor:co2] > "1300") (set LED_CO_Warnung on) DOELSE (set LED_Mediteran on)

definiert. Und nicht das, was du am Anfang gepostet hast.

Gruß

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

Ironangel

Jo, ich weiss halt nicht wie ich den Bereich von 1300 - 800 definieren soll. Wenn ich


([netatmo_indoor:co2]>"1300") (set LED_CO_Warnung on) DOELSEIF ([netatmo_indoor:co2]<"800") (set LED_CO_Warnung off) DOELSE (set LED_Mediteran on)


schreibe, klappt es nicht.

Damian

Zitat von: Ironangel am 15 Januar 2015, 22:45:24
Jo, ich weiss halt nicht wie ich den Bereich von 1300 - 800 definieren soll. Wenn ich


([netatmo_indoor:co2]>"1300") (set LED_CO_Warnung on) DOELSEIF ([netatmo_indoor:co2]<"800") (set LED_CO_Warnung off) DOELSE (set LED_Mediteran on)


schreibe, klappt es nicht.

Das kannst du so machen.

Und wenn es nicht so funktionieren sollte, wie du denkst, dann musst du mir genau diesen Fall präsentieren und nicht irgendeinen anderen.

Gruß

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

Ironangel

Hatte vorhin den falschen Code im Zwischenspeicher. Dieser Code definiert mir den Bereich von 1300 - 800?

Ironangel

Ich habe nochmal eine Frage. Wie bekomme ich hier (Stelle im Code mit Sternchen gekennzeichnet):

([netatmo_cojones_indoor:co2]>"1250") (set LED_Mediteran off,set LED_CO_Warnung on) DOELSEIF ([netatmo_cojones_indoor:co2]<"800") (set LED_CO_Warnung off,******set LED_Mediteran on) DOELSEIF ([16:00-23:59]) (set LED_Mediteran on) DOELSE (set LED_Mediteran off)

eine Zeitsteuerung (16:00 - 23:59) rein die nur für

set LED_Mediteran on)

gelten soll und nicht für den Befehl davor

(set LED_CO_Warnung off,

Bennemannc

Hallo,

ich würde das da raus nehmen und in dem DOELSEIF dahinter die erste Bedingung mit "und" dazu fügen.
Deine Abfrage macht so keinen Sinn, das das Licht ohnehin immer zwischen den angegebenen Zeiten an ein würde - egal ob CO2 ok oder nicht.

Gruß Christoph
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

Ironangel

Hallo Christoph,

danke für Deine Antwort. Das verstehe ich nicht. Ich möchte ja erreichen, wenn der Wert unter 800 fällt, die Warnung ausgeschaltet wird und die mediterane Beleuchtung ein aber nur, wenn die Zeit passt. Wenn ich Deinen Vorschlag umsetze, macht fhem dann nicht bei erreichen der ersten wahren Bedingung schluss?