Seite 1 von 2
Z-Wave und Rules -
Verfasst: 27. Jan 2019 07:21
von mario
Hallo zusammen,
da ich schon relativ verzweifelt bin, hoffe ich, ihr könnt mir helfen.
ich habe meine gesamte Wohnung mit Z-Wave Devices von Fibaro ausgerüstet. Hatte jetzt länger die Fibaro Zentrale laufen, war damit aber hauptsächlich wegen der Stabilität nicht zufrieden.
In den letzten Tagen habe ich dann alle Devices auf OpenHAB migriert, das lief eigentlich ganz gut, nur bei den Rules komme ich nicht weiter.
Hier das Problem:
Ich habe eine Rule geschrieben, die, wenn sich eine Temperatur unter einen bestimmten Wert ändert, etwas einschalten soll. Soweit so gut.
Das Problem ist nur, die Rule bekommt diese Änderung nicht mit! Zuerst dachte ich, das liegt daran, dass ich etwas falsch gemacht habe, deshalb habe ich testweise einen Temperaturwert aus meiner Netatmo Zentrale genommen. Da funktionierte es auf Anhieb.
Habt ihr einen Tip was ich falsch mach?
Hier der Code:
rule "Sauna_Frostschutz"
when
Item Sauna_Temperatur changed
then
logInfo( "FILE", "Temperaturänderung" )
if ((Sauna_Temperatur.state as QuantityType<Number>) < 7.0) //Es ist kalt
{
logInfo( "FILE", "FBH einschalten" )
}
else if ((Sauna_Temperatur.state as QuantityType<Number>) > 7.1) //Es ist warm
{
logInfo( "FILE", "FBH ausschalten" )
}
end
Re: Z-Wave und Rules -
Verfasst: 27. Jan 2019 17:44
von udo1toni
Wie ist das Item definiert?
Re: Z-Wave und Rules -
Verfasst: 28. Jan 2019 11:10
von mario
Hi,
das Item habe ich über die UI definiert.
Zuerst Inbox -> Search for Things -> Item gespeichert
Dann Configuration/Things das Thing ausgewählt -> Channel Temperatur ausgewählt und Item angelegt.
Wo kann ich eigentlich die Definitionen finden, die über die UI gemacht wurden?
lg
Mario
Re: Z-Wave und Rules -
Verfasst: 28. Jan 2019 11:21
von mamoel
Die Definition landet letztendlich im Verzeichnis /userdata/jsondb. Hier liegen die Konfigurationen als JSON-formatierte Files.
Re: Z-Wave und Rules -
Verfasst: 28. Jan 2019 14:05
von peter-pan
Hallo Mario,
du kannst auch unter
$OPENHAB_USERDATA/jsondb/ schauen. Es könnte nämlich, je nach Installation, auch der Ordner
/var/lib/openhab2/jsondb sein.
Du kannst auch in die Paper UI gehen und unter Configuration/Items schauen:
paper_name.jpg
Da ist an der Seite auch so ein Copy/Paste-Schalter. Mit dem kannst du den Item-Namen auch gleich in deine Rule kopieren.
Gruss - Peter
Re: Z-Wave und Rules -
Verfasst: 28. Jan 2019 16:27
von mario
Hi,
die Item Definition scheint OK zu sein, ich bekomme die Werte ja angezeigt und kann auch manuell schalten.
Nur in den Rules eben nicht bzw. win ich etwas verwirrt, weil die Rule nicht so funktioniert wie ich das erwarte.
Hier die Rule:
rule "Sauna_Frostschutz"
when
Item Temperatur_Sauna_2 changed
then
logInfo( "FILE", "Temperaturänderung" )
logInfo( "FILE", Temperatur_Sauna_2.toString)
logInfo( "FILE", Sauna_Solltemperatur.toString)
if((Temperatur_Sauna_2.state instanceof Number) && (Sauna_Solltemperatur.state instanceof Number)) {
logInfo( "FILE", "alles Number")
if ((Temperatur_Sauna_2.state.toString) < (Sauna_Solltemperatur.state.toString) ) //Es ist kalt
{
logInfo( "FILE", "FBH einschalten" )
Sauna_FBH.sendCommand(ON)
}
else if ((Temperatur_Sauna_2.state.toString) > (Sauna_Solltemperatur.state.toString)) //Es ist warm
{
logInfo( "FILE", "FBH ausschalten" )
Sauna_FBH.sendCommand(OFF)
}
}
end
Im Log kommt dann folgendes raus:
Bildschirmfoto 2019-01-28 um 16.25.42.png
Das heisst, die Logik ist genau verkehrtrum....
Re: Z-Wave und Rules -
Verfasst: 28. Jan 2019 20:43
von matze_bln
Du vergleichst für das Ein- oder Ausschalten nicht die Zahlenwerte sondern Strings. Ich vermute das geschieht zeichenweise von vorne, womit die 1 kleiner ist als 7. Zum Vergleich also nicht ...state.toString sondern das mit einem Cast nach Number, dann wird es klappen
Re: Z-Wave und Rules -
Verfasst: 29. Jan 2019 00:15
von udo1toni
Du verwendest hier in der ersten Rule explizit QuantityType in der zweiten Rule dann gar nicht.
Es ging mir im Übrigen nicht um den Weg, mit dem Du das Item erstellt hast, sondern um die exakte Definition. Das ist die große Hürde, wenn die Definition mit Paper UI geschieht. Kannst Du bitte einen Screenshot Deiner Itemdefinition schicken?
Man kann Strings außerdem nur auf Gleichheit und Ungleichheit vergleichen, nicht auf größer oder kleiner.
Wenn Du Items dieser Form hast:
sieht der korrekte Code so aus:
Code: Alles auswählen
rule "vergleich"
when
Item myTemp1 changed or
Item myTemp2 changed
then
if(myTemp1.state instanceof Number && myTemp2.state instanceof Number) {
if((myTemp1.state as Number ) < (myTemp2.state as Number )) {
logInfo("vergleich", "Temp1 ist kleiner als Temp2!")
}
else if((myTemp1.state as Number ) > (myTemp2.state as Number )) {
logInfo("vergleich", "Temp1 ist größer als Temp2!")
}
else {
logInfo("vergleich", "Temp1 ist ist gleich Temp2!")
}
}
end
Für Items der Form
sieht der korrekte Code so aus:
Code: Alles auswählen
rule "vergleich"
when
Item myTemp1 changed or
Item myTemp2 changed
then
if(myTemp1.state instanceof QuantityType && myTemp2.state instanceof QuantityType ) {
if((myTemp1.state as QuantityType<Number> ) < (myTemp2.state as QuantityType<Number> )) {
logInfo("vergleich", "Temp1 ist kleiner als Temp2!")
}
else if((myTemp1.state as QuantityType<Number> ) > (myTemp2.state as QuantityType<Number> )) {
logInfo("vergleich", "Temp1 ist größer als Temp2!")
}
else {
logInfo("vergleich", "Temp1 ist ist gleich Temp2!")
}
}
end
Re: Z-Wave und Rules -
Verfasst: 29. Jan 2019 10:07
von mario
Hi,
hier mal die von Hand definierten Items:
Code: Alles auswählen
Number Sauna_Solltemperatur "Soll [%.1f °C]" <temperature>
Number Temperatur_Sauna_2 "Temperatur Sauna [%.1f °C]" <temperature> {channel="zwave:device:743ffefe:node37:sensor_temperature"}
Die Items, die ich über die UI definiert habe als Anhang
Hier der Code meiner Rule:
Code: Alles auswählen
rule "vergleich"
when
Item Temperatur_Schlafzimmer changed
then
logInfo( "vergleich", Temperatur_Schlafzimmer.toString)
logInfo( "vergleich", Sauna_Solltemperatur.toString)
if(Temperatur_Schlafzimmer.state instanceof Number && Sauna_Solltemperatur.state instanceof Number ) {
if((Temperatur_Schlafzimmer.state as Number ) < (Sauna_Solltemperatur.state as Number )) {
logInfo("vergleich", "Temp ist kleiner als Soll!")
}
else if((Temperatur_Schlafzimmer.state as Number ) > (Sauna_Solltemperatur.state as Number )) {
logInfo("vergleich", "Temp ist größer als Soll!")
}
else {
logInfo("vergleich", "Temp ist ist gleich Soll!")
}
}
end
Das Ergebnis im Logfile sieht aber dann so aus:
Code: Alles auswählen
2019-01-29 09:54:54.158 [INFO ] [pse.smarthome.model.script.vergleich] - Temperatur_Schlafzimmer (Type=NumberItem, State=10.3999996185302734375 °C, Label=Temperatur Schlafzimmer, Category=Temperature)
2019-01-29 09:54:54.164 [INFO ] [pse.smarthome.model.script.vergleich] - Sauna_Solltemperatur (Type=NumberItem, State=12, Label=Soll, Category=temperature)
2019-01-29 09:54:54.183 [INFO ] [pse.smarthome.model.script.vergleich] - Temp ist größer als Soll!
Was natürlich nicht stimmt. Ich vergleiche doch jetzt Number mit Number, wie kann es sein, dass hier >< nicht funktioniert?
bin für jede Hilfe dankbar
Mario
Re: Z-Wave und Rules -
Verfasst: 29. Jan 2019 10:35
von udo1toni
Wie gesagt, es kommt darauf an, ob es sich um QuantityType handelt (das wären die Items Temperatur_Schlafzimmer und Sauna_Temperatur) oder um reine Number Items (die restlichen Items).
Da Du hier fröhlich gemischt hast, muss das beim Auswerten der Items entsprechend berücksichtigt werden:
Code: Alles auswählen
rule "vergleich"
when
Item Temperatur_Schlafzimmer changed
then
logInfo("vergleich", "Temperatur Schlafzimmer ist: {}, soll: {} °C",Temperatur_Schlafzimmer.state,Sauna_Solltemperatur.state)
if((Temperatur_Schlafzimmer.state instanceof QuantityTpe ) && Sauna_Solltemperatur.state instanceof Number ) {
if((Temperatur_Schlafzimmer.state as QuantityType<Number> ) < (Sauna_Solltemperatur.state as Number )) {
logInfo("vergleich", "Temp ist kleiner als Soll!")
}
else if((Temperatur_Schlafzimmer.state as QuantityType<Number> ) > (Sauna_Solltemperatur.state as Number )) {
logInfo("vergleich", "Temp ist größer als Soll!")
}
else {
logInfo("vergleich", "Temp ist ist gleich Soll!")
}
}
end