[GELÖST]Fenster offen -> Heizung schalten

Begonnen von Tabularasa, 06 Januar 2018, 12:11:52

Vorheriges Thema - Nächstes Thema

Tabularasa

Hallo. Habe folgendes DOIF
Internals:
   CFGFN     
   DEF        ([Fenster_EG_Bad] eq "open") (set HZG_EG_Bad_Clima:FILTER=desired-temp!=5.0 desired-temp 5) DOELSEIF
([Fenster_EG_Kueche] eq "open") (set HZG_EG_EZ_Clima:FILTER=desired-temp!=5.0 desired-temp 5) DOELSEIF
([Fenster_OG_Bad] eq "open") (set HZG_OG_Bad_Clima:FILTER=desired-temp!=5.0 desired-temp 5) DOELSEIF
([Fenster_OG_Nora] eq "open") (set HZG_OG_Nora_Clima:FILTER=desired-temp!=5.0 desired-temp 5) DOELSEIF
([Fenster_OG_SZ_r] eq "open") (set HZG_OG_SZ_r_Clima:FILTER=desired-temp!=5.0 desired-temp 5)
DOELSE (set li_HZG scene [li_HZG])
   NAME       di_Fensteroffen_HZG
   NR         10648
   NTFY_ORDER 50-di_test
   STATE      disabled
   TYPE       DOIF
   READINGS:
     2018-01-06 11:24:08   Device          Fenster_EG_Bad
     2018-01-06 11:23:12   cmd             6
     2018-01-06 11:23:12   cmd_event       Fenster_EG_Kueche
     2018-01-06 11:23:12   cmd_nr          6
     2018-01-06 11:24:08   e_Fenster_EG_Bad_STATE closed
     2018-01-06 11:23:12   e_Fenster_EG_Kueche_STATE closed
     2018-01-06 11:26:12   last_cmd        cmd_6
     2018-01-06 11:26:12   mode            disabled
     2018-01-06 11:26:12   state           disabled
     2018-01-06 11:20:07   wait_timer      no timer
   Regex:
   condition:
     0          InternalDoIf($hash,'Fenster_EG_Bad','STATE') eq "open"
     1          InternalDoIf($hash,'Fenster_EG_Kueche','STATE') eq "open"
     2          InternalDoIf($hash,'Fenster_OG_Bad','STATE') eq "open"
     3          InternalDoIf($hash,'Fenster_OG_Nora','STATE') eq "open"
     4          InternalDoIf($hash,'Fenster_OG_SZ_r','STATE') eq "open"
   devices:
     0           Fenster_EG_Bad
     1           Fenster_EG_Kueche
     2           Fenster_OG_Bad
     3           Fenster_OG_Nora
     4           Fenster_OG_SZ_r
     all         Fenster_EG_Bad Fenster_EG_Kueche Fenster_OG_Bad Fenster_OG_Nora Fenster_OG_SZ_r
   do:
     0:
       0          set HZG_EG_Bad_Clima:FILTER=desired-temp!=5.0 desired-temp 5
     1:
       0          set HZG_EG_EZ_Clima:FILTER=desired-temp!=5.0 desired-temp 5
     2:
       0          set HZG_OG_Bad_Clima:FILTER=desired-temp!=5.0 desired-temp 5
     3:
       0          set HZG_OG_Nora_Clima:FILTER=desired-temp!=5.0 desired-temp 5
     4:
       0          set HZG_OG_SZ_r_Clima:FILTER=desired-temp!=5.0 desired-temp 5
     5:
       0          set li_HZG scene [li_HZG]
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      closed
     globalinit 1
     last_timer 0
     sleepdevice Fenster_EG_Bad
     sleepsubtimer -1
     sleeptimer -1
     timerdev   Fenster_EG_Bad
     timerevent closed
     triggerDev Fenster_EG_Bad
     timerevents:
       closed
     timereventsState:
       state: closed
     triggerEvents:
       closed
     triggerEventsState:
       state: closed
   internals:
     0           Fenster_EG_Bad:STATE
     1           Fenster_EG_Kueche:STATE
     2           Fenster_OG_Bad:STATE
     3           Fenster_OG_Nora:STATE
     4           Fenster_OG_SZ_r:STATE
     all         Fenster_EG_Bad:STATE Fenster_EG_Kueche:STATE Fenster_OG_Bad:STATE Fenster_OG_Nora:STATE Fenster_OG_SZ_r:STATE
   itimer:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   room       DOIF
   wait       70:70:70:70:70:0


Eigentlich soll beim Fenster öffnen einfach nur die jeweilige Heizung um 70 Sekunden verzögert auf 5°C eingestellt werden und beim Fenster schließen der aktuelle Status der Lightscene der Thermostate wieder hergestellt werden. Durch das wait kann ich aber nicht 2 Fenster innerhalb unter 70 Sekunden öffnen, da ja sonst der nächste Zweig war wird. Habe auch schon laut commandref versucht die "Verzögerte "Fenster offen"-Meldung" mit der "Rollladen auf Lüften stellen" Anleitung zu kombinieren(kopieren), was aber auch keinen Erfolg gebracht hat(was vielleicht daran liegt, dass ich es einfach nicht kapiere  :-\). Sieht im Moment so aus
Internals:
   CFGFN     
   DEF        (["^Fenster_:open"]) (defmod at_$DEVICE at +00:60 set {("$DEVICE"=~/^Fenster_(.*)/;"HZG_$1")} desired-temp 5) DOELSEIF (["^Fenster_:closed"]) (delete at_$DEVICE)
   NAME       di_window_open
   NR         11364
   NTFY_ORDER 50-di_window_open
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2018-01-06 11:51:20   cmd             0
     2018-01-06 11:51:20   mode            enabled
     2018-01-06 11:51:20   state           initialized
     2018-01-06 11:51:27   warning         condition c02: Use of uninitialized value $dev in pattern match (m//) at ./FHEM/98_DOIF.pm line 885.

   Regex:
     cond:
       :
         0:
           "^Fenster_:open" ^Fenster_:open
         1:
           "^Fenster_:closed" ^Fenster_:closed
   condition:
     0          EventDoIf('^Fenster_',$hash,'open',0)
     1          EventDoIf('^Fenster_',$hash,'closed',0)
   devices:
   do:
     0:
       0          defmod at_$DEVICE at +00:60 set {("$DEVICE"=~/^Fenster_(.*)/;"HZG_$1")} desired-temp 5
     1:
       0          delete at_$DEVICE
     2:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     globalinit 1
     last_timer 0
     sleeptimer -1
   internals:
   itimer:
   readings:
   uiState:
   uiTable:
Attributes:


Also eigentlich soll nur funktionieren:
Fenster auf-> die entsprechende Heizung auf 5°, Fenster zu -> die entsprechende Heizung auf den gerade aktuellen State der Lightscene.

Ich hoffe ich konnte es einigermaßen beschreiben, danke

guhu

Hallo, überblick das jetzt nicht im Detail, aber der natürliche Weg wäre doch für jedes Fenster/Heizungspaar ein eigenes DOIF zu spendieren.

Bzw. die intrinsischen Funktionen des Thermostats zu nutzen, so habe ich es. Funktioniert dann auch ohne FHEM.
FHEM 5.9 auf Synology DS918+ (in Docker), HM-CFG-USB2 mit hmlan, HM-CC-RT-DN, HM-SEC-SC-2, nanoCUL,a-culfw,deCONZ,Brennenstuhl-Steckdosen,-FB
Module:ENIGMA2,SONOS,FRITZBOX,FB_CALLLIST,WDT_TIMER,VCONTROL300,WITHINGS

Tabularasa

Ja das wäre mir aber wahrscheinlich zu unübersichtlich wenn ich dann soviele einzelne Doifs hätte. Am liebsten wäre mir es nach der 2. Variante die ich gepostet hatte, dann brauche ich bei neuen Komponenten nichts warten. Aber da sind mir, um es allein zu schaffen, zu viele Unklarheiten. Ich verwende eigentlich nur Doifs, weil mir das als Anfänger leichter vorkommt. Schon das bisschen Perl wie das im Doif bringt mich zum verzweifeln ::) {("$DEVICE"=~/^Fenster_(.*)/;"HZG_$1")}

Gepeert habe ich allerdings nichts bei mir, läuft alles über FHEM

Per

Du kannst entweder pro Device ein DOIF nehmen, mit automatisch erstellten at arbeiten oder, wenn die Geräte es können, sowas wie on-for-timer nehmen.

Damian

#4
Du musst dich an die Probleme herantasten.

Was passiert z. B. beim Fenster öffnen? Wird at gesetzt? Wenn nicht, gibt es eine Fehlermeldung? usw.

Ohne genaue Angaben wird dir hier keiner helfen können.

Edit: Beim generalisierten DOIF musst du zumindest das Attribut do always setzen
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tabularasa

@Per: Ich würde es gern mal mit einem generalisiertem Doif probieren.

Zitat von: Damian am 06 Januar 2018, 19:43:32
Du musst dich an die Probleme herantasten.

Was passiert z. B. beim Fenster öffnen? Wird at gesetzt? Wenn nicht, gibt es eine Fehlermeldung? usw.

So habe jetzt zum testen mal 2 dummys erstellt. Hoffe es ist die richtige Herangehensweise um mich an die Probleme heranzutasten.
Internals:
   CFGFN     
   NAME       DU_Fenster
   NR         3023
   STATE      open
   TYPE       dummy
   READINGS:
     2018-01-06 22:34:08   state           open
Attributes:
   webCmd     open:closed

Internals:
   CFGFN     
   NAME       DU_HZG_Clima
   NR         3057
   STATE      desired-temp 2
   TYPE       dummy
   READINGS:
     2018-01-06 22:25:31   state           desired-temp 2
Attributes:
   webCmd     desired-temp 1:desired-temp 2

so sieht das doif aus mit tatsächlich einem Fehler und at wird anscheinend nicht gesetzt...
Internals:
   DEF        (["^DU_Fenster:open"]) (defmod at_$DEVICE at +00:60 set {("$DEVICE"=~/^DU_Fenster(.*)/;"DU_HZG$1")} desired-temp 1) DOELSEIF (["^DU_Fenster_:closed"]) (delete at_$DEVICE)
   NAME       di_window_open
   NR         222
   NTFY_ORDER 50-di_window_open
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2018-01-06 22:34:08   Device          DU_Fenster
     2018-01-06 22:34:08   cmd             1
     2018-01-06 22:34:08   cmd_event       DU_Fenster
     2018-01-06 22:34:08   cmd_nr          1
     2018-01-06 22:34:08   error           defmod at_DU_Fenster at +00:60 set DU_HZG desired-temp 1: Wrong timespec 00:60: either HH:MM:SS or {perlcode}
     2018-01-06 22:25:17   mode            enabled
     2018-01-06 22:34:08   state           cmd_1
   Regex:
     cond:
       :
         0:
           "^DU_Fenster:open" ^DU_Fenster:open
         1:
           "^DU_Fenster_:closed" ^DU_Fenster_:closed
   condition:
     0          EventDoIf('^DU_Fenster',$hash,'open',0)
     1          EventDoIf('^DU_Fenster_',$hash,'closed',0)
   devices:
   do:
     0:
       0          defmod at_$DEVICE at +00:60 set {("$DEVICE"=~/^DU_Fenster(.*)/;"DU_HZG$1")} desired-temp 1
     1:
       0          delete at_$DEVICE
     2:
   helper:
     DOIF_Readings_events
     event      open
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   DU_Fenster
     timerevent open
     triggerDev DU_Fenster
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: DU_Fenster
       error: defmod at_DU_Fenster at +00:60 set DU_HZG desired-temp 1: Wrong timespec 00:60: either HH:MM:SS or {perlcode}
       state: cmd_1
     timerevents:
       open
     timereventsState:
       state: open
     triggerEvents:
       open
     triggerEventsState:
       state: open
   internals:
   itimer:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always

Damian

Das ist die richtige Vorgehensweise, jetzt weißt du wenigsten, wo der Fehler ist - 60 Minuten wirst du auf keiner digitalen Uhr zu sehen bekommen ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tabularasa

oh neiiin ;D

Schalten tut der HZG dummy leider nicht. Wie muss ich denn den Part
set {("$DEVICE"=~/^DU_Fenster(.*)/;"DU_HZG$1")} desired-temp 1)ändern, damit sich das passende Thermostat ändert?

Zur Info wie meine Devices heißen bitte nochmal im ersten Post gucken.

Wenn ich das laut commandref richtig verstehe, müsste ich ja die gleiche Endung an den Devices der Heizung haben
ZitatRollladen auf Lüften stellen

define di_air DOIF (["^window_contact_:open|tilted"]) (set {("$DEVICE"=~/^window_contact_(.*)/;"shutters_$1")} 10)

attr di_air do always

Hier werden alle Fensterkontakte, die mit dem Device-Namen "window_contact_" beginnen auf "open" oder "tilted" im Event überwacht und der entsprechende Rollladen mit der gleichen Endung auf Lüften per set shutters_<postfix> 10 gestellt.


Damian

Wie der Schaltbefehl lautet sieht du hier:

defmod at_DU_Fenster at +00:60 set DU_HZG desired-temp 1: Wrong timespec 00:60: either HH:MM:SS or {perlcode}

da das Fenster

     2018-01-06 22:34:08   Device          DU_Fenster

im Test keine Endung hat, gibt es keine Endung hinter DU_HZG.

Es funktioniert alles wie definiert. Wie die korrekte Syntax für deine Thermostate ist, kann ich dir nicht sagen.


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

Tabularasa

Also die normalen Fenster und Thermostate heißen:
Fenster_EG_Bad           HZG_EG_Bad_Clima
Fenster_OG_Bad           HZG_OG_Bad_Clima
Fenster_OG_Nora         HZG_OG_Nora_Clima
Fenster_OG_SZ_r         HZG_OG_SZ_r_Clima

Kann man denn den Code so ändern, dass nach dem Mittelteil gesucht wird und nicht nach der Endung?


Damian

Zitat von: Tabularasa am 06 Januar 2018, 23:53:53
Also die normalen Fenster und Thermostate heißen:
Fenster_EG_Bad           HZG_EG_Bad_Clima
Fenster_OG_Bad           HZG_OG_Bad_Clima
Fenster_OG_Nora         HZG_OG_Nora_Clima
Fenster_OG_SZ_r         HZG_OG_SZ_r_Clima

Kann man denn den Code so ändern, dass nach dem Mittelteil gesucht wird und nicht nach der Endung?

ja, dann musst du noch _Clima dran hängen {("$DEVICE"=~/^Fenster_(.*)/;"HZG_$1_Clima")}

dass $1 die Endung des triggernden Devices ist, hast du dir bestimmt schon gedacht ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tabularasa

Zitat von: Damian am 06 Januar 2018, 23:59:05
dass $1 die Endung des triggernden Devices ist, hast du dir bestimmt schon gedacht ;)
Ich sag mal so, ehrlich gesagt... Nein ::) Bin jetzt seit 2 Jahren dabei und hab gedacht ich raffs irgendwann aber leider gibt viel zu viel zu lernen. Aber dank der Community und des DOIFs  ;) konnte ich schon vieles umsetzen. Danke

Jedoch klappt das gerade noch nicht. Habe jetzt nochmal 2 dummys erstellt um die Thermostate nicht zu belasten.

Also habe jetzt:
DU_Fenster_EG_EZ       DU_HZG_EG_EZ_Clima
DU_Fenster_EG_WZ      DU_HZG_EG_WZ_Clima

und(["^DU_Fenster:open"]) (defmod at_$DEVICE at +00:00:05 set {("$DEVICE"=~/^DU_Fenster(.*)/;"DU_HZG_$1_Clima")} desired-temp 1) probiert. Da passiert leider nix. Hab zum testen einfach mal
(["^DU_Fenster:open"]) (defmod at_$DEVICE at +00:00:05 set {("$DEVICE"=~/^DU_Fenster(.*)/;"[b]DU_HZG_(.*)[/b]")} desired-temp 1) probiert. Da schalten dann beide auf desired-temp 1.
Wo habe ich den Fehler?

Damian

Zitat von: Tabularasa am 07 Januar 2018, 00:55:15
und(["^DU_Fenster:open"]) (defmod at_$DEVICE at +00:00:05 set {("$DEVICE"=~/^DU_Fenster(.*)/;"DU_HZG_$1_Clima")} desired-temp 1) probiert. Da passiert leider nix. Hab zum testen einfach mal

Auch hier wieder: Wie sieht das definierte at aus? Gibt es Fehlermeldungen im Log. Evtl. länger Zeit angeben z. B. +00:05 um genügend Zeit zum Nachschauen haben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tabularasa

#13
Also hier das at. Sieht nach einem doppelten Unterstrich aus.
Internals:
   CFGFN     
   COMMAND    set DU_HZG__EG_EZ_Clima desired-temp 1
   DEF        2018-01-07T11:22:33 set DU_HZG__EG_EZ_Clima desired-temp 1
   NAME       at_DU_Fenster_EG_EZ
   NR         7030
   NTM        11:22:33
   PERIODIC   no
   RELATIVE   yes
   STATE      Next: 11:22:33
   TIMESPEC   00:02:05
   TRIGGERTIME 1515320553.43033
   TRIGGERTIME_FMT 2018-01-07 11:22:33
   TYPE       at
   VOLATILE   1
   READINGS:
     2018-01-07 11:20:28   state           Next: 11:22:33
Attributes:


Habe mal nach HZG den Unterstrich weg gemacht. Dann geht es :)
{("$DEVICE"=~/^DU_Fenster(.*)/;"DU_HZG$1_Clima")}
Danke dir!


edit: den
error delete at_DU_Fenster_EG_EZ: Please define at_DU_Fenster_EG_EZ first
werde ich immer haben wenn die Zeit um ist oder?

Damian

So langsam wird es ;)
Hättest du meinen Vorschlag komplett übernommen (Unterstrich hinter Fenster) hätte es auch funktioniert:

Zitatja, dann musst du noch _Clima dran hängen {("$DEVICE"=~/^Fenster_(.*)/;"HZG_$1_Clima")}

Ich würde persönlich statt at, benannten sleep nehmen, wie hier als Alternative zu at dargestellt https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events.

Damit hättest du keine Meldungen im DOELSEIF-Fall.



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