Mit einem potentialfreien Schaltkontakt vom PIFACE will ich die Heizung ein- und ausschalten.
...
define Heizung PIFACE
attr Heizung devStateIcon 0 1:Heizung_Hauptschalter.on 0 0:Heizung_Hauptschalter.off
attr Heizung eventMap /0 0:aus/0 1:an/
attr Heizung group Heizung
attr Heizung icon Shutdown
attr Heizung room Wohnzimmer
attr Heizung webCmd aus:an
...
Die Icons Heizung_Hauptschalter.on/.off tauchen leider nicht auf - da ist schon mein erster Fehler. Mit 'set Heizung 0 1' kann ich das Relais0 einschalten.
Ein weiterer Schaltkontakt ist an der Terrassentür, ein HM-SEC-SCo wie folgt definiert:
...
define WZ_Kontakt_TR CUL_HM 381F9D
attr WZ_Kontakt_TR IODev CUL_0
attr WZ_Kontakt_TR IOgrp vccu:CUL_0
attr WZ_Kontakt_TR actCycle 000:50
attr WZ_Kontakt_TR actStatus alive
attr WZ_Kontakt_TR autoReadReg 4_reqStatus
attr WZ_Kontakt_TR expert 2_full
attr WZ_Kontakt_TR firmware 1.0
attr WZ_Kontakt_TR model HM-SEC-SCo
...
Nun soll die Heizung abschalten, wenn ich die Terrassentür öffne. Diese DOIF-Anweisung ist offensichtlich falsch - geschalten wir gar nichts:
...
define Heizungssteuerung DOIF ([WZ_Kontakt_TR] eq "close") {fhem ("set Heizung 0 0")} DOELSEIF ([WZ_Kontakt_TR] eq "open") {fhem ("set Heizung 0 1")
...
Fehlermeldung: Heizungssteuerung DOIF: expected DOELSEIF or DOELSE: {fhem ("set Heizung 0 0")} DOELSEIF ([WZ_Kontakt_TR] eq "open") {fhem ("set Heizung 0 1")
Kann mir bitte jemand auf die Sprünge helfen?
Zitat von: Absolute Beginner am 23 März 2015, 11:15:45
define Heizungssteuerung DOIF ([WZ_Kontakt_TR] eq "close") {fhem ("set Heizung 0 0")} DOELSEIF ([WZ_Kontakt_TR] eq "open") {fhem ("set Heizung 0 1")
...
Fehlermeldung: Heizungssteuerung DOIF: expected DOELSEIF or DOELSE: {fhem ("set Heizung 0 0")} DOELSEIF ([WZ_Kontakt_TR] eq "open") {fhem ("set Heizung 0 1")
Kann mir bitte jemand auf die Sprünge helfen?
Der Ausführungsteil bei DOIF wird wie die Bedingung in runde Klammern gesetzt:
Auszug aus der Commandref zu DOIF:
define <name> DOIF (<Bedingung>) (<Befehle>) DOELSEIF (<Bedingung>) (<Befehle>) DOELSEIF ... DOELSE (<Befehle>)
und du kannst direkt FHEM-Befehle ausführen ohne den Umweg über {fhem"..., bei dir heißt das:
define Heizungssteuerung DOIF ([WZ_Kontakt_TR] eq "close") (set Heizung 0 0) DOELSEIF ([WZ_Kontakt_TR] eq "open") (set Heizung 0 1)
Gruß
Damian
und die gwschweifte Klammer am Ende fehlt auch noch.
ist:{fhem ("set Heizung 0 1")
soll:({fhem ("set Heizung 0 1")})
danke Damian und Invers - die Syntax ist nun wohl OK, es gibt keine Fehlermeldungen mehr - aber wenn ich die Tür öffne schaltet der Türkontakt, nicht aber das PIFACE-Relais. Das Logfile zeigt keine Änderungen. Wie gesagt, mit dem händischen "set Heizung 0 1" klappt es gut. Irgendwo ist noch der Wurm 'drin!
Erstens: Ich würde mich sehr wundern, wenn man den einen PIFACE-Kanal mit "0 0" und "0 1" so einfach mit einem StateIcon versehen könnte. Mein PiFace liegt aber abgerüstet im Regal, ich kann's nicht mehr nachprüfen. Ich würde einen Dummy nehmen und dessen Zustand per Notify oder DOIF aufs Piface "spiegeln". Dann klappt's auch mit dem (bedienbaren) Icon.
Zweitens: sehe ich auch gerade nicht was das Problem ist. Nimmt WZ_Kontakt_TR wirklich den Status "open" oder "close" an oder hast Du den vielleicht der Optik halber mit eventMap "geschönt"? Als Sicherheit gegen solche Dinge bliebe der Rückgriff auf das ("unübersetzte) Reading "state", also ([WR_Kontakt_TR:state] eq "open") usw.
Um die Heizung nicht zu stressen, würde ich mal irgendeinen Aktor testweise ins DOIF einbinden und gucken, ob der den Türzustand sauber spiegelt. Wenn nicht, kannst Du so erst mal die Bedingung tunen.
keine Sorge - die Heizung wird nicht gestresst, das sind alles nur Trockenübungen! Danke für den Tipp mit dem Zusatz ":state" - ist natürlich eindeutiger. Mein Kernproblem ist mittlerweile gelöst, ein dämlicher Typo, den wir alle nicht registriert haben: state ist natürlich "closed" und nicht "close"!
Wenn mir noch jemand beim PIFACE helfen könnte, wie ich da ein StateIcon integrieren kann und den Zustand sicher darstellen kann, z.B. mit Dummy? Hat da jemand einen Codeschnipsel für mich?
rename Heizung PIF1 # vielleicht willste ja noch was anderes steuern
define Heizung dummy
# wenn Du sowieso mit Icons arbeitest, empfehle ich keine Übersetzung des States zu machen
attr Heizung devStateIcon on:Heizung_Hauptschalter.on off:Heizung_Hauptschalter.off
attr Heizung group Heizung
attr Heizung icon Shutdown # ?
attr Heizung room Wohnzimmer
attr Heizung webCmd on:off # bin nicht sicher, bitte prüfen, bin gerade 300 km von meinem FHEM weg. Es gibt noch die Möglichkeit, hier Befehle zu setzen, dann wird das Icon quasi direkt zum Button.
usw.
Vielleicht noch webCmd setzen und mögliche States auf on/off begrenzen
define di_HeatControl DOIF ([Heizung] eq "on") (set PIF1 0 1) DOELSE (set PIF1 0 0)
attr di_HeatControl do always # anderenfalls setzt das DOIF keinen Befehl ab, wenn der Dummy schon den Zustand hat, was aber bei eventuellen zwischenzeitlichen Ungereimtheiten zu seltsamen Effekten führen könnte - "Nachtriggern" des Relais erzeugt ja hier keine Funklast etc.
Künftig schaltest Du nur noch den Dummy mit "set Heizung on" bzw. " ... off".
So aus dem Kalten heraus, etwa.
danke dafür! Aber ich schalte ja über das PIFACE-Modul, das ist hier nun nicht mehr definiert.
Doch, wenn Du es wie von mir empfohlen in der ersten Zeile nach "PIF1" umbenennst, ist es noch definiert, wenn Du es aktuell definiert hast wie in Deinem ersten Beitrag. Du kannst natürlich auch den Dummy anders benennen, aber das PiFace hat 8 Kanäle, vielleicht nutzt Du die irgendwann nochmal anderweitig als nur für die Heizung.
Nach meinem Vorschlag ist "Heizung" statt des PiFace jetzt ein Dummy (mit allen Komfortmöglichkeiten wie StateIcons, die das PiFace-Modul erst mal so nicht bietet). Deine Fenster-Logik soll nur noch den Dummy schalten. Das muss natürlich auch angepasst werden:
define Heizungssteuerung DOIF ([WZ_Kontakt_TR] eq "close") (set Heizung on) DOELSEIF ([WZ_Kontakt_TR] eq "open") (set Heizung off).
Das neue DOIF aus meinem vorigen Vorschlag sorgt letztlich nur noch für einen Transport des Dummyzustands auf den entsprechenden Port des PiFace.
Bitte überprüfe nochmal wie das Piface die Heizung schaltet. Ist die Heizung mit set PIF1 0 1 wirklich aktiv, dann ist in Deinem DOIF im ersten Beitrag schon die Logik "verdreht" - offenes Fenster muss Heizung ausschalten.
Ich war wegen Deiner Iconzuweisung in der PiFace-Def davon ausgegangen, dass 1 die Heizung einschaltet... Falls das aktive Relais die Heizung ausschaltet (oder unterbricht), brauchst Du die Logik nur im Dummy-zu-PiFace-Kopier-DOIF anpassen und hast in der eigentlichen Fensterlogik dennoch logisch sprechende Verhältnisse.
Hallo Pfriemler, schönen dank für die ausführliche Hilfe! Werde ich heute abend testen. Es hat schon einen Grund, warum ich die Ausgänge vertauscht habe: wenn aus irgendeinem Grund das Relais nicht schaltet läuft die Heizung jedenfalls weiter, weil ich den Ruhekontakt nutze.
Habe gerade getestet: läuft einwandfrei, genau wie es soll! Super!
Freut mich. Den Ruhekontakt zu nutzen finde ich eine gute Idee, ich würde dann eben das "Kopier-DOIF" so anpassen, dass "off" das Relais anziehen lässt. So bleibt die Logik (on = läuft) erhalten - nur dass im Fehlerfall halt default "on" ist.