Seite 4 von 6

Re: Timer Ablauf

Verfasst: 25. Jan 2022 17:26
von udo1toni
Na ja, die Fehlermeldung besagt ja, dass Number nicht nach long konvertiert werden kann. Das liegt dann daran, dass Number potentiell auch Nachkommastellen aufweisen kann. .intValue gibt eben einen Integer Wert zurück, den openHAB dann automatisch nach long konvertiert.

Re: Timer Ablauf

Verfasst: 25. Jan 2022 17:38
von shuo
Besten Dank für die Erklärung.
Alles getestet und funktioniert nun wie es soll

Nochmals vielen Dank Udo!

Re: Timer Ablauf

Verfasst: 25. Jan 2022 20:03
von udo1toni
Gerne!

Re: Timer Ablauf

Verfasst: 31. Jan 2022 15:38
von shuo
Anfangs dachte ich alles ist gut. Aber jetzt, nachdem ich die Zoe endlich zum Laden anschließen konnte, scheint noch ein Fehler drin zu sein.

Der Ladevorgang wird sofort abgeschalten mit der Nachricht, dass das Ladeziel erreicht ist. Interessanterweise scheint nChargeTarget bei 0% zu sein.
Ladeziel.PNG
das heißt irgendwie finded der vergleich zwischen nChargeLevel und nChargeTarget nicht statt und nSoll bleibt bei dem initilisierten Wert 0.

Woran könnte das noch liegen?

Hier nochmal der Code:

Code: Alles auswählen

rule "update timespan and eventually stop charging"
when
    Item RenaultZEServices_Zoe_ChargeLevel changed or
    Item RenaultZEServices_Zoe_Charging_Target changed
    
then
    if(KebaPower.state > 0 && KebaState.state == 3){
        var Number nChargeLevel  = 0                                                                                            // Default Wert, falls kein gültiger Wert
        if(RenaultZEServices_Zoe_ChargeLevel.state instanceof Number)                                                     // falls gültiger Wert
            nChargeLevel  = (RenaultZEServices_Zoe_ChargeLevel.state as Number).floatValue                                // übernimm diesen Wert
        var Number nChargeTarget = 0                                                                                           // Default Wert, falls kein gültiger Wert
        if(RenaultZEServices_Zoe_Charging_Target.state instanceof Number)                                                 // falls gültiger Wert
            nChargeLevel  = (RenaultZEServices_Zoe_Charging_Target.state as Number).floatValue                            // übernimm diesen Wert
        var Number nSoll
        if(nChargeLevel >= nChargeTarget)                                                                                 // Ziel überschritten?
            nSoll = 0
        else if(nChargeLevel >= nChargeTarget -  4)                                                                       // Ziel -  4 überschritten?
            nSoll = 2
        else if(nChargeLevel >= nChargeTarget - 10)                                                                       // Ziel - 10 überschritten?
            nSoll = 5
        else if(nChargeLevel >= nChargeTarget - 20)                                                                       // Ziel - 20 überschritten?
            nSoll = 10
        else                                                                                                              // sonst
            nSoll = 20
        if(nSoll == 0 ) {                                                                               // Ziel überschritten?
            tMyTimer?.cancel                                                                                              // laufenden Timer abbrechen (falls vorhanden)
            tMyTimer = null                                                                                               // Zeiger löschen
            myTime.postUpdate(5)
            KebaSwitch.sendCommand(OFF)                                                                                          // Default Zyklus setzen
            logInfo("RemainingCharingTarget", "Zoe set charging target achieved. Switching off at : {} %", nChargeTarget)
            sendBroadcastNotification("Ladeziel erreicht. Schalte Ladevorgang ab bei: " + nChargeTarget.toString + "%"  )
        } else if(myTime.state != nSoll) {                                                // weniger als x % bis zum Ladeziel
            myTime.postUpdate(nSoll)                                                                                          // Zyklus anpassen
            tMyTimer.reschedule(now.plusMinutes(nSoll))                                                                       // und Timer neu planen (optional)
        }
    }
end

Re: Timer Ablauf

Verfasst: 31. Jan 2022 17:47
von udo1toni
Das bedeutet lediglich, dass die beiden Items (oder mindestens eines davon) nicht initialisiert sind. Schau mal, dass Du eine gültige Zahl im Item Status hast.

Re: Timer Ablauf

Verfasst: 1. Feb 2022 08:34
von shuo
Hi Udo. In den Items ist eine gültige Zahl. Ich habe eben einen Fehler entdeckt.
Bitte in Deinem ursprünglichen Code nChargeTarget zuweisen. Du hast zweimal nChargeLevel zugewiesen. Denke das passt nicht.

Aber jetzt - warum auch immer, bekomme ich einen Konvertierungsfehler:
Fehlermeldung.png
Eine Idee warum ich den bekomme?

Re: Timer Ablauf

Verfasst: 1. Feb 2022 14:51
von peter-pan
Ich muss das auch immer wieder ausprobieren. Es wird wahrscheinlich an den unterschiedlichen Datentypen liegen.
Du kannst mal eine der folgenden Deklarationen versuchen:

Code: Alles auswählen

var Long nSoll
  oder
var long nSoll
Ich hab deine Regel mal in bei mir in den VSC-Editor geladen und bekomme dann die Fehlermeldung:

Code: Alles auswählen

Type mismatch: cannot convert from Number to int(org.eclipse.xtext.xbase.validation.IssueCodes.incompatible_types)
Also bei mir will er "Integer" oder "int".

Re: Timer Ablauf

Verfasst: 1. Feb 2022 15:56
von shuo
warum will er bei Dir kein long? Jetzt stehe ich völlig auf dem Schlauch.

Hab jetzt alles "ausprobiert", aber ohne Erfolg.....

Re: Timer Ablauf

Verfasst: 1. Feb 2022 17:30
von udo1toni
shuo hat geschrieben: 1. Feb 2022 08:34 Bitte in Deinem ursprünglichen Code nChargeTarget zuweisen. Du hast zweimal nChargeLevel zugewiesen. Denke das passt nicht.
Ja, guten Morgen... ;)

Was nSoll betrifft, sollte es eigentlich ausreichen, dies als Integer zu definieren:

Code: Alles auswählen

var Integer nSoll
Grundsätzlich erwartet plusMinutes einen long Wert. Number kann auch Float enthalten. Offensichtlich ist die Rule Engine da in neueren Versionen etwas zickiger... Aus einem Integer kann openHAB aber leicht ein Long erstellen.

Re: Timer Ablauf

Verfasst: 3. Feb 2022 16:38
von shuo
Also der Fehler scheint behoben zu sein. Aber jetzt stürzt Openhab komplett ab. Sobald ich die Zoe anhänge, hängt sich die Applikation auf.

Es kommt jetzt die Meldung:

Code: Alles auswählen

Scheduled runnable ended with an exception:
java.lang.OutOfMemoryError: Java heap space
Kann jemand was damit anfangen?