Seite 1 von 2
Relais Temperaturgesteuert schalten
Verfasst: 19. Mär 2019 08:52
von BO80
Hallo Zusammen,
ich bin noch Anfänger was Openhab angeht und stehe nun vor einem Problem welches ich noch nicht lösen konnte.
Zunächst die Hardware:
Raspberry Pi 3b+, Temperatursensoren 18B20, 4 fach Relais Modul
https://www.amazon.de/Elegoo-Relaismodu ... 0FC11P0ZN4
Software: Openhab2
Bisher frage ich die Temperaturen von meiner Heizung ab und visualisiere sie in Grafana.
Literatur: Smart Home mit openHAB2 von Marianne Spiller
Nun zum aktuellen Vorhaben:
Anhand von 2 Temperaturfühlern soll temperaturabhängig ein Relais geschalten werden, welches ein Umschaltventil steuert.
hier nun Mein Versuch eine Regel zu erstellen:
Code: Alles auswählen
rule "Umschaltventil"
var Tempspeicher_vorlauf = Speichertemperatur6.state as Number
If (Tempspeicher_vorlauf <= 50) {
Chanel3.sendCommand (OFF)
}
var Tempspeicher_oben = Speichertemperatur7.state as Number
If (Tempspeicher_oben >= 55 && Tempspeicher_vorlauf <= 55) {
Chanel3.sendCommand (ON)
Ich habe mich dabei am Buch orientiert, leider funktioniert es so nicht.
Ich hoffe jemand hat mir einen Tipp!
Re: Relais Temperaturgesteuert schalten
Verfasst: 19. Mär 2019 09:45
von udo1toni
Wie sind die Items Speichertemperatur6 und Speichertemperatur7 definiert?
Die Rule ist syntaktisch falsch. Zum einen fehlt hinten ein end, zum anderen fehlt oben der when Part. Die Rule sollte also eher so aussehen:
Code: Alles auswählen
rule "Umschaltventil"
when
Item Speichertemperatur6 changed or
Item Speichertemperatur7 changed
then
var Tempspeicher_vorlauf = Speichertemperatur6.state as Number
var Tempspeicher_oben = Speichertemperatur7.state as Number
if (Tempspeicher_vorlauf <= 50) {
Chanel3.sendCommand (OFF) // heißt das Item evtl. Channel3 und nicht Chanel3?
}
if (Tempspeicher_oben >= 55 && Tempspeicher_vorlauf <= 55) {
Chanel3.sendCommand (ON)
}
end
Beachte bitte auch peinlichst genau die Groß/Kleinschreibung jedes einzelnen Zeichens. Du hast in Deinem Code die beiden if() mit großem i geschrieben, das funktioniert ebenfalls nicht (in Marianne Spillers Buch wirst Du diese Schreibweise im Code auch nicht finden...)
Re: Relais Temperaturgesteuert schalten
Verfasst: 19. Mär 2019 11:17
von BO80
Danke schon mal für die Hilfe!
Wie Items Speichertemperatur6 und Speichertemperatur7 definiert sind kann ich erst heute Abend nachschauen.
Ich werde mir mehr Mühe geben, was die Schreibweise angeht!

Re: Relais Temperaturgesteuert schalten
Verfasst: 19. Mär 2019 16:00
von BO80
Ich habe es jetzt so nochmal Probiert, funktioniert aber leider auch nicht:
Code: Alles auswählen
rule "Umschaltventil"
when
Item Speichertemperatur6 changed or
Item Speichertemperatur7 changed
then
var Tempspeicher_vorlauf = Speichertemperatur6.state as Number
var Tempspeicher_oben = Speichertemperatur7.state as Number
if (Tempspeicher_vorlauf <= 50) {
channel3.sendCommand (ON)
}
if (Tempspeicher_oben >= 55 && Tempspeicher_vorlauf <= 55) {
channel3.sendCommand (OFF)
}
Die Items sind so definiert:
Code: Alles auswählen
Number:Temperature Speichertemperatur6 "Speicher unter Vorlauf: [%.1f %unit%]" <temperature> { channel="onewiregpio:sensor:Speicher_unter_Vorlauf:temperature" }
Number:Temperature Speichertemperatur7 "Speicher oben: [%.1f %unit%]" <temperature> { channel="onewiregpio:sensor:Speicher_oben:temperature" }
Re: Relais Temperaturgesteuert schalten
Verfasst: 19. Mär 2019 17:39
von udo1toni
Ja, ist kein Wunder. Die Temperaturen sind einheitenbehaftet, es wird also statt 16 als Zahl 16°C als Wert zurückgeliefert. Dementsprechend musst Du die Zuweisung zur Variablen ändern:
Code: Alles auswählen
var Tempspeicher_vorlauf = (Speichertemperatur6.state as Number).floatValue
var Tempspeicher_oben = (Speichertemperatur7.state as Number).floatValue
Alternativ kannst Du die Einheit auch im Vergleich berücksichtigen:
und dentsprechend auch im zweiten Vergleich.
Re: Relais Temperaturgesteuert schalten
Verfasst: 19. Mär 2019 21:49
von BO80
Super, es Funktioniert jetzt!
Danke für die kompetente Hilfe und die Geduld mit einem Anfänger!
Re: Relais Temperaturgesteuert schalten
Verfasst: 20. Mär 2019 05:03
von udo1toni
BO80 hat geschrieben: ↑19. Mär 2019 21:49
Super, es Funktioniert jetzt!
Danke für die kompetente Hilfe und die Geduld mit einem Anfänger!
Immer gerne, wir haben alle mal angefangen (und tun es in anderen Bereichen immer wieder)

Re: Relais Temperaturgesteuert schalten
Verfasst: 20. Mär 2019 18:08
von BO80
Da es so gut funktioniert hat, habe ich die Rule gleich um 2 weitere Relais erweitert
Code: Alles auswählen
rule "Umschaltventil"
when
Item Speichertemperatur6 changed or
Item Speichertemperatur7 changed
then
var Tempspeicher_vorlauf = (Speichertemperatur6.state as Number).floatValue
var Tempspeicher_oben = (Speichertemperatur7.state as Number).floatValue
if (Tempspeicher_vorlauf <= 50) {
channel3.sendCommand (OFF)
}
if (Tempspeicher_oben >= 50 && Tempspeicher_vorlauf <= 55) {
channel3.sendCommand (ON)
}
end
rule "Oelheizung Betrieb"
when
Item Speichertemperatur6 changed or
Item Speichertemperatur1 changed
then
var Tempspeicher_vorlauf = (Speichertemperatur6.state as Number).floatValue
var Tempofen_vorlauf = (Speichertemperatur1.state as Number).floatValue
if (Tempspeicher_vorlauf <= 45 && Tempofen_vorlauf <=50) {
channel1.sendCommand (ON)
channel2.sendCommand (ON)
}
if (Tempofen_vorlauf >=55) {
channel1.sendCommand (OFF)
channel2.sendCommand (OFF)
}
end
Jetzt würde ich gerne noch den channel2 zeitverzögert zu channel1 ausschalten.
Ist das so in der Rule möglich?
Re: Relais Temperaturgesteuert schalten
Verfasst: 20. Mär 2019 18:45
von udo1toni
Ja, das Einfachste ist ein Timer.
Code: Alles auswählen
// globale Variablen werden vor der ersten Rule definiert
var Timer tDelay = null
rule "Oelheizung Betrieb"
when
Item Speichertemperatur6 changed or
Item Speichertemperatur1 changed
then
var Tempspeicher_vorlauf = (Speichertemperatur6.state as Number).floatValue
var Tempofen_vorlauf = (Speichertemperatur1.state as Number).floatValue
if (Tempspeicher_vorlauf <= 45 && Tempofen_vorlauf <=50) {
channel1.sendCommand (ON)
channel2.sendCommand (ON)
tDelay?.cancel
}
if (Tempofen_vorlauf >=55) {
channel1.sendCommand (OFF)
tDelay = createTimer(now.plusSeconds(30), [ |
channel2.sendCommand (OFF)
])
}
end
statt plusSeconds gibt es auch plusMinutes und plusHours (...) Der übergebene Wert muss vom Typ Integer sein.
Re: Relais Temperaturgesteuert schalten
Verfasst: 20. Mär 2019 22:21
von BO80
Danke für die Hilfe, das geht ja echt schnell bei dir!
Ich hab bestimmt noch die eine oder andere Frage.