FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Mellowback am 11 August 2017, 15:34:11

Titel: Schalten mit mehreren Bedingungen
Beitrag von: Mellowback am 11 August 2017, 15:34:11
Hallo zusammen,

Ich möchte gerne einen Aktor schalten, sobald sich bei den anderen 3Aktoren der Status auf on setzt.
Ich habe einen HM-LC-SW4-SM die 4Aktoren sind wie folgt belegt:

01: Pumpe
02: Bad Kreislauf
03: Küche Kreislauf
04: WZ Kreislauf

Die Pumpe soll Über Fhem auf on gesetzt werden sobald  einer von 02-04 den Status on hat.

Desweiteren soll Fhem die Pumpe abschalten sobald 02-04 den Status off haben.

Kann mir jemand eine Befehlszeile liefern ?

Vorab Danke für eure Hilfe
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Otto123 am 11 August 2017, 15:40:59
ungetestet!
Edit: Zeile ergänzt, Geräte Namen sind so nicht gültig und nur beispielhaft!
define 02-04 structure schalter 02 03 04
attr 02-04 clientstate_behavior relative
attr 02-04 clientstate_priority on off
define n_Pumpe notify 02-04:(on|off) set 01 $EVENT

Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: MadMax-FHEM am 11 August 2017, 15:42:02
Wird schwer ohne zu wissen wie die gefeuerten Events aussehen und wie genau der "Einschaltbefehl" aussieht/aussehen muss...

Aber per Notify:

define nSchaltePumpe regex_welche_auf_02-04_triggert set PUMPE $EVENT

Eventuell auch $EVTPART1

Kommt halt sehr drauf an...

Mal ein list des/der Geräte und ein Auszug aus dem Eventmonitor, wenn die jeweiligen Kanäle/Geräte (02-04) schalten...

Siehe hier:

https://wiki.fhem.de/wiki/Notify

Oder fhem commandref:

https://fhem.de/commandref_DE.html#notify

Gruß, Joachim
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Beta-User am 11 August 2017, 15:46:50
E
Zitat von: Otto123 am 11 August 2017, 15:40:59
ungetestet!
define 02-04 structure schalter 02 03 04
attr 02-04 clientstate_behavior relative
define n_Pumpe notify 02-04:(on|off) set 01 $EVENT


So sollte es eigentlich gehen, mit priority state auf Any_On|on All_Off|off.

Gruß, Beta-User
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: DeeSPe am 11 August 2017, 15:47:32
@Otto123 und @MadMax-FHEM:

Ihr habt beide leider nicht beachtet dass - kein gültiges Zeichen in einem Gerätenamen ist.

Gruß
Dan
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Otto123 am 11 August 2017, 15:55:31
Zitat von: DeeSPe am 11 August 2017, 15:47:32
@Otto123 und @MadMax-FHEM:

Ihr habt beide leider nicht beachtet dass - kein gültiges Zeichen in einem Gerätenamen ist.

Gruß
Dan
Er hat die Gerätenamen vorgegeben, ob die gültig sind hat er nicht gefragt.  ;D
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: MadMax-FHEM am 11 August 2017, 15:55:54
Zitat von: DeeSPe am 11 August 2017, 15:47:32
@Otto123 und @MadMax-FHEM:

Ihr habt beide leider nicht beachtet dass - kein gültiges Zeichen in einem Gerätenamen ist.

Gruß
Dan

Da ich keine Gerätenamen (sondern irgendwie nur beschreibend [so habe ich das interpretiert] geschildert war wie es ist) "gesehen" habe...
...habe ich auch keine angegeben ;)

Ich habe lediglich einen Beschreibungsversuch gegeben, wie ich es evtl. lösen würde bzw. versuchen würde es zu lösen...  8)

Gruß, Joachim
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Otto123 am 11 August 2017, 16:01:55
stimmt bei mir fehlt wohl noch attr 02-04 clientstate_priority on off
Um konsistent aber ungültig zu bleiben  ;)
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Mellowback am 11 August 2017, 17:23:31
ich habe die Ansätze von Euch wie folgt bei mir eingegeben (natürlich mit den richtigen Bezeichnungen).
Dennoch funktioniert es nicht.  :(


define UmwelzpumpeOnOff structure schalter SchaltaktorFussbodenheizung_Sw_02 SchaltaktorFussbodenheizung_Sw_03 SchaltaktorFussbodenheizung_Sw_04
attr UmwelzpumpeOnOff clientstate_behavior relative
attr UmwelzpumpeOnOff clientstate_priority on off
define n_SchaltaktorFussbodenheizung_Sw_01 notify UmwelzpumpeOnOff: (on|off) set 01 $EVENT
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Beta-User am 11 August 2017, 17:29:38
Das Event dürfte das Problem sein (Leerzeichen):
Zitat von: Mellowback am 11 August 2017, 17:23:31
define n_SchaltaktorFussbodenheizung_Sw_01 notify UmwelzpumpeOnOff: (on|off) set 01 $EVENT
Probiers mal so:
define n_SchaltaktorFussbodenheizung_Sw_01 notify UmwelzpumpeOnOff:.(on|off) set 01 $EVENT
Ansonsten mal in den Eventmonitor gucken, was die structure liefert...
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Otto123 am 11 August 2017, 17:29:52
dann ist das & in copy & paste kaputt  :odefine n_SchaltaktorFussbodenheizung_Sw_01 notify UmwelzpumpeOnOff:(on|off) set SchaltaktorFussbodenheizung_Sw_01 $EVENT

das hatte ich nicht UmwelzpumpeOnOff: (on|off) sondern 02-04:(on|off) - Leerzeichen sind wichtig oder falsch, auf keine Fall nur leer ???

Und  den Aktor musst du schon auch hinschreiben, set 01 muss doch einen Fehler liefern?  :'(
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Mellowback am 11 August 2017, 18:05:13
Immer diese copy/paste Fehler  ;D

Funktioniert wunderbar!

Besten Dank
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Mellowback am 18 Oktober 2017, 11:52:50
Hallo zusammen,

nachdem diese Funktion erfolgreich in der Praxis getest wurde, möchte ich jetzt noch zusätzlich die Angabe vom TemperaturSensor ergänzen.

Das bedeutet, zusätzlich zur Überwachung von SchaltaktorFussbodenheizung_Sw_02/03/04 soll generell nur geschaltet werden sobald  Temperatursensor_T1 über 35°C .

Was möchte ich damit bezwecken:

Es so, das heute die Ventile (Schaltaktor 02-04) den Schalzaktor (01 ->Pumpe) einschalten bzw. ausschalten.
Nun habe ich aber das Problem wenn der Heizungskessel garnicht an ist und Schaltaktor (02-04) geschalten wird die Pumpe umsonst läuft (kaltes Wasser pumpt).
Ich habe einen Temperatursensor am Heizkessel befestitgt, so das ich messen kann ob das Wasser warm oder kalt ist.

Sw_01 soll also nur noch auf Sw02/03/04 regieren wenn Temperatursensor_T1 über 35°C steht

Vorab Danke
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Beta-User am 18 Oktober 2017, 12:14:12
Hallo Mellowback,

dann kannst du z.B. den Ausführungsteil um die Abfrage der Temperatur erweitern und nur schalten, wenn es notwendig ist. Kleine Beispiele dazu stehen in der commandref zu perl-Specials. Da hier noch ein anderes Device abgefragt werden soll, ausnahmsweise mal fertigen code.

Statt set SchaltaktorFussbodenheizung_Sw_01 $EVENT

sollte dann folgendes zum gewünschten Ergebnis führen:

{ if (ReadingsVal("Temperatursensor_T1", "state", "no") > 35) { fhem ("set SchaltaktorFussbodenheizung_Sw_01 $EVENT")}}
Allerdings ist mir nicht ganz klar, ob das auch für off gelten soll ;) . Dann müßtest du die Abfrage mit einer Afrage beginnen, ob $EVENT "off" ist beginnen, und dann das if oben durch ein elsif ersetzen...

Gruß, Beta-User
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Wuppi68 am 18 Oktober 2017, 12:24:50
Zitat von: Mellowback am 18 Oktober 2017, 11:52:50
Das bedeutet, zusätzlich zur Überwachung von SchaltaktorFussbodenheizung_Sw_02/03/04 soll generell nur geschaltet werden sobald  Temperatursensor_T1 über 35°C .

das ist ein wenig tricky ...

es kann passieren, dass ein Kreislauf an ist - aber die Temperatur noch unter 35 Grad ist --> Pumpe aus

Kessel geht später an --> Temperatur > 35 Grad --> Pumpe bleibt aus

--------------------------------------
Ich würde die Logik ein wenig umbauen

In Abhängigkeit von der Temperatur, da diese das Hauptargument für Deine Heizung ist ...

dieser Code ist nur Logik und nicht für FHEM direkt geeignet :-)

die Structure bleibt, das Notify auf die Structure fällt weg und wird durch ein neues Notify auf die Temperatur ersetzt :-)

übrig bleibt dann ungefähr folgendes:

define Pumpe an Notify Temperatursensor_T1:temperature:.* {
  if (Temperatursensor_T1:temperature > 35 {
    if (Structure01 eq 'on') { Pumpe ein } else {Pumpe aus}
  } else {
    Pumpe aus
  }
}

Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Beta-User am 18 Oktober 2017, 12:45:13
Die Logik zu verändern, ist m.E. eine gute Sache, erhöht allerdings vermutlich die Last etwas, da Temp-Readings üblicherweise regelmäßig aktualisiert werden.
Je nach Sensor könnte man hier auch eine "Alarm"-Funktion oä. nutzen, dann müßte man aber das Notify auf beide Devices erweitern und dann die Reaktion nach dem triggernden Device richten ::) .

Was man m.E. in jedem Fall noch abfangen sollte, ist der Fall, dass die Pumpe bereits aus ist.
statt"else {Pumpe aus}"
"ein else {Pumpe aus, wenn noch an}"
(Weiteres if, oder ein FILTER)

Gruß, Beta-User

Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Mellowback am 18 Oktober 2017, 13:12:03
Hallo Beta-User,

also Variante 1

"{ if (ReadingsVal("Temperatursensor_T1", "state", "no") > 35) { fhem ("set SchaltaktorFussbodenheizung_Sw_01 $EVENT")}}"


Funktioniert nur bedingt, da ich das Problem habe wenn die Temperatur unterhalb von 35°C geht die Funktion nicht mehr auf ein schalt event reagiert.

Wie würde denn die Logik "if else" für fhem aussehen ?

Grüße
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Beta-User am 18 Oktober 2017, 13:22:42
Zitat von: Beta-User am 18 Oktober 2017, 12:14:12
Dann müßtest du die Abfrage mit einer Afrage beginnen, ob $EVENT "off" ist beginnen, und dann das if oben durch ein elsif ersetzen...

"Eigentlich" war das so gedacht, dass du selbst mal versuchst, ein wenig perl zu schreiben ::) .
Aber weil du es bist ein letztes Mal ohne, dass wenigstens der Versuch zu erkennen ist (ungetested):

{ if ($EVENT == "off" { fhem ("set SchaltaktorFussbodenheizung_Sw_01 $EVENT")} elsif (ReadingsVal("Temperatursensor_T1", "state", "no") > 35) { fhem ("set SchaltaktorFussbodenheizung_Sw_01 $EVENT")}}

Ab hier dann nur noch mit posting der eigenen code-Versuche!

Und bitte setze dich mit dem berchtigten Einwand von Wuppie68 auseinander.

Gruß, Beta-User
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Mellowback am 18 Oktober 2017, 13:58:15
Klasse und Danke für den Ansatz.
Leider bekome ich beim eifügen des Code folgende Fehlermeldung (siehe Bild).

Grüße
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Wuppi68 am 18 Oktober 2017, 14:04:52
Zitat von: Mellowback am 18 Oktober 2017, 13:58:15
Klasse und Danke für den Ansatz.
Leider bekome ich beim eifügen des Code folgende Fehlermeldung (siehe Bild).

Grüße

nimm mal anstelle der Doppelten Gänsefüsschen die einfachen

Unterschied

" = Hier finden Stringersetzungen statt z.B. $Hello = "Hallo"; print "$Hello World" ergibt Hallo World
' = der Text wird so genommen wie er ist $Hello = "Hallo"; print "$Hello World" ergibt $Hello World



und zähle die "öffnenden" und "schliessenden" Gänsefüße und Klammern noch einmal genau nach
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Beta-User am 18 Oktober 2017, 14:09:45
Probier mal "eq" statt "==". Ist ja ein Stringvergleich ::) ...

Sorry.
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Mellowback am 18 Oktober 2017, 14:46:43
Also ich glaube der hat mit "UmwelzpumpeOnOff:(on|off)" ein Problem.


UmwelzpumpeOnOff:(on|off) { if ($EVENT == "off" { fhem ("set SchaltaktorFussbodenheizung_Sw_01 $EVENT")} elsif (ReadingsVal("Temperatursensor_T1", "state", "no") > 35) { fhem ("set SchaltaktorFussbodenheizung_Sw_01 $EVENT")}}
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Beta-User am 18 Oktober 2017, 14:49:56
Zitat von: Beta-User am 18 Oktober 2017, 14:09:45
Probier mal "eq" statt "==". Ist ja ein Stringvergleich ::) ...

Sorry.

Nochmal fertiger code:
UmwelzpumpeOnOff:(on|off) { if ($EVENT eq "off" { fhem ("set SchaltaktorFussbodenheizung_Sw_01 $EVENT")} elsif (ReadingsVal("Temperatursensor_T1", "state", "no") > 35) { fhem ("set SchaltaktorFussbodenheizung_Sw_01 $EVENT")}}

Und bitte ggf. die Events in Code-Tags einfügen.
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Mellowback am 18 Oktober 2017, 14:52:22
immer noch gleiche fehlermeldung  :(
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Beta-User am 18 Oktober 2017, 14:55:28
OK, es fehlte auch noch eine Klammer nach "off"UmwelzpumpeOnOff:(on|off) { if ($EVENT eq "off") { fhem ("set SchaltaktorFussbodenheizung_Sw_01 $EVENT")} elsif (ReadingsVal("Temperatursensor_T1", "state", "no") > 35) { fhem ("set SchaltaktorFussbodenheizung_Sw_01 $EVENT")}}
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Mellowback am 18 Oktober 2017, 15:14:18
okay, ich glaube soweit funktioniert es erstmal.
Ich werde dann nochmal testen was passiert wenn T1 die 35Grad übersteigt.

Danke

Grüße
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Beta-User am 18 Oktober 2017, 15:22:39
Zum Testen kannst du ja auch einfach die Vergleichstemperatur (nach unten) anpassen ;) .

Aber insgesamt nochmal: wuppi68's Einwand solltest du dir bei Gelegenheit nochmal in Ruhe durchdenken.

Gruß, Beta-User
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Otto123 am 18 Oktober 2017, 19:56:26
Hi,

bei solchen einfachen Abfrage bevorzuge ich die kürzere IF Variante (FHEM IF)
UmwelzpumpeOnOff:(on|off) IF ($EVENT eq "off") (set SchaltaktorFussbodenheizung_Sw_01 $EVENT) ELSE ( IF ([Temperatursensor_T1] > 35) (set SchaltaktorFussbodenheizung_Sw_01 $EVENT))
https://fhem.de/commandref_DE.html#IF

Nur zur Info  :D

Gruß Otto
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Mellowback am 19 Oktober 2017, 13:00:21
Hallo Otto,

bei deiner Variante reagiert Fhem garnicht.
Kann es sein das er Temperatursensor_T1 nicht erkennt ?
Die Daten von Temperatursensor_T1 habe ich mal als Bild mit hinterlegt muss der Code durch "temperature" ergänzt werden ?

Grüße
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Otto123 am 19 Oktober 2017, 22:02:21
Hallo Mellowback,

genau so ist es. Allerdings kann dann
Zitat(ReadingsVal("Temperatursensor_T1", "state", "no")
auch nicht funktionieren! Davon bin ich aber ausgegangen. Du hast ja gesagt der Code von Beta User funktioniert.
Also
[Temperatursensor_T1:temperature] entspricht (ReadingsVal("Temperatursensor_T1", "temperature", "no")
und
[Temperatursensor_T1] entspricht (ReadingsVal("Temperatursensor_T1", "state", "no")

Noch ein Tipp: Uns allen ist es lieber keine Screenshots anzuschauen sondern die Ausgabe von list <devicename>

Gruß Otto
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Mellowback am 20 Oktober 2017, 13:45:38
Hallo Otto,

ich habe jetzt alles schon Versucht, aber irgendwie schaltet er bei deiner Version nicht:


UmwelzpumpeOnOff:(on|off) IF ($EVENT eq "off") (set SchaltaktorFussbodenheizung_Sw_01 $EVENT) ELSE ( IF ([Temperatursensor_T1:temperature] > 36) (set SchaltaktorFussbodenheizung_Sw_01 $EVENT))


nehme ich die andere Version, funktioniert es:


UmwelzpumpeOnOff:(on|off) { if ($EVENT eq "off") { fhem ("set SchaltaktorFussbodenheizung_Sw_01 $EVENT")} elsif (ReadingsVal("Temperatursensor_T1", "temperature", "no") > 36) { fhem ("set SchaltaktorFussbodenheizung_Sw_01 $EVENT")}}


Woran kann das liegen ?

Grüße

Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Beta-User am 20 Oktober 2017, 13:53:01
Evtl. ist bei "temperature" noch eine Formatierung mit drin, ggf. hilft ":d" (bin kein Experte mit diesen kryptischen Optionen, da ich das mit perl mache, was ja funktioniert, wenn man die Bezüge richtig setzt ;) ).

Aber Danke für die Bestätigung, dass es mit perl auch geht ;D .

Gruß, Beta-User
Titel: Antw:Schalten mit mehreren Bedingungen
Beitrag von: Otto123 am 21 Oktober 2017, 10:27:18
Moin beta-user,

wenn "bei "temperature" noch eine Formatierung" drin wäre, würde ReadingsVal diese auch liefern und der Vergleich würde nicht gehen.

Ich sehe jetzt auf die Schnelle auch nicht wo der Fehler liegen kann. Bei der Länge der Namen, spielt die optische Verkürzung des Codes ja auch nicht die Rolle. ;D
Letztendlich ist wichtig das es geht.

Gruß Otto