Frage zu Timer (mal wieder)

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Frage zu Timer (mal wieder)

Beitrag von int5749 »

Hallo zusammen,

irgendwie komme ich derzeit mit meinem Timer nicht weiter. Für die Zielladung unseres EVs nutze ich einen Timer, der um 0:01 berechnet wird um das Auto dann am frühen Morgen fertig geladen zu haben. Die max. Ladeleistung beträgt dabei schonende 8kW.
So weit und gut, das klappt auch gut mit dem kleinen Fiat 500 meiner Frau, da dieser "nur" eine 42kWh Batterie hat. Zudem sind dann meist noch 10-15% im Akku und wir laden auf 85%. Somit fängt er dann irgendwann um 3 Uhr an uns ist um 6:40 fertig.

Unser EV6 mit 77kWh Batterie braucht da schon etwas länger und daher wäre die Frage ob man auch einen Tag im voraus den Timer setzen kann.

Ich habe die Rule mal auf den Part der Zeitberechunng reduziert und dort auch bewusst lokale Variablen genutzt.

Code: Alles auswählen

rule "Setze Startzeit"
when
    Item SetSmartCharge received command ON
then
    val actions = getActions("pushover", "pushover:pushover-account:account")
    var vWarp = ((evcc_targetSoc.state as Number).intValue - (evcc_vehicleSoc.state as Number).intValue)
    var vPower = ((vWarp * 0.74) - 4.140).floatValue
    var vDuration = ((vPower / 0.138) + 45).intValue
    val vChargeEnd = LocalTime.MIDNIGHT.withHour((EVChargeEndHour.state as Number).intValue).withMinute((EVChargeEndMinutes.state as Number).intValue).withSecond(0)
    val vChargeStart = vChargeEnd.with(vChargeEnd).minusMinutes((vDuration as Number).intValue)
    actions.sendMessageToDevice("J", "Startzeit ist: " + vChargeStart.toString, "EV Charger")
end
Als Ergebnis kommt dann z.B. 3:45

Würde openHAB automatisch den Timer für den nächsten Tag starten?
Gesetzt wird der Timer mit

Code: Alles auswählen

tChargeNow = createTimer((ZonedDateTime.now().with(vChargeStart)), [|
    hier macht er etwas
])
Viele Grüße
Zuletzt geändert von int5749 am 16. Aug 2023 07:38, insgesamt 1-mal geändert.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Frage zu Timer (mal wieder)

Beitrag von udo1toni »

Ich verstehe Deine Frage nicht so ganz.
Die Berechnung hast Du (etwas umständlich) schon da stehen. Einfacher:

Code: Alles auswählen

iDuration   = chargeDurationMinutes
iHour       = chargeTargetHour
iMinute     = chargeTargetMinute
chargeEnd   = LocalDateTime.of(LocalDate.now.plusDays(1), LocalTime.of(iHour,iMinute,0))
chargeStart = chargeEnd.minusMinutes(iDuration)
Der Punkt ist, dass iDuration auch 2000 sein kann, die Berechnung von chargeStart ist dennoch korrekt. Kann halt sein, dass der Termin in der Vergangenheit liegt ;) dass wäre dann doof, aber solange die Berechnung rechtzeitig erfolgt, wird für chargeStart immer der richtige Zeitpunkt raus kommen.
Ich habe die exakten Formulierungen nicht ausprobiert, der Punkt ist, Du musst lediglich den Zielzeitpunkt korrekt übergeben (das funktioniert bei Dir ja schon fast) und dann die zum Erreichen des gewünschten Ladestands benötigte Anzahl Minuten von diesem Zeitpunkt abziehen, schon hast Du den perfekt ausgerechneten Startzeitpunkt.
Wichtig ist allerdings, dass Du mit LocalDateTime arbeitest, Du brauchst immer einen vollständigen Zeitpunkt, das heißt Datum und Uhrzeit. das gilt aber für alle Timer.

Ganz wichtig auch: Du musst immer darauf achten, zuerst das korrekte Datum zu wählen und erst dann die Zeit mit dazu zu packen, um Berechnungsfehler bei der Zeitumstellung zu vermeiden (28. Oktober 4 Uhr + 1d [=24h] = 29. Oktober 3 Uhr, nicht 4 Uhr). Wenn der Zielzeitpunkt hingegen mal korrekt bestimmt ist, musst Du lediglich die gewünschte Anzahl Minuten abziehen (egal wie viele das auch immer sein mögen...)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Frage zu Timer (mal wieder)

Beitrag von int5749 »

Das finde ich ja immer wieder klasse. Du fängst an it "verstehe nicht ganz" und trotzdem kommt eine fundierte Antwort :)

Wie starte ich heute einen Timer für z.B. morgen. Also die Anwort mit dem Datum angeben war dann der Hint.

Aber: Du hast ein i vor den Namen gestellt, das ist bei Dir dann meist ein integer, oder?

Bei mir sind es ja Items, welche ich über die Sitemap ändere ;-)
Dann kann ich das doch auch direkt in der Berechnung als Item.state,intValue nutzen?

Viele Grüße
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Frage zu Timer (mal wieder)

Beitrag von udo1toni »

Ja, prinzipiell kannst Du Itemstatus direkt verwenden, aber Du weißt ja selbst, ein Number Item kann jederzeit auch den Status NULL oder UNDEF haben, weshalb es gute Praxis ist, wo möglich mit Default Werten zu arbeiten und wo das nicht (sinnvoll) geht, den möglichen Fehlerfall zumindest abzufangen. z.B.:

Code: Alles auswählen

    if(!(evcc_vehicleSoc.state instanceof Number)) {
        logWarn("autoCharge","Fahrzeug liefert keinen aktuellen Ladezustand! Abbruch.")
        return;
    }
    val Integer iSocCar = (evcc_vehicleSoc.state as Number).intValue

    var Integer iSocTarget = 85
    if(!(evcc_targetSoc.state instanceof Number)) {
        logWarn("autoCharge","Kann SOC Target nicht lesen! Nutze Vorgabe 85%")
    } else {
        iSocTarget = (evcc_targetSoc.state as Number).intValue
    }


var iHour = 6
if(EVChargeEndHour.state instanceof Number)
    iHour = (EVChargeEndHour.state as Number).intValue

var iMinute = 40
if(EVChargeEndMinutes.state instanceof Number)
    iMinute = (EVChargeEndMinutes.state as Number).intValue
schon herrschen klare Verhältnisse und es kann beim Aufruf von

Code: Alles auswählen

LocalTime.of(iHour,iMinute,0)
nicht mehr zu einer nullPointer Exception kommen (oder zumindest nicht wegen der beiden Items...)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Frage zu Timer (mal wieder)

Beitrag von int5749 »

udo1toni hat geschrieben: 12. Aug 2023 20:39 schon herrschen klare Verhältnisse und es kann beim Aufruf von

Code: Alles auswählen

LocalTime.of(iHour,iMinute,0)
nicht mehr zu einer nullPointer Exception kommen (oder zumindest nicht wegen der beiden Items...)
Ja, klare Verhälnisse sind gerade auch bei der Programmierung von Routinen wichtig und sollte ich noch stringenter verfolgen.
Danke, dass Du es hier in Deinen Posts immer wieder ansprichst <= Und das meine ich 100% positiv, hat mir schon sehr geholfen

Dann werde ich mal mir den Erkenntnissen die Regeln umbauen, gerade da wir ja 2 Ladeplätze haben und an beiden die Zeilladung funktionieren soll.
Am LP1 kann nur der Fiat geladen werden, am LP2 eben beide.

Die Werte bekomme ich aus dem evcc Binding aber auch dort kann es schon mal zu Problemen mit der Fahrzeug Api geben.

Viele Grüße
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Frage zu Timer (mal wieder)

Beitrag von udo1toni »

Immer gerne :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Frage zu Timer (mal wieder)

Beitrag von int5749 »

Kann man eigentlich auch Timer über den Namen filtern und dann beenden?

Oder den Namen eines Timer "zuammenbauen" wenn man den Anfang des Names aus einem Filter erhält?

Beispiel
Var Timer LP1_TimerWallbox
Switch LP1_Wallbox

Und wenn ich LP1 dann über einen Filter in eine Variable i bekomme ein

Code: Alles auswählen

i & _TimerWallbox? = cancel
Oder muss ich über einen select Schleife gehen?

Viele Grüße
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Frage zu Timer (mal wieder)

Beitrag von udo1toni »

Nein, das geht so meines Wissens nicht.
Du kannst aber eine Arraylist (bzw. eine Hashmap) verwenden, um Timer zu speichern und dann über das Array auf die Timer zugreifen. Auf die Schnelle im englischen Forum: https://community.openhab.org/t/array-o ... e/142850/3 Ich habe das allerdings selbst noch nie gebraucht, soll aber funktionieren :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten