Ja, wenn Du rrd4j verwenden willst und diese nicht default Persistence ist, musst Du den Namen der Persistence mit angeben. Ansonsten musst Du außerdem Dein if-Statement ebenfalls ändern, so hat das keinen Sinn.
Korrekt wäre
val Number nPV = if(PVLeistung.averageSince(now.minusMinutes(1), "rrd4j") instanceof Number) (PVLeistung.averageSince(now.minusMinutes(1), "rrd4j") as Number).floatValue else 0
val Number nHaus = if(StromBedarf.averageSince(now.minusMinutes(1), "rrd4j") instanceof Number) (StromBedarf.averageSince(now.minusMinutes(1), "rrd4j") as Number).floatValue else 2000
Die Idee der Prüfung ist ja, einen Defaultwert zu setzen, falls die Funktion keinen gültigen Wert liefert.
Invalid number of arguments. The method createTimer(AbstractInstant, Procedure0) is not applicable for the arguments (DateTime)(org.eclipse.xtext.xbase.validation.IssueCodes.invalid_number_of_arguments)
Hi Udo. Erstmal vielen Dank für Deine vielen Rückmeldungen. Die Rule funktionert soweit bis auf eine Kleinigkeit. Natürlich sollte ich vorher abfragen ob der Mittelwert verügbar ist. Ist natürlich nicht aufgefallen, da der Wert vorhanden ist.
val Number nPV = if(PVLeistung.averageSince(now.minusMinutes(1), "rrd4j") instanceof Number) (PVLeistung.averageSince(now.minusMinutes(1), "rrd4j") as Number).floatValue else 0
val Number nHaus = if(StromBedarf.averageSince(now.minusMinutes(1), "rrd4j") instanceof Number) (StromBedarf.averageSince(now.minusMinutes(1), "rrd4j") as Number).floatValue else 2000
Sicher, dass das eine Fehlermeldung ist? Für mich liest sich das eher wie ein Warning.
Grundsätzlich wird das .floatValue an dieser Stelle unnötig sein, da rrd4j gar nicht in der Lage ist, mit UoM umzugehen. Wobei das natürlich ausschließlich für die Version 1.1x gilt, in der kommenden Version 3.0 kann das mit UoM ganz anders aussehen (ich habe mich bisher damit noch nicht auseinandergesetzt und habe es nicht weiter verfolgt... könnte sein, dass es da auch ein Upgrade gegeben hat...)
if((PVLeistung.averageSince(now.minusMinutes(5), "rrd4j") as Number) (PVLeistung.averageSince(now.minusMinutes(5), "rrd4j") as Number).floatValue else 0
Bedeutet: "falls PVLeistung.averageSince(now.minusMinutes(1), "rrd4j") eine gültige Zahl ist"
Wenn die Bedingung wahr ist, wird der erste Teil genutzt, falls die Bedingung nicht erfüllt ist, wird der else- Teil verwendet.
val Number nPV = if(PVLeistung.averageSince(now.minusMinutes(1), "rrd4j") instanceof Number) (PVLeistung.averageSince(now.minusMinutes(1), "rrd4j") as Number) else 0
wird also den numerischen Wert von PVLeistung.averageSince(now.minusMinutes(1), "rrd4j") verwenden, falls es sich um einen numerischen WErt handelt, ansonsten wird eben 0 als Wert genommen.
Das ist immer noch keine Fehlermeldung. Es ist eine Warnung, das ist ein großer Unterschied. Warum die Warnung kommt, weiß ich nicht, aber die Warnung ist ja auch nicht vollständig wiedergegeben. Aber auch dann müsste ich den Code mitsamt Zeilennummern vorliegen haben...
{
"resource": "/o:/rules/charging.rules",
"owner": "_generated_diagnostic_collection_name_#0",
"code": "org.eclipse.xtext.xbase.validation.IssueCodes.obsolete_instanceof",
"severity": 4,
"message": "The expression of type DecimalType is already of type Number",
"startLineNumber": 17,
"startColumn": 43,
"endLineNumber": 17,
"endColumn": 131
}
val Number nPV = if(PVLeistung.averageSince(now.minusMinutes(1), "rrd4j") instanceof Number) (PVLeistung.averageSince(now.minusMinutes(1), "rrd4j") as Number) else 0