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
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
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
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
@Otto123 und @MadMax-FHEM:
Ihr habt beide leider nicht beachtet dass - kein gültiges Zeichen in einem Gerätenamen ist.
Gruß
Dan
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
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
stimmt bei mir fehlt wohl noch attr 02-04 clientstate_priority on off
Um konsistent aber ungültig zu bleiben ;)
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
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...
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? :'(
Immer diese copy/paste Fehler ;D
Funktioniert wunderbar!
Besten Dank
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
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
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
}
}
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
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
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
Klasse und Danke für den Ansatz.
Leider bekome ich beim eifügen des Code folgende Fehlermeldung (siehe Bild).
Grüße
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
Probier mal "eq" statt "==". Ist ja ein Stringvergleich ::) ...
Sorry.
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")}}
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.
immer noch gleiche fehlermeldung :(
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")}}
okay, ich glaube soweit funktioniert es erstmal.
Ich werde dann nochmal testen was passiert wenn T1 die 35Grad übersteigt.
Danke
Grüße
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
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
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
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
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
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
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