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