Seite 1 von 6
Rules
Verfasst: 26. Jan 2019 17:12
von matze.lingen
Moin zusammen,
ich verstehe es einfach nicht

Ich versuche eine Regel zu bauen die bei Temperaturen unter 0 Grad eine Telegramm Nachricht versendet. Aber wie bin ich zu dämlich dafür:
Code: Alles auswählen
/Temperatur Stall
rule "Temp_Stal_rule"
when
Item Stall_Temp received update
then
if (Stall_Temp > ) 25{
}
else
if (Temper.state < 25) {
sendTelegram("bot1", "Stall Temperatur ist nun %.1f")
}
end
Kann mir jemand sagen an welcher stelle ich zu dumm bin

Danke und Gruß
Matze
Re: Rules
Verfasst: 26. Jan 2019 20:07
von mamoel
Die Regel ist ein wenig seltsam.
Mal schreibst Du "Stall_Temp", mal "Temper".
Im Teil mit "sendTelegram" fehlt die Übergabe des Wertes.
Was funktionieren müsste:
Code: Alles auswählen
rule "Temp_Stall_rule"
when
Item Stall_Temp received update
then
logInfo("bot1", "Stalltemperatur: " + Stall_Temp.state)
var DecimalType sTemp = Stall_Temp.state as DecimalType
if (sTemp > 25) {
}
else if (sTemp < 25) {
sendTelegram("bot1", "Stall Temperatur ist nun: " + Stall_Temp.state)
}
end
Falls das nicht klappt, poste bitte, was im Log als "Stalltemperatur: " angezeigt wird.
Re: Rules
Verfasst: 26. Jan 2019 20:39
von peter-pan
Hallo Matze,
die erste 25 muss auf jeden Fall mal in der Klammer stehen. Du schreibst aber einmal von 0 Grad und fragst dann aber 25 ab. Und dann frägst du noch zwei verschiedene Variablen ab.
Vielleicht gibst du noch ein paar Hintergrundinformationen dazu und evtl. die enstprechenden Items aus deiner .items Datei.
Gruss - Peter
Re: Rules
Verfasst: 26. Jan 2019 23:09
von udo1toni
Die rule von mamoel sieht schon mal viel besser aus als die initiale
Um ein wenig Licht rein zu bringen: Stall_Temp ist ja offensichtlich ein Item. Du möchtest aber den Status des Items vergleichen, also musst Du Stall_Temp.state verwenden. Nun ist ein Status erstmal ein ein Status, Du möchtest den Status aber als Zahl betrachten (man kann nur Zahlen mit einem > oder < vergleichen). Das Problem hierbei ist, dass ein Status eines Number Items nicht automatisch vom Typ Number ist. Die korrekte Lösung ist also noch ein Stückchen komplizierter, wenn man es sauber lösen möchte:
Code: Alles auswählen
rule "Temp_Stal_rule"
when
Item Stall_Temp changed
then
if(Stall_Temp.state instanceof Number) {
val Number nTemp = Stall_Temp.state as Number
if(nTemp < 0) {
sendTelegram("bot1", "Stall Temperatur ist nun {}",nTemp)
}
}
end
Das Setzen der Konstanten nTemp ist hier sinnvoll, da derselbe Wert mehrfach verwendet wird. Der bessere Trigger ist hier changed, um zumindest einige Meldungen zu vermeiden.
Überhaupt bietet es sich an, dafür zu sorgen, dass nicht alle paar Sekunden eine Alarmmeldung gesendet wird, nur weil die Temperatur immer noch unter 0 ist.
Falls Stall_Temp mit UoM konfiguriert ist, muss man dem in der Rule Rechnung tragen, es ist also selbst bei solch simplen Aufgaben sinnvoll, mindestens die Item Definition mit anzugeben.
Re: Rules
Verfasst: 28. Jan 2019 00:15
von peter-pan
Hier noch eine Version von mir(für die UoM-Version):
Code: Alles auswählen
rule "Temp_Stal_rule"
when
Item Stall_Temp changed
then
var nTemp = (Stall_Temp.state as Number).floatValue
if(nTemp < 0) {
sendTelegram("bot1", "Stall Temperatur ist nun {}",nTemp)
}
end
Aber wie @udo1toni sagte, diese Rule triggert immer wieder so lange der Wert unter 0 bleibt und er sich in diesem Bereich immer wieder ändert.
Re: Rules
Verfasst: 28. Jan 2019 08:56
von matze.lingen
Hey,
erstmal Danke für die zahlreichen Antworten. Was bedeutet UoM?
Ich habe alles mit Normalen Item Definitionen gemacht ohne Weboberfläche...
Ich möchte es gerne so haben das sobald die Temeratur unter 0 fällt er auch jedes mal eine Nachricht sendet wenn die Temperatur kälter wird. Bsp. ab -5 Grad wieder usw. Geht das so? Wie kann ich es verhindern dass bei jeder Änderung eine E-Mail Angetriggert wird?
Habt ihr noch gute Lecktüre damit ich das besser verstehen kann?
Vielen Dank
Gruß
Matze
Re: Rules
Verfasst: 28. Jan 2019 10:57
von mamoel
'UoM' steht für Unit of Measurement. Dies ist dann relevant, wenn das in deinem Itemfile z.B. so deklariert wurde:
Code: Alles auswählen
Number:Temperature temperature "Outside [%.2f °F]" { channel="...:current#temperature" }
Deshalb wäre es hilfreich, wenn du uns den Inhalt deines Itemfiles oder zumindest den Teil, wo 'Stall_Temp' erzeugt wird hier rein posten würdest.
Als nächstes müssten wir auch wissen, was genau du erreichen möchtest.
Bei welchen Schwellwerten möchtest du eine Nachricht? Und dann nur bei sinkender Temperatur (dann könnte man den neuen Wert immer mit dem Vorgängerwert 'previousState' vergleichen)? Was soll passieren, wenn die Temperatur von z.B. -5.2°C auf -4.9°C steigt?
Einiges an Info gibt es
hier.
Re: Rules
Verfasst: 28. Jan 2019 11:47
von matze.lingen
Moin,
vielen dank. Hier mal ein Auszug aus dem default.items:
Code: Alles auswählen
Number Stall_Temp "Temperatur [%.1f *C]" <temperature> (gTemperature, gStall) [ "CurrentTemperature" ] {mqtt="<[openhub:stall/temp:state:default]"}
Number Stall_F "Luftfeuchtigekeit [%.1f %%]" <temperature> (gTemperature, gStall) {mqtt="<[openhub:stall/f:state:default]"}
Re: Rules
Verfasst: 28. Jan 2019 23:34
von udo1toni
Die UoM-Version sieht aber erheblich anders aus!
Code: Alles auswählen
rule "Temp_Stal_rule"
when
Item Stall_Temp changed
then
if(Stall_Temp.state instanceof QuantityType) {
val Number nTemp = Stall_Temp.state as QuantityType<Number>
if(nTemp < 0) {
sendTelegram("bot1", "Stall Temperatur ist nun {}",nTemp)
}
}
end
Da ein Item entweder QuantityType oder Number sein kann, aber niemals beides gleichzeitig, muss man sich in der Rule nicht um beide Varianten kümmern, aber berücksichtigen, welche Art Item man nun verwendet. Deine Items nutzen jedenfalls kein UoM. Wenn Du z.B. Netatmo verwendest, musst Du zwangsweise UoM verwenden (dafür kann man sich die Messwerte aber auch beliebig ausgeben lassen, z.B. Temperaturen als °C oder °F, ganz ohne Rumgerechne, oder statt m/s km/h)

Re: Rules
Verfasst: 29. Jan 2019 14:15
von matze.lingen
ok dann noch einmal mit hilfe

wie bekomme ich es nun hin das er nur einmal meldet wenn die Temperatur unter 0 Grad Sinkt und dann erst wieder wenn die Temperatur bei -5 ist und dann bei -10? und wie würde eine Regel aussehen, dass wenn das letzt Update länger als 12 Stunden her ist er mir eine nachricht sendet?
Dann muss ich mich nochmal richtig schlau lesen
Danke und Gruß
Matthias