Seite 1 von 3
Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?
Verfasst: 10. Feb 2020 10:43
von SRX
Moin
das aktuelle Wetter brachte immer die Nachfrage der Besten aller Ehefrauen welche Windstärke gerade herrscht.
Openweatherbinding liefert mir die Windgeschrindigkeit in KM/h
Die Regel, wann welche Windstärke nach Beauforth herrscht, ist einfach.
Das habe ich dann einmal versucht in eine Regel zu packen
Code: Alles auswählen
rule "Beauforth_Scale"
when {channel="Weather_OWM_Wind_Speed"} < 1
var Beauforth= 0
var Beauforth_Text = "Stille"
if when {channel="Weather_OWM_Wind_Speed"} < 5
var Beauforth= 1
var Beauforth_Text = "schwacher Wind"
if when {channel="Weather_OWM_Wind_Speed"} < 11
var Beauforth= 2
Var Beauforth_Text = "schwacher Wind"
if when {channel="Weather_OWM_Wind_Speed"} < 19
var Beauforth= 3
var Beauforth_Text = "schwacher Wind"
if when {channel="Weather_OWM_Wind_Speed"} < 28
var Beauforth= 4
var Beauforth_Text = "mäßiger Wind"
if when {channel="Weather_OWM_Wind_Speed"} < 38
var Beauforth= 5
var Beauforth_Text = "frischer Wind"
if when {channel="Weather_OWM_Wind_Speed"} < 49
var Beauforth= 6
var Beauforth_Text = "starker Wind"
if when {channel="Weather_OWM_Wind_Speed"} < 61
var Beauforth= 7
var Beauforth_Text = "starker Wind"
if when {channel="Weather_OWM_Wind_Speed"} < 74
var Beauforth= 8
var Beauforth_Text = "starker Wind"
if when {channel="Weather_OWM_Wind_Speed"} < 88
var Beauforth= 9
var Beauforth_Text = "Sturm"
if when {channel="Weather_OWM_Wind_Speed"} < 102
var Beauforth= 10
var Beauforth_Text = "Schwerer Sturm"
if when {channel="Weather_OWM_Wind_Speed"} < 117
var Beauforth= 11
var Beauforth_Text = "orkanartiger Sturm"
if when {channel="Weather_OWM_Wind_Speed"} > 117
var Beauforth= 12
var Beauforth_Text = "Orkan"
Nur, wie bekomme ich die Werte in ein Item gepackt?
Kann mir da jemand auf die Sprünge helfen. Denn aus den Ausführungen auf openhab konnte ich so nicht nicht ableiten wie ich das jetzt umsetzen soll.
Ich vermute das bei mir das Problem 30cm vor der Tastatur sitzt
Danke schon einmal
Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?
Verfasst: 10. Feb 2020 11:36
von sihui
SRX hat geschrieben: ↑10. Feb 2020 10:43
Nur, wie bekomme ich die Werte in ein Item gepackt?
https://www.openhab.org/docs/configurat ... tem-states
Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?
Verfasst: 10. Feb 2020 13:35
von SRX
Blöde Frage
MyItem ist dann der Begriff für die Regel oder der Variablen welche ich in der Regel definiert habe?
Bezugnehmend auf meine definierte Regel:
Wie kann ich jetzt die Werte abrufen?
Denn ich erkenne noch nicht wie ich dem Item Beauforth_Number den Wert aus der Regel (Beauforth) zuweisen kann und dem Item Beauforth_Text
Denn wenn ich die Antwort richtig verstehe dann müsste ich ein Item Beauforth und ein Item Beauforth_text erstellen damit die Werte zugewiesen werden
Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?
Verfasst: 10. Feb 2020 14:29
von sihui
SRX hat geschrieben: ↑10. Feb 2020 13:35
Wie kann ich jetzt die Werte abrufen?
Deine Regel verstehe ich nicht mal ansatzweise und sie ist syntaktisch auch falsch. Du müsstest auch Fehlermeldungen in openhab.log angezeigt bekommen.
https://www.openhab.org/docs/tutorial/r ... nd-scripts
Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?
Verfasst: 10. Feb 2020 16:43
von Darkwin101
Also als erstes wie vorher schon gesagt wird deine Regel so nicht funktionieren da die Syntax falsch ist.
Ich würde mit >=1 und <=5 arbeiten.
Du musst Items anlegen und keine Variablen, Variablen werden nur in Rules genutzt und sind meines Wissens nach nicht nutzbar in einer Sitemap.
Ein sogenanntes Dummy Item ist einfach ein Item das nicht mit einemThing (Channel) verbunden ist.
Hier mal ein Beispiel aus meiner Wetter.items Datei
Code: Alles auswählen
Number:Speed localCurrentWindSpeed "Current wind speed [%.1f km/h]" <wind> { channel="openweathermap:weather-and-forecast:api:local:current#wind-speed" }
Number Beauforth
String Beauforth_Text
Und hier dann eine Beispiel Rule die entsprechend angepasst bzw. erweitert werden muss
Code: Alles auswählen
rule " Beauforth"
when
Item localCurrentWindSpeed received update
then
switch(localCurrentWindSpeed.state) {
case (((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) < 1 ) : { Beauforth.postUpdate(1) Beauforth_Text.postUpdate("Stille")}
case (((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) > 1 && ((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) < 45) : { Beauforth.postUpdate(2) Beauforth_Text.postUpdate("Wind")}
case (((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) > 45 ) : { Beauforth.postUpdate(3) Beauforth_Text.postUpdate("Starker Wind")}
}
end
So Text nochmal überarbeitet
MfG
Darkwin101
Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?
Verfasst: 10. Feb 2020 19:07
von SRX
Super, danke.
Das war's. Mir ist nun klar das eine Rule erst dann aktiv wird wenn sich der Wert eines Items ändert
Hier die vollständige Regel
Code: Alles auswählen
rule " Beauforth"
when
Item localCurrentWindSpeed received update
then
switch(localCurrentWindSpeed.state) {
case (((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) < 1 ) : { Beauforth.postUpdate(1) Beauforth_Text.postUpdate("Stille")}
case (((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) > 1 && ((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) <= 11) : { Beauforth.postUpdate(2) Beauforth_Text.postUpdate("Stille")}
case (((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) > 11 && ((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) <= 19) : { Beauforth.postUpdate(3) Beauforth_Text.postUpdate("schwacher Wind")}
case (((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) > 19 && ((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) <= 28) : { Beauforth.postUpdate(4) Beauforth_Text.postUpdate("schwacher Wind")}
case (((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) > 28 && ((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) <= 38) : { Beauforth.postUpdate(5) Beauforth_Text.postUpdate("Frischer Wind")}
case (((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) > 38 && ((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) <= 49) : { Beauforth.postUpdate(6) Beauforth_Text.postUpdate("starker Wind")}
case (((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) > 49 && ((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) <= 61) : { Beauforth.postUpdate(7) Beauforth_Text.postUpdate("starker Wind")}
case (((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) > 61 && ((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) <= 74) : { Beauforth.postUpdate(8) Beauforth_Text.postUpdate("starker Wind")}
case (((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) > 74 && ((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) <= 88) : { Beauforth.postUpdate(9) Beauforth_Text.postUpdate("Sturm")}
case (((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) > 88 && ((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) <= 102) : { Beauforth.postUpdate(10) Beauforth_Text.postUpdate("schwerer Sturm")}
case (((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) > 102 && ((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) <= 117) : { Beauforth.postUpdate(11) Beauforth_Text.postUpdate("orkanartiger Sturm")}
case (((localCurrentWindSpeed.state as QuantityType<Number>).floatValue) > 117 ) : { Beauforth.postUpdate(12) Beauforth_Text.postUpdate("Orkan")}
}
end
Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?
Verfasst: 10. Feb 2020 19:16
von Darkwin101
Nicht nur Items können eine Rule steuern, grundzätzlich kann es auch ein Channel sein sowie eine Bestimmte Zeit
Wichtig ist du hast einen Trigger (Auslöser).
Der ausgelöst wird und dann kommen die Bedingungen unter denen dann etwas "geschaltet" wird.
Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?
Verfasst: 10. Feb 2020 19:37
von Darkwin101
Wenn das ganze etwas eleganter sein soll kann mann das ganze auch so machen
Code: Alles auswählen
rule " Test"
when
Item localCurrentWindSpeed received update
then
val Number Wind = ((localCurrentWindSpeed.state as QuantityType<Number>).floatValue)
switch(Wind) {
case (Wind < 1 ) : { Beauforth.postUpdate(1) Beauforth_Text.postUpdate("Stille")}
case (Wind > 1 && (Wind < 40)) : { Beauforth.postUpdate(2) Beauforth_Text.postUpdate("Haha")}
case (Wind > 40 ) : { Beauforth.postUpdate(3) Beauforth_Text.postUpdate("HIHI")}
}
end
Hierbei wird das entfernen der Einheit km/h nur einmal gemacht und nicht jedesmal zudem etwas Übersichtlicher da nicht soviel Text.
Funktionstechnisch ist aber beides das gleiche
Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?
Verfasst: 10. Feb 2020 21:00
von lukh
Verstehe ich das Richtig, Du möchtest die Windgeschwindigkeit von km/h in Beauforth umgerechnet haben?
Warum nicht einfach mit Transformation?
Addon Scale Transformation
Die Windrichtungen sehen bei mir zum Beispiel so aus:
Code: Alles auswählen
[..10] = Nord
[20..30] = Nord Nordost
[40..50] = Nordost
[60..70] = Ost Nordost
[80..100] = Ost
[110..120] = Ost Südost
[130..140] = Südost
[150..160] = Süd Südost
[170..190] = Süd
[200..210] = Süd Südwest
[220..230] = Südwest
[240..250] = West Südwest
[260..280] = West
[290..300] = West Nordwest
[310..320] = Nordwest
[330..340] = Nord Nordwest
[350..360] = Nord
[..] = undefiniert
Und in der Sitemap wird das Item dann folgendermassen gesetzt:
Code: Alles auswählen
Text item=CurrentWindDirection
label="Windrichtung [SCALE(Windrichtung.scale):%s]"
icon="wind"
Für km/h in Beauforth wollte ich mir eh noch eine Transformation erstellen, bin aber zur Zeit auf anderen Baustellen unterwegs.
Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?
Verfasst: 11. Feb 2020 18:30
von peter-pan
...hier die Skala für Beaufort
beaufort.scale
Code: Alles auswählen
[..1.85[=0 Bft
[1.85..7.41[=1 Bft
[7.41..12.96[=2 Bft
[12.96..20.37[=3 Bft
[20.37..29.63[=4 Bft
[29.63..40.74[=5 Bft
[40.74..51.86[=6 Bft
[51.86..62.97[=7 Bft
[62.97..75.93[=8 Bft
[75.93..88.90[=9 BFt
[88.90..103.71[=10 Bft
[103.71..118.53[=11 Bft
[118.53..]=12 Bft
Im Detail ist das
hier erklärt von C. Weitkamp. Und dazu braucht's nicht mal 'ne Regel
