Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

SRX
Beiträge: 60
Registriert: 15. Okt 2019 19:50
Answers: 0

Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?

Beitrag 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
von lukh » 10. Feb 2020 21:00
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.
Gehe zur vollständigen Antwort

Benutzeravatar
sihui
Beiträge: 1827
Registriert: 11. Apr 2018 19:03
Answers: 21

Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?

Beitrag 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

Code: Alles auswählen

MyItem.postUpdate(<new_state>)
openHAB3 mit Zwave, Alexa, ESPEasy, MQTT, Logitech Harmony, Philips HUE und ZigBee Hardware auf Proxmox VE.

SRX
Beiträge: 60
Registriert: 15. Okt 2019 19:50
Answers: 0

Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?

Beitrag 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

Benutzeravatar
sihui
Beiträge: 1827
Registriert: 11. Apr 2018 19:03
Answers: 21

Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?

Beitrag 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
openHAB3 mit Zwave, Alexa, ESPEasy, MQTT, Logitech Harmony, Philips HUE und ZigBee Hardware auf Proxmox VE.

Darkwin101
Beiträge: 424
Registriert: 6. Mär 2019 11:19
Answers: 14

Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?

Beitrag 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

SRX
Beiträge: 60
Registriert: 15. Okt 2019 19:50
Answers: 0

Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?

Beitrag 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

Darkwin101
Beiträge: 424
Registriert: 6. Mär 2019 11:19
Answers: 14

Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?

Beitrag 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.

Darkwin101
Beiträge: 424
Registriert: 6. Mär 2019 11:19
Answers: 14

Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?

Beitrag 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

Benutzeravatar
lukh
Beiträge: 99
Registriert: 5. Dez 2019 20:15
Answers: 2

Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?

Beitrag 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.

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Wie erstelle ich ein Item welches die Daten von einer Regel bekommt?

Beitrag 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 :lol:
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Antworten