Hallo Zusammen,
vielleicht kann mir jemand helfen. Ich suche schon eine ganze Weil ein Netz und hier im Forum nach einer brauchbaren Beschreibung, wie ich "webcmd" als virtuelle Schalter einsetzen kann, um Relais parallel zu einer Regelung zu steuern - sozusagen als Notschalter.
Rahmenbedingung:
Die Regelung überwacht die Luftfeuchte im Bad und schaltet bei überschreiten des Schwellwertes einen Lüfter an einem der WireGate-Multisensoren (DS2413).
Folgender Code der Regelung funktioniert zuverlässig:
######################## Beginn Badezimmer - Schalter DS2413 ##############
define Badswitch OWDevice 3A.C72C08000000 60
attr Badswitch IODev Raspi_OWServer
attr Badswitch event-min-interval .*:60
attr Badswitch event-on-change-reading .*
attr Badswitch model DS2413
attr Badswitch room Bad
####Lüftungssteuerung ##################
define Lueftung_Bad at +*00:01:00 {if (ReadingsVal("BadKlima","humidity",40) > 58) {fhem("set Badswitch PIO.A 1")} else {fhem("set Badswitch PIO.A 0")}}
Die Aufgabe
Der Lüfter ("Badswitch PIO.A") soll nun unabhängig und zusätzlich von der Regelung oben AUCH von per WEBCMD geschalten werden können.
Folgendes habe ich probiert - Ergebnis - der Lüfter geht per webcmd an, ABER NICHT wieder aus UND die Regelung greift nicht mehr. Im Eventlog kann ich beim "drücken" des "on" Schalters sehen, dass das Ereignis ausgelöst wird , drücke ich aber "off" wird nur der dummy gesetzt aber der PIO.A nicht.
####Lüftungssteuerung mit Schalter ##################
define Lueftung_Bad dummy
attr Lueftung_Bad devStateIcon on:black_Steckdose.on off:black_Steckdose.off
attr Lueftung_Bad room Bad
attr Lueftung_Bad eventmap /on:1/off:0/
attr Lueftung_Bad webCmd on:off
define Lueftung_Bad_Notify notify Lueftung_Bad { if ((ReadingsVal("BadKlima","humidity",40) > 58) || ("$EVENT" eq "on") ) {fhem "set Badswitch PIO.A $EVENT"} else {fhem "set Badswitch PIO.A $EVENT"}}
attr Lueftung_Bad_Notify room Bad
Mir ist klar, dass der Knackpunkt im "notify" liegt aber wo?
Vielen Dank im Voraus für Eure Hilfe.
Liebe Grüsse
Erik
Hallo Erik,
dein Lüfter schaltet mit 1 an und mit 0 aus. Du übergibst mit $EVENT allerdings on oder off.
Gruß Jens
Hallo Jens,
lieben Dank für die Antwort. Damit konnte ich schonmal einen Teilerfolg erzielen ;-)
der Schalter per webcmd geht jetzt AN und AUS. Sieht in der Weboberfläche nur etwas blöd aus mit "1" und "0".
Was weiterhin nicht geht ist die Schaltung abhängig von der Luftfeuchte - also das "ODER" in der "if" Bedingung.
####Lüftung Mit Webschalter ##################
define Lueftung_Bad dummy
attr Lueftung_Bad devStateIcon on:black_Steckdose.on off:black_Steckdose.off
attr Lueftung_Bad room Bad
attr Lueftung_Bad eventMap on:1 off:0
attr Lueftung_Bad webCmd 1:0
define Lueftung_Bad_Notify notify Lueftung_Bad {[color=red] if ((ReadingsVal("BadKlima","humidity",40) > 30) || ("$EVENT" eq "1") [/color]) {fhem "set Badswitch PIO.A $EVENT"} else {fhem "set Badswitch PIO.A 0"}}
attr Lueftung_Bad_Notify room Bad
Vielleicht kannst Du oder jemand anderes hier nochmal helfend eingreifen ;-)
Danke!
Erik
Hast du schon mal das probiert?
define Lueftung_Bad_Notify notify Lueftung_Bad {if (ReadingsVal('BadKlima','humidity','40') > 30 || $EVENT eq '1') {fhem("set Badswitch PIO.A 1")} else {fhem("set Badswitch PIO.A 0")}}
Gruß Jens
Hi,
danke Dir für die Antwort.
Dein Skript tut genau das gleiche wie vorher :o der Webschalter funktioniert, die Regelung greift weiterhin nicht. Ich verändere zum Testen immer den Schwellwert .... deswegen die 30....
Ich vermute, dass bei einem notify nur ein "event" zu einem Trigger führt. In meinem Fall wird "humidity" aber aus einem Spannungswert errechnet. Die "humidity" steht so auch nie im Eventlog. In meiner funktionierenden Regelung mit dem "at" ganz oben wird vermutlich zu jeder Minute der "ReadingsVal" berechnet.
Kannst Du (oder jemand anderes) sagen, ob ich aus dem ReadingsVal etwas machen kann, was ein direktes Event erzeugt?
Ich fummle mal ein bisschen in diese Richtung 8)
Grüße
Erik
Hallo,
ZitatMir ist klar, dass der Knackpunkt im "notify" liegt aber wo?
Im regexp würde ich sagen.
notify Lueftung_Bad
Triggert NUR auf den Dummy.
Erst wenn dieser geschalten wird wird geprüft ob (ReadingsVal("BadKlima","humidity",40) > 30) - mir fehlt das define von BadKlima - ODER $EVENT eq '1'
Das notify triggert NICHT auf BadKlima humidity - daher suche ich die ganze Zeit schon die "Regelung".
Grüße
P.S.: Mit dem ersten Code hat die "Regelung" nur "funktioniert" weil es kein notify sondern ein at war und somit zyklisch die Luftfeuchte abgefragt wurde.
Hallo Puschel,
auch Dir Dank für die Zeit und die Antwort.
hier das "define" für BadKlima:
define BadKlima OWDevice 26.68DA6B010000 600
attr BadKlima IODev Raspi_OWServer
attr BadKlima event-min-interval .*:60
attr BadKlima event-on-change-reading .*
attr BadKlima model DS2438
attr BadKlima room Bad
attr BadKlima stateFormat {sprintf("T: %.1f H: %.1f",ReadingsVal("BadKlima","temperature",0), ReadingsVal("BadKlima","humidity",0))}
attr BadKlima userReadings humidity { int(10*((ReadingsVal("BadKlima","VAD",0) * 157.23 / ReadingsVal("BadKlima","VDD",0) - 23.8208) / ( 1.0546 - 0.00216 * (ReadingsVal("BadKlima","T",0) + 0.0 ))) + 0.5) / 10 }, temperature_T { int ( 10 * ReadingsVal("BadKlima","temperature",0) + 0.5 ) / 10 }
Folgendes soll Ziel soll erreicht werden (wie 30% sind Unsinn ich weiss ;-):
Lüftung = AN, wenn (Luftfeuchte > 30%) oder (Webschalter = AN)
Grüße
Erik
Hallo,
Langform:
Notify auf BadKlima:humidity mit der if-Bedingung zum ein- ausschalten analog dem at aus dem ersten Code für die Regelung.
Ein weiteres notify auf den Dummy um unabhängig schalten zu können.
Kurzform:
Regexp für ein notify passend zusammenbauen.
(BadKlima|Lueftung_Bad):(humidity|on).* so in die Richtung.
Grüße
hallo
Sitze gerade nicht vor dem PC und kann nicht auf mein System zugreifen, aber für alles was mit Schwellwerten und Regeln zu tun hat, verwende ich treshold, damit kann man sehr einfach Schwellwert definieren und Aktionen definieren.
http://fhem.de/commandref.html#THRESHOLD
Gruß
Karl
Sent from my iPad using Tapatalk
Hallo Puschel,
offenbar bin ich noch nicht weit genug, um deine Hinweise zu verstehen....
Deine Hinweise:
##################################
#Langform:
#Notify auf BadKlima:humidity mit der if-Bedingung zum ein- ausschalten analog dem at aus dem ersten Code für die Regelung.
#Ein weiteres notify auf den Dummy um unabhängig schalten zu können.
#Kurzform:
#Regexp für ein notify passend zusammenbauen.
#(BadKlima|Lueftung_Bad):(humidity|on).*
##################################
...habe ich so umgesetzt:
define Lueftung_Bad dummy
attr Lueftung_Bad devStateIcon on:black_Steckdose.on off:black_Steckdose.off
attr Lueftung_Bad eventMap on:1 off:0
attr Lueftung_Bad group Schalter
attr Lueftung_Bad room Bad
attr Lueftung_Bad webCmd 1:0
define Luftfeuchte_Bad_Notify1 notify Lueftung_Bad {if (ReadingsVal("BadKlima","humidity",40) > 70) {fhem("set Badswitch PIO.A 1")} else {fhem("set Badswitch PIO.A 0")}}
attr Luftfeuchte_Bad_Notify1 room System
define Luftfeuchte_Bad_Notify2 notify Lueftung_Bad {if ($EVENT eq '1') {fhem("set Badswitch PIO.A 1")} else {fhem("set Badswitch PIO.A 0")}}
attr Luftfeuchte_Bad_Notify2 room System
Der Webschalter "Lueftung_Bad" funktioniert. Nur das Schalten anhand der Luftfeuchte geht nicht.
Allerdings fürchte ich, dass Du das anders gemeint hast.....
Danke nochmal für die Hilfe im Vorfeld.
Grüße
Erik
Hallo,
Zitat...habe ich so umgesetzt:
Nein hast du nicht.
Es wäre (für dich) hilfreich wenn du dich mal mit regexp auseinandersetzen würdest.
Es gibt einige gute Seiten im Netz.
define Luftfeuchte_Bad_Notify1 notify Lueftung_Bad {if (ReadingsVal("BadKlima","humidity",40) > 70) {fhem("set Badswitch PIO.A 1")} else {fhem("set Badswitch PIO.A 0")}}
attr Luftfeuchte_Bad_Notify1 room System
define Luftfeuchte_Bad_Notify2 notify Lueftung_Bad {if ($EVENT eq '1') {fhem("set Badswitch PIO.A 1")} else {fhem("set Badswitch PIO.A 0")}}
attr Luftfeuchte_Bad_Notify2 room System
BEIDE triggern nur und ausschliesslich durch ein Event von Lueftung_Bad.
Zitat#Langform:
#Notify auf BadKlima:humidity mit der if-Bedingung zum ein- ausschalten analog dem at aus dem ersten Code für die Regelung.
#Ein weiteres notify auf den Dummy um unabhängig schalten zu können.
define Luftfeuchte_Bad_Notify1 notify BadKlima:humidity.* {if (ReadingsVal("BadKlima","humidity",40) > 70) {fhem("set Badswitch PIO.A 1")} else {fhem("set Badswitch PIO.A 0")}}
attr Luftfeuchte_Bad_Notify1 room System
define Luftfeuchte_Bad_Notify2 notify Lueftung_Bad.* {if ($EVENT eq '1') {fhem("set Badswitch PIO.A 1")} else {fhem("set Badswitch PIO.A 0")}}
attr Luftfeuchte_Bad_Notify2 room System
Eigentlich würdest du von mir sowas
BadKlima:humidity.* {if (ReadingsVal("BadKlima","humidity",40) > 70) {fhem("set Badswitch PIO.A 1")} else {fhem("set Badswitch PIO.A 0")}}
Lueftung_Bad.* {if ($EVENT eq '1') {fhem("set Badswitch PIO.A 1")} else {fhem("set Badswitch PIO.A 0")}}
bekommen.
Da du aber noch im Stadium - ich mach alles in der fhem.cfg - steckst poste ich es dir hoffentlich passend dafür.
Fehlermeldungen bitte hier posten.
Grüße
P.S.: Anpassungen und Verfeinerungen kommen später.
Hallo Puschel,
herzlichen Dank für Deine Anfängerunterstützung.
Du hast mich durchschaut 8) - ich muss mich - mangels Programmierkenntnissen - dem FHEM durch Re-Engineering der im Forum gelisteten Beispiele nähern. Gerade beim Notify habe ich es noch nicht geschafft die Logik im Code zu erkennen. Auch das Thema Regexp ist irgendwie noch duster.
Ich habe jetzt folgenden Code von Dir übernommen:
define Lueftung_Bad dummy
attr Lueftung_Bad devStateIcon on:black_Steckdose.on off:black_Steckdose.off
attr Lueftung_Bad eventMap on:AN off:AUS
attr Lueftung_Bad group Schalter
attr Lueftung_Bad room Bad
attr Lueftung_Bad webCmd AN:AUS
define Luftfeuchte_Bad_Notify1 notify BadKlima:humidity.* {if (ReadingsVal("BadKlima","humidity",40) > 70) {fhem("set Badswitch PIO.A 1")} else {fhem("set Badswitch PIO.A 0")}}
attr Luftfeuchte_Bad_Notify1 room System
define Luftfeuchte_Bad_Notify2 notify Lueftung_Bad.* {if ($EVENT eq 'AN') {fhem("set Badswitch PIO.A 1")} else {fhem("set Badswitch PIO.A 0")}}
attr Luftfeuchte_Bad_Notify2 room System
Also:
Das Verhalten:
- bei Überschreiten des Schwellwertes schaltet wird "PIO.A = 1" gesetzt UND bleibt auf PIO.A = 1 über mehrere Minuten
- bei Betätigen des Webschalters sieht der Eventlog folgendermaßen aus
- 2015-01-04 20:26:38 OWDevice Badswitch PIO.A: 1
- 2015-01-04 20:26:38 dummy Lueftung_Bad AN
- ......
- 2015-01-04 20:27:36 OWDevice Badswitch PIO.A: 0
Das ist dann in etwa die Minute, die zwischen den Readings der BadKlima.humidity steckt. Insofern halte ich das Verhalten für ok, auch wenn es den eigentlichen Zweck nicht erfüllt. Eigentlich sollte der Lüfter hinter PIO.A weiter laufen.
Vermutlich müsste ich dafür den "state" des WebCMD irgendwie erhalten. Wenn ich das richtig verstanden habe, wirk das WEBCMD Kommando nur als Taster.
Wenn Du dazu noch eine Idee hast, wäre ich Dir sehr dankbar!
Grüße
Erik
ZitatEigentlich sollte der Lüfter hinter PIO.A weiter laufen.
Und nicht durch die Automatik abgeschaltet werden?
d.h. wenn die Automatik den Lüfter einschaltet und später drückt jemand auf AN soll der Lüfter nicht wieder durch die Automatik abgeschaltet werden sondern weiterlaufen bis wieder jemand AUS drückt?
Ich hätte da auch eine Idee:
define Luftfeuchte_Bad_DOIF DOIF ([BadKlima:humidity] >= 70 or [Lueftung_Bad] eq "on") (set Badswitch PIO.A 1) DOELSEIF ([BadKlima:humidity] < 70 and [Lueftung_Bad] eq "off")(set Badswitch PIO.A 0)
Wahrscheinlich geht es darum, Düfte zu vertreiben - in dem Fall hilft vielleicht ein CO-Sensor weiter... ;)
Hallo Puschel und Dirigent,
@Puschel:
Das von Dir beschriebene Vorgehen wäre cool. Ich habe ne Weile drüber nachgedacht, ob die Logik das hergibt und es Sinn macht - tut es.
Wenn die manuelle Steuerung den Lüfter einschaltet, soll die Automatik/Regelung ausser Kraft gesetzt werden. Sonst passiert ja das gesehene (geht nach dem erneuten Lesen der Werte wieder aus.) Den Zyklus zum Lesen könnte ich auch noch hochstellen.
Eine solche Übersteuerung würde ich dann pauschal einmal am Tag bspw. 03:00 Uhr killen und den PIO.x mit "at" auf 0 zwingen. (Sowas habe ich mit meinen Hue's auch gemacht - wenn die Mädels Abends vergessen das Licht auszumachen weil das Handy weg ist :P
@dirigent:
erstmal danke auch an Dich!
Für mich liest sich das "DOIF" sehr leicht. Die Klammersetzung mit eckigen Klammern muss man halt kennen. - die CommandRef ist dein / mein Freund. Aber die Logik erkennt man auch nach 4 Monaten wieder ;)
Liebe Grüsse aus Leipzig.
Erik
Hallo Erik,
mit DOIF kann man viel zusammenfassen. In deinem Fall z.B.: Falls es 3 Uhr ist, setzte den Webschalter zurück anschließend prüfe, ob die Feuchtigkeit größer-gleich 70% ist oder der Webschalter an ist. Wenn ja schalte den Lüfter an. Danach prüfe, ob die Feuchtigkeit unter 70% ist und der Webschalter aus - erst dann schalte den Lüfter aus.
Quasi zwei Notifys und ein at in einem DOIF.
define Luftfeuchte_Bad_DOIF DOIF ([03:00])(set Lueftung_Bad off) DOELSEIF ([BadKlima:humidity] >= 70 or [Lueftung_Bad] eq "on") (set Badswitch PIO.A 1) DOELSEIF ([BadKlima:humidity] < 70 and [Lueftung_Bad] eq "off")(set Badswitch PIO.A 0)
Oder du machst den Webschalter automatisch nach 1 Stunde aus und der Lüfter geht aus, falls die Feuchtigkeit unter 70 % ist:
define Luftfeuchte_Bad_DOIF DOIF ([BadKlima:humidity] >= 70 or [Lueftung_Bad] eq "on") (set Badswitch PIO.A 1; sleep 3600; set Lueftung_Bad "off") DOELSEIF ([BadKlima:humidity] < 70 and [Lueftung_Bad] eq "off")(set Badswitch PIO.A 0)
Gruß Jens