Anfängerfragen

Hier bitte alles rein was Off-topic ist.

Moderatoren: Cyrelian, seppy

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

Re: Anfängerfragen

Beitrag von udo1toni »

harasch hat geschrieben: 10. Apr 2024 14:53 Hast Du eine Idee?
Ja, Tippfehler...

Code: Alles auswählen

val nEURkwh = 0.128          //€/Kwh
vs.

Code: Alles auswählen

val nFaktor = nEnergie * nEURKwh
Und die Meldung ist da auch eindeutig:

Code: Alles auswählen

 The method or field nEURKwh is undefined; line 7, column 237, length 7
nEURKwh ist nicht definiert. nEURkwh ist hingegen definiert. Jeder Buchstabe muss exakt so geschrieben werden, wie er in der Definition geschrieben wurde.
harasch hat geschrieben: 10. Apr 2024 09:15 Ich habe eine jdbc Persistence, die funktioniert auch. Nur wie teile ich der Rule den Pfad mit.
Warum Pfad? Was für ein Pfad? Du nutzt die Persistence. Man kann pro Persistence Addon immer nur eine Persistence betreiben, somit kennt openHAB alle notwendigen Daten (IP des Datenbank-Servers, User, Passwort, Datenbank und - am wichtigsten - die Zuordnung der Items zu den Datenbanktabellen). Falls Du mehrere Persistences verwendest, und die jdbc Datenbank nicht die default Datenbank ist, schreibst Du jeweils noch die Persistence mit dazu:

Code: Alles auswählen

val dtMitternacht = now.with(LocalTime.MIDNIGHT)
val dtWochenstart = dtMitternacht.minusDays(dtMitternacht.getDayOfWeek.getValue - 1) // Montag = 1, Sonntag = 7
val dtMonatsanfang = dtMitternacht.withDayOfMonth(1)

val nVerbrauchHeute = Gaszaehler_Stand.deltaSince(dtMitternacht, "jdbc")
val nVerbrauchWoche = Gaszaehler_Stand.deltaSince(dtWochenstart, "jdbc")
val nVerbrauchMonat = Gaszaehler_Stand.deltaSince(dtMonatsanfang, "jdbc")
harasch hat geschrieben: 10. Apr 2024 09:15 Ich hatte das auch schon mal mit der guten Methode versucht. Es gelang mir aber nicht die Rule zum laufen zu bringen.
Wenn Du das korrekte Äquivalent verwendest, funktioniert es auch:

Code: Alles auswählen

Gaszaehler_Gestern.postUpdate(Gaszaehler_Heute.state.toString)
Gaszaehler_Heute.postUpdate(0)
 
Gaskosten_Gestern.postUpdate(Gaskosten_Heute.state.toString)
Gaskosten_Heute.postUpdate(0)
  
Gas_Gestern.postUpdate(Gas_Heute.state.toString)
Gas_Heute.postUpdate(0)
.toString erzwingt die Ausgabe als String (das wird von openHAB bei der Action automatisch ergänzt). Aber besser wäre es natürlich, mit den echten Zahlen zu arbeiten.
Wie gesagt wäre mein Tipp, die Werte sauber auszurechnen und jeweils für die Anzeige bereitzustellen, statt die berechneten Werte einzeln aufzuaddieren. Der einzige Wert, den Du aufaddierst, ist der Zählerstand (aufgrund des Impulses, den der Kontakt am Zähler liefert). Alle anderen Werte ergeben sich aus dem Zählerstand und einem historischen Zählerstand, den Du aus der Persistence auslesen kannst.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

harasch
Beiträge: 19
Registriert: 24. Dez 2023 20:09
Answers: 0

Re: Anfängerfragen

Beitrag von harasch »

Hallo udo1toni,
ich hab mal wieder ein Problem. Das mit dem Gaszaehler funktioniert so weit bis auf den Wochenverbrauch da hakt's noch ein wenig. Jetzt bin ich dabei das Problem mit dem Verbrauch eines Rolladen gesteuert mit einem shelly 2.5 Gesamtverbrauch welcher beim neu booten zurückgesetzt wird.
Ich habe hier im Forum auch schon herumgestöbert und einiges probiert. Nun habe ich wieder einer Beitrag von Dir gesehen und wollte das einmal ausprobieren.
Ich bekomme aber folgene Fehlermeldung in der log.

Code: Alles auswählen

2024-07-28 12:53:04.993 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'a1eb6f40a5' failed:  ___ rule  ___ "Stromzaehler Verbrauch Tag"
when
    Time cron "5 * * * * ?"
then
    var Number nDelta = 0
    if(RolladenBalkon_Stromverbrauch.deltaSince(now.minusMinutes(1)) instanceof Number) nDelta = RolladenBalkon_Stromverbrauch.deltaSince(now.minusMinutes(1)) as Number
    if(nDelta > 0) {
        SummeTag.postUpdate(nDelta + if(SummeTag.state instanceof Number) (SummeTag.state as Number) else 0)
        SummeWoche.postUpdate(nDelta + if(SummeWoche.state instanceof Number) (SummeWoche.state as Number) else 0)
        SummeMonat.postUpdate(nDelta + if(SummeMonat.state instanceof Number) (SummeMonat.state as Number) else 0)
    }
end

   1. The method or field rule is undefined; line 1, column 0, length 4
   2. The method or field when is undefined; line 2, column 34, length 4
   3. The method or field cron is undefined; line 3, column 48, length 4
   4. The method or field then is undefined; line 4, column 67, length 4
   5. The method or field end is undefined; line 12, column 633, length 3
   6. This expression is not allowed in this context, since it doesn't cause any side effects.; line 1, column 5, length 28
   7. This expression is not allowed in this context, since it doesn't cause any side effects.; line 3, column 43, length 4
   8. This expression is not allowed in this context, since it doesn't cause any side effects.; line 3, column 53, length 13
Ich übernehme Deine rule per copie und paste um ja keinen Tippfehler zu machen. Das item RolladenBalkon_Stromverbrauch existiert und zeigt auch Werte an. Die items SummeWoche usw. habe ich in der Items Datei angelegt.
Wo könnte der Fehler liegen?

Gruß, Harald

harasch
Beiträge: 19
Registriert: 24. Dez 2023 20:09
Answers: 0

Re: Anfängerfragen

Beitrag von harasch »

Hallo udo1toni,
ich möchte gerne noch eine Frage hinterherschieben.
Wenn ich anstatt in der UI eine rule eingebe ein script schreibe auch mit dem Schlüsselwort rule, wird dies nicht ausgeführt. Außerdem bekomme ich schon eine Fehlermeldung wenn ich nur eine Variable deklarieren möchte. Könnte es sein das auf meinem Rechner, win10 pro, das Ausführen von scripten nicht erlaubt ist. Und wo könnte ich da nachschauen. Ich wundere mich eben nur, dass hier im Forum komplizierte rules programmiert werden und bei mir kommen schon bei den einfachsten rules Fehlermeldungen über Fehlermeldungen. Oder habe ich die falsch java runtime? Ich habe das quasi immer so gemacht wie auf der openhab support seite.

Gruß, Harald

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

Re: Anfängerfragen

Beitrag von udo1toni »

Da openHAB in einer Java Sandbox läuft, spielt das Betriebssystem keine Rolle, Unterschiede gibt es lediglich, wenn es um Zugriffe auf das Dateisystem oder um direkten Zugriff auf Hardware geht, weil das naturgemäß unter Windows fundamental anders läuft als unter GNU/Linux.

Zur Rule: Es handelt sich um eine DSL Rule, die in einer Textdatei gespeichert werden muss. Die Textdatei muss die Endung .rules haben und sich im Ordner $OPENHAB_CONF/rules/ befinden (bei Windows vermutlich C:\openHAB\conf\rules\)

Du kannst die Rule auf über die UI als Rule anlegen, das sähe dann in der Code Ansicht der konkreten Rule z.B. so aus:

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      cronExpression: 5 * * * * ?
    type: timer.GenericCronTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >
        var Number nDelta = 0
        if(RolladenBalkon_Stromverbrauch.deltaSince(now.minusMinutes(1)) instanceof Number)
            nDelta = RolladenBalkon_Stromverbrauch.deltaSince(now.minusMinutes(1)) as Number
        if(nDelta > 0) {
            SummeTag.postUpdate(nDelta + if(SummeTag.state instanceof Number) (SummeTag.state as Number) else 0)
            SummeWoche.postUpdate(nDelta + if(SummeWoche.state instanceof Number) (SummeWoche.state as Number) else 0)
            SummeMonat.postUpdate(nDelta + if(SummeMonat.state instanceof Number) (SummeMonat.state as Number) else 0)
        }
    type: script.ScriptAction
Du musst also den Trigger über die UI eingeben und anschließend eine Action definieren, welche ein DSL Script ausführt. Dieses Script gibst Du dann an Ort uns Stelle ein. Der Teil von rule bis then sowie das Schlüsselwort end sind dabei kein Bestandteil des Scripts, sondern eben die Verpackung, die Du schon über die UI erstellt hast (das wäre dann sozusagen doppelt gemoppelt)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten