Die Frage ist: funktioniert
wie gewünscht?
Deine Rule sieht schon mal nicht schlecht aus, allerdings gibt es da doch Verbesserungspotiential

Zum einen gibt es in der Rules DSL exakt einen Befehl, bei dem man ein Semikolon dazu schreiben sollte, das ist
return; Bei allen anderen Befehlen hat das Semikolon nichts zu suchen.
Das Andere ist Dir sicher schon aufgefallen, die Rule hat ihre Längen

Dazu habe ich aber zuerst noch eine Frage, nämlich: ist die Anzahl der übergebenen Werte tatsächlich variabel? und werden dann tatsächlich die letzten Werte nicht gebraucht?
Sinnvoller wäre es, die Items in diesem Fall durchzunumerieren (das geht auch zusätzlich zum eigentlichen Namen):
Code: Alles auswählen
String te923_raw "[%s]" {channel="exec:command:te923cmd:output"}
Number te923_t0_01 "Temperature 0 [%.1f °C]" <temperature> (gTe923)
Number te923_h0_02 "Humidity 0 [%.0f %%]" <humidity> (gTe923)
Number te923_t1_03 "Temperature 1 [%.1f °C]" <temperature> (gTe923)
Number te923_h1_04 "Humidity 1 [%.0f %%]" <humidity> (gTe923)
Number te923_t2_05 "Temperature 2 [%.1f °C]" <temperature> (gTe923)
Number te923_h2_06 "Humidity 2 [%.0f %%]" <humidity> (gTe923)
Number te923_t3_07 "Temperature 3 [%.1f °C]" <temperature> (gTe923)
Number te923_h3_08 "Humidity 3 [%.0f %%]" <humidity> (gTe923)
Number te923_t4_09 "Temperature 4 [%.1f °C]" <temperature> (gTe923)
Number te923_h4_10 "Humidity 4 [%.0f %%]" <humidity> (gTe923)
Number te923_t5_11 "Temperature 5 [%.1f °C]" <temperature> (gTe923)
Number te923_h5_12 "Humidity 5 [%.0f %%]" <humidity> (gTe923)
Number te923_press_13 "Pressure [%.1f mBar]" <pressure> (gTe923)
Number te923_uv_14 "UV [%.0f]" <sun> (gTe923)
// The external part of my weather station is HS, don't hesitate to uncomment...
Number te923_fc_15 "Forecast [%.0f]" <clouds> (gTe923)
Number te923_storm_16 "Storm Warning [%.0f]" <wind> (gTe923)
Number te923_wd_17 "Wind Direction [%.1f]" <sun> (gTe923)
Number te923_ws_18 "Wind Speed [%.1f] m/s" <sun> (gTe923)
Number te923_wg_19 "Wind Gust speed [%.1f] m/s" <sun> (gTe923)
Number te923_wc_20 "Windchill temperature [%.1f] °c" <sun> (gTe923)
Number te923_rc_21 "Rain Counter [%.0f]" <sun> (gTe923)
Nun wird der Code "etwas" kürzer:
Code: Alles auswählen
// globale Variablen werden zu Beginn der Datei definiert!
var s = ["0","0"]
// unixdate:T0:H0:T1:H1:T2:H2:T3:H3:T4:H4:T5:H5:PRESS:UV:FC:STORM:WD:WS:WG:WC:RC
// T0 - temperature from internal sensor in °C
// H0 - humidity from internal sensor in % rel
// T1..5 - temperature from external sensor 1..5 in °C
// H1..5 - humidity from external sensor 1...5 in % rel
// PRESS - air pressure in mBar
// UV - UV index from UV sensor
// FC - station forecast, see below for more details
// STORM - stormwarning; 0 - no warning, 1 - fix your dog
// WD - wind direction in n x 22.5°; 0 -> north
// WS - wind speed in m/s
// WG - wind gust speed in m/s
// WC - windchill temperature in °C
// RC - rain counter (maybe since station starts measurement) as value
rule "Process data from TE923"
when
Item te923_raw received update
then
s = te923_raw.state.toString.split(":")
if (s.size<22 || s.size>25) { // .size sollte die Anzahl der Felder sein.
logWarn("te923", "te923_raw is not of the expected format: {}",te923_raw.state)
return;
}
gTe923.members.forEach[ i |
val myNum = Integer::parseInt(i.name.split("_").get(2))
val t = s.get(myNum)
if(!t.equals("i"))
i.postUpdate(t)
]
end
Der Block mit der Erklärung, wie das Datentelegramm aufgebaut ist, ist schön für die Dokumentation, allerdings könnte man das vielleicht woanders notieren
Der Code splittet wie gehabt den Raw Code und durchläuft anschließend die Gruppe der Items, die zu der Wetterstation gehören. Da im Namen des Items die Nummer der Wertes angegeben ist, muss nur der entsprechende Wert übertragen werden.
Ein wichtiges Detail ist hierbei, dass ich nicht
sendCommand() verwende, sondern
postUpdate().
postUpdate() setzt den Status,
sendCommand() sendet einen Befehl. Solange ein Item nicht mit einem Binding gekoppelt ist, gibt es keinen Empfänger für einen solchen Befehl. openHAB führt automatisch ein
postUpdate() aus, sobald es ein
sendCommand() empfängt, aber warum über Bande, wenn es auch direkt geht?
Die Methode ist grundsätzlich der Action vorzuziehen, da sie weniger kritisch auf die verschiedenen Datentypen reagiert (das hängt damit zusammen, dass die Methode Kenntnis vom Datentyp des Items hat, was der Action verwehrt bleibt).
Es müssen auch nicht alle Items angelegt werden, nur die Nummer muss natürlich stimmen. Wenn Du also z.B. nur einen exernen Sensor hast, lässt Du die anderen Temperatur/Luftfeuchte Items einfach weg, das Item für Pressure behält aber die 13 am Ende. Die Gruppe der Items ist dann halt kleiner und die Rule schreibt entsprechend weniger Werte in die Items.