Seite 1 von 2

Status Summary Items Fehler in Rule

Verfasst: 5. Jan 2020 22:12
von lukh
Ich beschäftige mich gerade mit Status Summary Items
und bekomme diese Regel nicht zum laufen.

Code: Alles auswählen

rule "Status Summary Wind"
when
  Item CurrentWindSpeed changed or
  Item CurrentWindDirection changed
then
  var Number wg = ((CurrentWindSpeed.state as DecimalType).floatValue)
  var wr = transform("SCALE", "Windrichtung.scale", CurrentWindDirection.state.toString)

  var String Ausgabe = String::format("%1$.0f km/h aus " +wr, wg)
  SummaryStateWind.postUpdate(Ausgabe)
end
Folgende Fehlermeldung bekomme ich im openhab.log:

Code: Alles auswählen

[ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Status Summary Wind': Could not cast 18.36 km/h to org.eclipse.smarthome.core.library.types.DecimalType; line 6, column 19, length 37
Die Itemdefinition:

Code: Alles auswählen

// Status Summary Items
String SummaryStateWind

// Windrichtung
Number:Angle           CurrentWindDirection         "Windrichtung [%s]"                   <wind>          (gWetter)    {channel="openweathermap:weather-and-forecast:ccb4336f:local:current#wind-direction"}

// Windgeschwindigkeit  
Number:Speed           CurrentWindSpeed             "Windgeschwindigkeit [%d km/h]"       <wind>          (gWetter)    {channel="openweathermap:weather-and-forecast:ccb4336f:local:current#wind-speed"}
und die Transformation für die Windrichtung:

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
Kann mir bitte jemand einen Tipp geben, worauf ich schauen muss?

Re: Status Summary Items Fehler in Rule

Verfasst: 5. Jan 2020 23:33
von udo1toni
Das Problem ist hier UoM, 18.36 km/h ist kein DecimalType, wohl aber vom Typ Number (eigentlich QuantityType<Number>), die Rule sollte also so funktionieren:

Code: Alles auswählen

rule "Status Summary Wind"
when
    Item CurrentWindSpeed changed or
    Item CurrentWindDirection changed
then
    var Number wg = (CurrentWindSpeed.state as Number).floatValue
    var wr = transform("SCALE", "Windrichtung.scale", CurrentWindDirection.state.toString)
    var String Ausgabe = String::format("%1$.0f km/h aus " +wr, wg)
    SummaryStateWind.postUpdate(Ausgabe)
end

Re: Status Summary Items Fehler in Rule

Verfasst: 7. Jan 2020 19:38
von lukh
Das hat funktioniert. Ich danke Dir!

Allerdings verstehe ich das nicht so ganz.
18.36 ist doch eine Dezimalzahl.
Was ist denn mit DecimalType genau gemeint?

Re: Status Summary Items Fehler in Rule

Verfasst: 12. Jan 2020 01:04
von udo1toni
Es ist eben keine Zahl, sondern eine einheitenbehaftete Number. DecimalType ist ein ein Teil von Number, aber nicht umgekehrt.
Strenggenommen müsste man eigentlich

Code: Alles auswählen

var Number wg = (CurrentWindSpeed.state as QuantityType<Number>).floatValue
schreiben, aber das ist so sperrig...

Re: Status Summary Items Fehler in Rule

Verfasst: 10. Feb 2020 22:01
von OliverCJ
Guten Abend,

ich würde mich hier gerne mal ranhängen, da ich genau mit der gleichen Rule arbeite. Ich hatte sie mir nur aus dem Buch von Marianne Spiller gezogen. Dort sieht sie so aus:

Code: Alles auswählen

rule "Status Summary Wind"

when
    Item localCurrentWindSpeed changed or
    Item localCurrentWindDirection changed
then
    var Number wg = ((localCurrentWindSpeed.state as Number).floatValue)
    var wr = transform("SCALE", "Windrichtungen.scale", localCurrentWindDirection.state.toString)
    var String Ausgabe = String::format("%1$.0f km/h aus " +wr, wg)
    SummaryStateWind.postUpdate(Ausgabe)
end
Bei der Definition von WG sind also zwei Klammern gesetzt. Da es aber trotzdem nicht ging bzw. geht habe ich dann hier geforscht und die Rule von Udo gefunden. Damit ging es aber überhaupt nicht... also zusätzliche Klammern wieder hin.

Wenn ich nun im VSC z.B. im when-Bereich über ein item fahre, bekomme ich einen Wert angezeigt (41,25 kmh). Fahre ich mit dem Mauszeiger über "SummaryStateWind" am Ende vom Then, werden mit ganz andere Werte angezeigt (z.B. 44 km/h).

Und bei der Windrichtung erfolgt einfach keine Transformation in die Windrichtung. openweathermap liefert die Gradangabe in ein number:Angle item, also UOM. Da habe ich zwar auch mal versucht eine Zeile in die rule zu bauen, aber die war wohl so falsch, dass die BasicUI nicht mehr geladen wird.

Das Log gibt folgendes her:

Code: Alles auswählen

21:42:31.098 [ERROR] [untime.internal.engine.RuleEngineImpl] - Rule 'Status Summary Wind': Could not cast 46.44 km/h to org.eclipse.smarthome.core.library.types.DecimalType; line 7, column 23, length 42
21:42:31.112 [ERROR] [untime.internal.engine.RuleEngineImpl] - Rule 'Status Summary Wind': Could not cast 46.44 km/h to org.eclipse.smarthome.core.library.types.DecimalType; line 7, column 23, length 42
Und um nicht außen vor zu lassen, hier noch meine "Windrichtungen.scale":

Code: Alles auswählen

[0..23] = Nord
]23..68] = Nordost
]68..113] = Ost
]113..158] = Südost
]158..203] = Süd
]203..248] = Südwest
]248..293] = West
]293..338] = Nordwest
]338..360] = Nord
- = unbekannt
Ich geh jetzt ins Bett und lese noch ein wenig Kapitel 22 "Regelwerke oder Rules"... aber wenn vorher jemand eine Idee hat.., Danke!

Gute Nacht!

Re: Status Summary Items Fehler in Rule

Verfasst: 10. Feb 2020 23:27
von lukh
Bei mir schaut es immer noch unverändert aus:

Code: Alles auswählen

rule "Status Summary Wind"
    when
        Item CurrentWindSpeed changed or
        Item CurrentWindDirection changed
    then
        var Number wg = ((CurrentWindSpeed.state as Number).floatValue)
        var wr = transform("SCALE", "Windrichtung.scale", CurrentWindDirection.state.toString)

        var String Ausgabe = String::format("%1$.0f km/h aus " +wr, wg) SummaryStateWind.postUpdate(Ausgabe)
end

rule "Status Summary Vorhersage"
    when
        Item ForecastHours24Condition changed or
        Item ForecastHours24MaxTemperature changed
    then
        var Number max = ((ForecastHours24MaxTemperature.state as Number).floatValue)
        var lage = (ForecastHours24Condition.state.toString)

        var String Ausgabe = String::format("%s bei %.0f°C", lage, max) SummaryStateVorhersage.postUpdate(Ausgabe)
end

rule "Status Summary Aktuell"
    when 
        Item CurrentCondition changed or
        Item CurrentTemperature changed
    then
        var Number temp = ((CurrentTemperature.state as Number).floatValue)
        var lage = (CurrentCondition.state.toString)

        var String Ausgabe = String::format("%s bei %.1f°C", lage, temp) SummaryStateAktuell.postUpdate(Ausgabe)
end
Und die Items dazu:

Code: Alles auswählen

String SummaryStateWind
String SummaryStateVorhersage
String SummaryStateAktuell
Habe das auch so aus dem Buch übernommen und funktioniert, nachdem ich durch die Hilfe von Udo, das state as Number gesetzt habe.

Wegen den unterschiedlichen Werten schaue doch mal in die Konsole und frag mal den Wert des Items ab.
Aktualisiere in VSC die Items und Things und schau dann mal, ob die Werte immer noch unterschiedlich sind.
Mehr fällt mir jetzt auch nicht ein.

Die Transformationen hast Du installiert?

Re: Status Summary Items Fehler in Rule

Verfasst: 11. Feb 2020 02:08
von udo1toni
Wenn CurrentWindDirection ein UoM Item ist, muss es vor dem Füttern der Scale Transformation erst von seiner Einheit befreit werden, also

Code: Alles auswählen

(CurrentWindDirection.state as Number).intValue.toString
Manchmal muss man tatsächlich einen Ausdruck zusätzlich klammern, im vorliegenden Fall wundert mich das. Ich hab den Code aber nicht ausprobiert, mag also sein, dass es hier notwendig ist.

Was die geänderte Zahl betrifft, so ist String::format() ein formatierter String. %1$.0f bedeutet, die Zahl ohne Nachkommastellen zu formatieren.

Re: Status Summary Items Fehler in Rule

Verfasst: 11. Feb 2020 07:29
von OliverCJ
Guten Morgen und vielen Dank schon mal!

Irgendwas hat sich heute Nacht getan, obwohl ich wirklich nur gelesen habe. Das Item bekommt jetzt die richtigen Werte. Dafür nutze ich ausnahmsweise mal einen Screenshot:
SummaryState.PNG
Das Item zeigt mir also schon im VSC den gewünschten String korrekt an, wenn ich ihn mit der Maus überfahre. Oben in meiner sitemap-Datei.

Aber warum bleibt die Sitemap trotzdem leer? Der String/Text/Wert wird dort einfach nicht ausgegeben:
Sitemap.PNG
Versteh ich nicht :(

@Udo:
Das die Formatierung die Nachkommastellen abschneidet ist klar. Hier ging es aber tatsächlich um völlig unterschiedliche Werte (41 vs 44).

Re: Status Summary Items Fehler in Rule

Verfasst: 11. Feb 2020 14:26
von peter-pan
....ich hab die Regel mal genommen und bei mir getestet (mit meinen Items). So funktioniert es:

Code: Alles auswählen

rule "test Wind"
when
  Item Dummy1 changed to ON or
  Item localHourlyForecastWindDirection_00 changed
then
  var Number wg = ((localHourlyForecastWindSpeed_00.state as QuantityType<Number>).floatValue)
  var wr = transform("SCALE", "wind.scale", localHourlyForecastWindDirection_00.state.toString)

  var String Ausgabe = String::format("%1$.0f km/h aus " +wr, wg) 
  logInfo("test_wind","Der Wind bläst mit " + Ausgabe)
  SummaryStateWind.postUpdate(Ausgabe)
end
Dummy1 ist ein Testschalter. (Weil ich zu ungeduldig bin um auf den anderen Trigger zu warten). Windgeschwindigkeit und Richtung sind meine Item-Definitionen.
Die Skala heisst bei mir "wind.scale" und ist ohne "-=unbekannt" und sieht auch etwas "anders aus". Soweit ich weiss soll man bei Scale-Transformationen nur numerische Werte verwenden.

Code: Alles auswählen

[0..11.25[ = Nord
[11.25..33.75[ = NordNordOst
[33.75..56.25[ = NordOst
[56.25..78.75[ = OstNordOst
[78.75..101.25[ = Ost
[101.25..123.75[ = OstSüdOst
[123.75..146.25[ = SüdOst
[146.25..168.75[ = SüdSüdOst
[168.75..191.25[ = Süd
[191.25..213.75[ = SüdSüdWest
[213.75..236.25[ = SüdWest
[236.25..258.75[ = WestSüdWest
[258.75..281.25[ = West
[281.25..303.75[ = WestNordWest
[303.75..326.25[ = NordWest
[326.25..348.75[ = NordNordWest
[348.75..360[ = Nord
[360..999] = Keiner weiss es
Das Ergebnis im Logger:

Code: Alles auswählen

2020-02-11 14:10:38.785 [INFO ] [pse.smarthome.model.script.test_wind] - Der Wind bläst mit 37 km/h aus WestSüdWest
und das Ergebnis in der Sitemap:
wind.jpg
.items (Summuary....)

Code: Alles auswählen

String SummaryStateWind            "Der Wind, der Wind ....[%s]"
.sitemap

Code: Alles auswählen

Text item=SummaryStateWind
Vielleicht interessiert euch auch noch diese Herangehensweise, um mit etwa auftretenden Warnungen klar zu kommen. Das war die Basis für meine Regel.

Re: Status Summary Items Fehler in Rule

Verfasst: 11. Feb 2020 20:36
von lukh
Mir fällt gerade etwas auf..

Code: Alles auswählen

[0..23] = Nord
]23..68] = Nordost
]68..113] = Ost
]113..158] = Südost
]158..203] = Süd
]203..248] = Südwest
]248..293] = West
]293..338] = Nordwest
]338..360] = Nord
Sieht so deine Scale Datei aus?

Ändere bitte die eckigen Klammern.
Nicht ]Wert] sondern [Wert]