Seite 2 von 4
Re: Überschussleistung Laden
Verfasst: 13. Sep 2020 18:30
von udo1toni
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
Code: Alles auswählen
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.
Re: Überschussleistung Laden
Verfasst: 14. Sep 2020 00:01
von shuo
udo1toni hat geschrieben: ↑11. Sep 2020 19:17
Code: Alles auswählen
var Timer tCharge = null
rule ...
...
then
...
if(load > prod && tCharge === null && Charge.state == ON)
tCharge = createTimer(now.plusMinutes(5)[|
Charge.sendCommand(OFF)
tCharge = null
])
else if (load < prod) {
tCharge?.cancel
tCharge = null
}
...
Hi Udo. Ich bekomme hier immer eine Fehlermeldung bei Timer:
Code: Alles auswählen
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)
Hast Du eine Idee was hier das Problem ist?
Re: Überschussleistung Laden
Verfasst: 14. Sep 2020 18:46
von udo1toni
Oh, ja, da fehlt ein Komma...
Code: Alles auswählen
var Timer tCharge = null
rule ...
...
then
...
if(load > prod && tCharge === null && Charge.state == ON)
tCharge = createTimer(now.plusMinutes(5),[| // hier vor der öffnenden eckigen Klammer fehlte das Komma
Charge.sendCommand(OFF)
tCharge = null
])
else if (load < prod) {
tCharge?.cancel
tCharge = null
}
...
Und natürlich ist die Rule nicht komplett
Re: Überschussleistung Laden
Verfasst: 15. Sep 2020 10:00
von shuo
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.
udo1toni hat geschrieben: ↑13. Sep 2020 18:30
Code: Alles auswählen
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
Allerdings bekomme ich folgende Fehlermeldung:
Code: Alles auswählen
The expression of type DecimalType is already of type Number(org.eclipse.xtext.xbase.validation.IssueCodes.obsolete_instanceof)
Gibt es ein gutes HowTo / Tuotorial wo ich sowas nachlesen könnte? Ich hänge immer wieder an solchen "Konvertierungsfehlern"....
VG und Danke!
Re: Überschussleistung Laden
Verfasst: 16. Sep 2020 22:12
von udo1toni
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...)
Re: Überschussleistung Laden
Verfasst: 17. Sep 2020 21:16
von shuo
Hi Udo. Leider nein.
Code: Alles auswählen
if((PVLeistung.averageSince(now.minusMinutes(5), "rrd4j") as Number) (PVLeistung.averageSince(now.minusMinutes(5), "rrd4j") as Number).floatValue else 0
Führt zu einem Fehler:
Code: Alles auswählen
Type mismatch: cannot convert from DecimalType to boolean(org.eclipse.xtext.xbase.validation.IssueCodes.incompatible_types)
Re: Überschussleistung Laden
Verfasst: 17. Sep 2020 23:02
von udo1toni
Du mussst das if- Statement schon unangetastet lassen. instanceof ist eine Funktion.
Code: Alles auswählen
if(PVLeistung.averageSince(now.minusMinutes(1), "rrd4j") instanceof Number)
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.
Code: Alles auswählen
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.
Re: Überschussleistung Laden
Verfasst: 20. Sep 2020 13:03
von shuo
Danke Udo.
Kannst Du Dir auch erklären warum ich folgende Warnung bekommen?
Code: Alles auswählen
The expression of type DecimalType is already of type Number(org.eclipse.xtext.xbase.validation.IssueCodes.obsolete_instanceof)
Re: Überschussleistung Laden
Verfasst: 20. Sep 2020 16:16
von udo1toni
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...
Re: Überschussleistung Laden
Verfasst: 21. Sep 2020 13:11
von shuo
Hatte ja gefragt ob Du den Grund der Warnung Dir erklären kannst.
Hier die Details bezüglich der Warnumeldung:
Code: Alles auswählen
{
"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
}
Ziele 17:
Code: Alles auswählen
val Number nPV = if(PVLeistung.averageSince(now.minusMinutes(1), "rrd4j") instanceof Number) (PVLeistung.averageSince(now.minusMinutes(1), "rrd4j") as Number) else 0