udo1toni hat geschrieben: ↑24. Mär 2020 11:24
Der Code iteriert über alle Gruppenmitglieder. Er prüft für jedes Item, ob es einen gültigen Wert zurück liefert. Ist das der Fall, zählt er einen Zähler hoch und addiert den Wert zu einer Summe. Zum Schluss prüft der Code, ob der Wert höher als der bisherige Maximalwert ist und ersetzt diesen, falls das der Fall ist.
Da ich es eh nicht lassen kann, einige kleine Anmerkungen:
- Es gibt eine Methode forEach, welche sich hier anbietet, um über die Gruppe zu iterieren.
- Wann immer möglich, sollte man keine Primitives verwenden. Hier also lieber Integer statt int
- Die Definition als Integer ist nur für lfCnt zwingend, da sonst die Abkürzung lfCnt+=1 fehlschlägt. lfAvg könnte dann natürlich auch einen Dezimalbruch enthalten, das sollte aber für die Funktion keine Rolle spielen.
Allgemein wird davon abgeraten, alle Variablen auf einen Typ festzulegen, da sich dadurch die Startzeit erhöht. Ob das stimmt, weiß ich nicht. 
- Die Rule sendet bei jedem Trigger ein postUpdate, gleichgültig, ob das notwendig ist oder nicht.
Hier die optimierte Version:
Code: Alles auswählen
rule "PluggitLuftfeuchtigkeit" // bestimme die durchschnittliche und maximale Luftfeuchte
when
Member of gPluggit_Items_Luftfeuchtigkeit changed
then
var lfSumme=0
var lfMax=0
var Integer lfCnt=0
gPluggit_Items_Luftfeuchtigkeit.members.filter[i |
i.state instanceof Number].forEach[ item |
lfCnt+=1
val Integer lf=(item.state as Number).intValue
lfSumme+=lf
if (lf>lfMax) lfMax=lf
]
var lfAvg
if (lfCnt>=2) // nur bei mindestens 2 Werten ist es sinnvoll, die Werte zu betrachten
lfAvg=(lfSumme/lfCnt).intValue
else {
lfAvg=0
lfMax=0
}
var newState=Pluggit_Status_Luftfeuchte.state
if (lfMax>=65 || lfAvg>=60) newState=ON // Bei mehr als max 65% oder avg 60% Luftfeuchtigkeit lüfte.
else if (lfMax<60) newState=OFF // fällt die Luftfeuchte aller Stationen unter 60%, wurde genug gelüftet
if(Pluggit_Status_Luftfeuchte.state != newState)
Pluggit_Status_Luftfeuchte.postUpdate(newState)
end
Hi Udo,
VsCode mault leider rum
Code: Alles auswählen
{
"resource": "/Volumes/openHAB-conf/rules/test.rules",
"owner": "_generated_diagnostic_collection_name_#0",
"code": "org.eclipse.xtext.xbase.validation.IssueCodes.invalid_mutable_variable_access",
"severity": 8,
"message": "Cannot refer to the non-final variable lfCnt inside a lambda expression",
"startLineNumber": 10,
"startColumn": 9,
"endLineNumber": 10,
"endColumn": 14
}
Code: Alles auswählen
{
"resource": "/Volumes/openHAB-conf/rules/test.rules",
"owner": "_generated_diagnostic_collection_name_#0",
"code": "org.eclipse.xtext.xbase.validation.IssueCodes.incompatible_types",
"severity": 8,
"message": "Type mismatch: cannot convert from int to Integer",
"startLineNumber": 10,
"startColumn": 14,
"endLineNumber": 10,
"endColumn": 16
}
Code: Alles auswählen
{
"resource": "/Volumes/openHAB-conf/rules/test.rules",
"owner": "_generated_diagnostic_collection_name_#0",
"code": "org.eclipse.xtext.xbase.validation.IssueCodes.invalid_mutable_variable_access",
"severity": 8,
"message": "Cannot refer to the non-final variable lfSumme inside a lambda expression",
"startLineNumber": 12,
"startColumn": 9,
"endLineNumber": 12,
"endColumn": 16
}
Code: Alles auswählen
{
"resource": "/Volumes/openHAB-conf/rules/test.rules",
"owner": "_generated_diagnostic_collection_name_#0",
"code": "org.eclipse.xtext.xbase.validation.IssueCodes.invalid_mutable_variable_access",
"severity": 8,
"message": "Cannot refer to the non-final variable lfMax inside a lambda expression",
"startLineNumber": 13,
"startColumn": 16,
"endLineNumber": 13,
"endColumn": 21
}
Code: Alles auswählen
{
"resource": "/Volumes/openHAB-conf/rules/test.rules",
"owner": "_generated_diagnostic_collection_name_#0",
"code": "org.eclipse.xtext.xbase.validation.IssueCodes.invalid_mutable_variable_access",
"severity": 8,
"message": "Cannot refer to the non-final variable lfMax inside a lambda expression",
"startLineNumber": 13,
"startColumn": 23,
"endLineNumber": 13,
"endColumn": 28
}
Code: Alles auswählen
{
"resource": "/Volumes/openHAB-conf/rules/test.rules",
"owner": "_generated_diagnostic_collection_name_#0",
"code": "org.eclipse.xtext.xbase.validation.IssueCodes.missing_type",
"severity": 8,
"message": "Type cannot be derived",
"startLineNumber": 15,
"startColumn": 9,
"endLineNumber": 15,
"endColumn": 14
}
Code: Alles auswählen
{
"resource": "/Volumes/openHAB-conf/rules/test.rules",
"owner": "_generated_diagnostic_collection_name_#0",
"code": "org.eclipse.xtext.xbase.validation.IssueCodes.incompatible_types",
"severity": 8,
"message": "Type mismatch: type int is not applicable at this location",
"startLineNumber": 17,
"startColumn": 15,
"endLineNumber": 17,
"endColumn": 39
}
Code: Alles auswählen
{
"resource": "/Volumes/openHAB-conf/rules/test.rules",
"owner": "_generated_diagnostic_collection_name_#0",
"code": "org.eclipse.xtext.xbase.validation.IssueCodes.incompatible_types",
"severity": 8,
"message": "Type mismatch: type int is not applicable at this location",
"startLineNumber": 19,
"startColumn": 15,
"endLineNumber": 19,
"endColumn": 16
}
Schon wieder Böhmische Dörfer für mich... :/