Überschussleistung Laden

Allgemeine Fragen rund um die "Smart Home" Hardware/Komponenten

Moderatoren: seppy, udo1toni

Benutzeravatar
udo1toni
Beiträge: 4338
Registriert: 11. Apr 2018 18:05
Answers: 46
Wohnort: Darmstadt

Re: Überschussleistung Laden

Beitrag 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.

shuo
Beiträge: 39
Registriert: 1. Sep 2018 18:24

Re: Überschussleistung Laden

Beitrag 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?

Benutzeravatar
udo1toni
Beiträge: 4338
Registriert: 11. Apr 2018 18:05
Answers: 46
Wohnort: Darmstadt

Re: Überschussleistung Laden

Beitrag 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 :)

shuo
Beiträge: 39
Registriert: 1. Sep 2018 18:24

Re: Überschussleistung Laden

Beitrag 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!

Benutzeravatar
udo1toni
Beiträge: 4338
Registriert: 11. Apr 2018 18:05
Answers: 46
Wohnort: Darmstadt

Re: Überschussleistung Laden

Beitrag 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...)

shuo
Beiträge: 39
Registriert: 1. Sep 2018 18:24

Re: Überschussleistung Laden

Beitrag 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)

Benutzeravatar
udo1toni
Beiträge: 4338
Registriert: 11. Apr 2018 18:05
Answers: 46
Wohnort: Darmstadt

Re: Überschussleistung Laden

Beitrag 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.

shuo
Beiträge: 39
Registriert: 1. Sep 2018 18:24

Re: Überschussleistung Laden

Beitrag 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)

Benutzeravatar
udo1toni
Beiträge: 4338
Registriert: 11. Apr 2018 18:05
Answers: 46
Wohnort: Darmstadt

Re: Überschussleistung Laden

Beitrag 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...

shuo
Beiträge: 39
Registriert: 1. Sep 2018 18:24

Re: Überschussleistung Laden

Beitrag 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

Antworten