Wecker mit TRADFRI realisieren

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Wecker mit TRADFRI realisieren

Beitrag von atk69 »

Hallo zusammen

Bin gerade an einem neuen Projekt, dass mir Morgens im Schlafzimmer meine TRADFRI -Lampe langsam dimmen soll (0-100%).
Auf der suche nach Infos bin ich auf die Seite von Florian gestossen, der ein perfekte Lösung darstellt.
Kurzerhand habe ich es übernommen und es funktioniert auch recht gut.
Bis auf eine "Kleinigkeit": Die Lampe wird nicht gedimmt, sondern nur eingeschaltet.
Da das script von Florian nicht für TRADFRI ausgelegt ist, wird der Fehler wohl im korrekten Befehl liegen.
Da habe ich schon einiges probiert, ohne Erfolg.
Florian hat auf Nachfrage auf seine nicht vorhanden Erfahrung mit TRADFRI verwiesen und deshalb bin ich wieder hier.
Er hat mir erlaubt auf seine Seite zu verlinken: https://www.forwardme.de/2017/02/09/ope ... ichtwecker
Angepasst habe ich nur das item in der rule (SZ_Decke_L_Helligkeit)

Code: Alles auswählen

rule "Wecker - prüfen"
when 
    Time cron "0 0/1 * * * ?"   // minütlicher Aufruf
then
    var weckerStunde =  (weckerZeitStunde.state as DecimalType).intValue
    var weckerMinute =  (weckerZeitMinute.state as DecimalType).intValue
    var weckerHelligkeit = (weckerMaxHelligkeit.state as DecimalType).intValue
    var weckerWartezeit = 1000 * (weckerDimmerSleep.state as DecimalType).intValue
    logInfo('rules','helligkeit: ' + weckerHelligkeit +' wartezeit ' + weckerWartezeit)

    if (
        (now.getHourOfDay.intValue == weckerStunde) && (now.getMinuteOfHour.intValue == weckerMinute)
        && (
            ((weckerMontag.state == ON) && now.getDayOfWeek.intValue == 1) ||
            ((weckerDienstag.state == ON) && now.getDayOfWeek.intValue == 2) ||
            ((weckerMittwoch.state == ON) && now.getDayOfWeek.intValue == 3) ||
            ((weckerDonnerstag.state == ON) && now.getDayOfWeek.intValue == 4) ||
            ((weckerFreitag.state == ON) && now.getDayOfWeek.intValue == 5) ||
            ((weckerSamstag.state == ON) && now.getDayOfWeek.intValue == 6) ||
            ((weckerSonntag.state == ON) && now.getDayOfWeek.intValue == 7)
            )
    ) {
        logInfo ('rules','Wecker wird aktiviert...')
        // Wecker nur notwendig, wenn Licht aus ist
        if (SZ_Decke_L_Helligkeit.state < weckerHelligkeit) {
            var Number dimmer = 0
            while (dimmer < weckerHelligkeit) {
                // Licht auf Dimmstufe schalten
                sendCommand(SZ_Decke_L_Helligkeit, dimmer.intValue)
                // Konfigurierte Anzahl an Sekunden warten
                Thread::sleep(weckerWartezeit)
                // prüfen ob zwischenzeitlich Dimmerhelligkeit manuell veraendert wurde und damit der Wecker ausgemacht wurde
                var dimmerStatus = (SZ_Decke_L_Helligkeit.state as DecimalType).intValue
                if (dimmer == dimmerStatus) {
                    dimmer = dimmer + 1
                    logInfo('rules', 'Wecker: Dimmer plus 1 gesetzt auf ' + dimmer)
                } else {
                    dimmer = 100 // Abbruchbedingung
                    logInfo('rules', 'Wecker: Abbruch durch Tastendruck')
                }
            }
            logInfo('rules', 'Wecker abgeschlossen, Zielhelligkeit erreicht')
        } else {
            logInfo('rules', 'Wecker nicht gestartet da Licht bereits heller als Ziel-Helligkeit des Weckers. Helligkeit Licht: ' + SZ_Decke_L_Helligkeit.state)
        }
    } else {
        logInfo('rules','Wecker nicht aktiviert, Bedingung für Wecker trifft nicht zu')
    }
end
Ich komme einfach nicht drauf, wie die Lampe korrekt ansprechen muss. Achja, die Ikea Sachen sind via PaperUI eingebunden, nicht als text-items.
Alles andere habe ich möglichst als text.

P.S. auf der Suche im Forum ist mir aufgefallen, das ich nicht der erste mit Florians Code bin. Allerdings andere Problematik ;)
Gruss
atk69
and IT works ;)

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

Re: Wecker mit TRADFRI realisieren

Beitrag von udo1toni »

Grundsätzlich kann man das so machen. Ich möchte wie immer darauf hinweisen, dass Thread::sleep() nur in bestimmten Situationen ok ist (nein, dieser Fall gehört nicht dazu) und insbesondere innerhalb while Schleifen ein solches Konstrukt eine Vergewaltigung von openHAB darstellt. :)

Rules sind erst einmal technologieneutral, das ist ja der Knackpunkt von openHAB mit seinen Abstraktionsebenen. Nun habe ich keine Tradfri im Einsatz und habe dementsprechend keine Ahnung von eventuellen Einschränkungen. In der Dokumentation sieht es für mich aber so aus, als würde eine solche Lampe ganz normal über absolutes Dimmen gesteuert, sprich, wenn Du einen Zahlenwert zwischen 0 und 100 an das verlinkte Dimmer Item schickst, dimmt die Lampe auf die entsprechende Helligkeit. Wenn Du das Item in Basic UI anlegst, bekommst Du als Standard einen Slider, mit dem Du dimmen kannst, ist das soweit korrekt? Dann sollte die Rule grundsätzlich funktionieren.

Ein Problem kann sich z.B. ergeben, wenn zu viele Steuerbefehle in zu kurzer Zeit erfolgen (was bei allmählichem Dimmen gerne mal auftritt).
Weil ich, wie scdhon erwähnt kein Tradfri nutze: kann man die Lampen parametrieren? also z.B. dass die Lampen grundsätzlich weich von ist-Helligkeit nach soll-Helligkeit regeln, mit einer auswählbaren Zeit (Nicht von openHAB aus, sondern z.B. über eine zugehörige App)?

Eine IMHO bessere Variante:

items:

Code: Alles auswählen

Group gWecker
Number WeckZeitStunde "Stunde [%d]" (gWecker)
Number WeckZeitMinute "Minute [%d]" (gWecker)
Switch WeckZeitTag_1 "Montag [%s]" (gWecker)
Switch WeckZeitTag_2 "Dienstag [%s]" (gWecker)
Switch WeckZeitTag_3 "Mittwoch [%s]" (gWecker)
Switch WeckZeitTag_4 "Donnerstag [%s]" (gWecker)
Switch WeckZeitTag_5 "Freitag [%s]" (gWecker)
Switch WeckZeitTag_6 "Samstag [%s]" (gWecker)
Switch WeckZeitTag_7 "Sonntag [%s]" (gWecker)
Number WeckMaximum "Maximum [%d%%]"
Number WeckDimmzeit "Dimmzeit [%d Sek]"
Number WeckTage
Number WeckZeit

Dimmer MyDimmer "TradFri Wecker [%d %%]" { channel="tradfri...brightness" }
rule:

Code: Alles auswählen

// Globale Variablen immer zu Beginn der Datei definieren!

var Timer tWecker = null

rule "Wecker Change"
when
    Member of gWecker changed
then
    if(previousState == NULL) return;

    // initialize all items that are of status NULL
    if(!(WeckDimmzeit.state instanceof Number)) WeckDimmzeit.postUpdate(1)
    if(!(WeckMaximum.state instanceof Number)) WeckMaximum.postUpdate(100)
    gWecker.members.filter[i | i.state == NULL && i instanceof SwitchItem].forEach[ n | n.postUpdate(OFF)]
    gWecker.members.filter[i | i.state == NULL && i instanceof NumberItem].forEach[ n | n.postUpdate(0)]
 
    var Number nWeckZeit = (WeckZeitStunde.state as Number) * 60 + (WeckZeitMinute.state as Number))
    WeckZeit.postUpdate(nWeckZeit)

    var Number nWeckTage = 0
    gWecker.members.filter[i | i instanceof SwitchItem].forEach[n | 
        nWeckTage = nWeckTage + if(n.state == ON) 2^(Int::parseInt(n.name.split("_").get(1)))
    ]
    WeckTage.postUpdate(nWeckTage)

    tWecker?.cancel
    tWecker = createTimer(now.withTimeAtStartOfDay.plusMinutes(nWeckZeit).plusDays(if(now.getMinuteOfDay < nWeckZeit) 0 else 1), [ | 
        if((WeckTage.state as Number).toBigDecimal.toBigInteger.testBit(now.getDayOfWeek) && (MyDimmer.state as Number) < WeckMaximum) {
            MyDimmer.sendCommand( (MyDimmer.state as Number) + 1)
            tWecker.reschedule(now.plusSeconds((WeckDimmzeit.state as Number).intValue))
        }
        else
            tWecker.reschedule(now.withTimeAtStartOfDay.plusMinutes(nWeckZeit).plusDays(1))
    ])
end
Theorie der Rule:
Wird eines der Items, die die Weckzeit beeinflussen verändert, triggert die Rule (deshalb das Group Item...)

Zu Beginn wird die Rule abgebrochen, falls das triggernde Item vorher NULL war.
Die nächsten vier Zeilen initialisieren alle Items, die zum Zeitpunkt des Triggers NULL sind.
Dieser Block kann entfernt werden, wenn die Items mal initialisiert wurden und per mapdb und restoreOnStartup wiederhergestellt werden. Grundsätzlich sollte aber nach dem Systemstart der Wecker immer einmalig angefasst werden (z.B. einen Tag toggeln). Man kann auch das automatisieren (mit System started...) aber darüber wollte ich mir jetzt keine Gedanken machen ;)

Als nächstes berechnet die Rule aus Stunden, Minuten und allen Wochentagen zwei Items, im einen ist die Tagesminute des Alarms gespeichert, im anderen Item sind die Wochentage als Bitmuster gespeichert, das macht die Sache später (noch) einfacher.

Jetzt wird ein eventuell vorhandener Timer gelöscht und anschließend neu erstellt. Damit ist die Rule fertig.

Der angelegte Timer wird ausgeführt, wenn die Tagesminute erreicht ist.
Wird der Timer ausgeführt, prüft der Code, ob der aktuelle Tag ein aktiver Alarmtag ist, sowie, ob der Dimmwert noch nicht erreicht wurde. Sind beide Bedingungen erfüllt, wird der Dimmwert um 1 erhöht und der Timer mit der eingestellten Wartezeit neu gestartet. Ist die Bedingung nicht erfüllt, wird der Timer für den nächsten Tag neu geplant.

Vorteile gegenüber der verlinkten Variante:
  • Die Rule kommt ohne Thread::sleep() aus, womit die Rule auch nur sehr kurz Ressourcen benötigt.
  • Der Timer wird nur einmal täglich ausgeführt (und einmal pro Dimmschritt)
  • Auch der Timer benötigt nur sehr kurz Ressourcen, in der inaktiven Phase kümmert sich der Scheduler von openHAB um alles Nötige.
  • Die Rule kann nicht aus Versehen mehrfach gestartet werden, bzw. es kommt dadurch nicht zu Störungen.
  • Na ja, die Länge der Rule ;)
Wie erwähnt kann der Initialisierungspart der Rule entfallen, wenn die Items der Gruppe alle mit der Strategie everyChange,restoreOnStartup persistiert werden. Die erste if-Anweisung sollte aber drin bleiben, um aktiv zu verhindern, dass die Rule Amok läuft.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Re: Wecker mit TRADFRI realisieren

Beitrag von atk69 »

Hallo udo1toni
habe mir schon gedacht (und gehofft) das du dich der Sache annimmst :P
Das Thema mit sleep hatten wir ja schon. Und ja, das hätte ich geändert, sobald die rule generell läuft. Habe ja gelernt ;)
In der Dokumentation sieht es für mich aber so aus, als würde eine solche Lampe ganz normal über absolutes Dimmen gesteuert, sprich, wenn Du einen Zahlenwert zwischen 0 und 100 an das verlinkte Dimmer Item schickst, dimmt die Lampe auf die entsprechende Helligkeit. Wenn Du das Item in Basic UI anlegst, bekommst Du als Standard einen Slider, mit dem Du dimmen kannst, ist das soweit korrekt?
Das ist korrekt. in der Basic UI habe ich es schon angelegt. Hier funktioniert es einwandfrei.
kann man die Lampen parametrieren? also z.B. dass die Lampen grundsätzlich weich von ist-Helligkeit nach soll-Helligkeit regeln, mit einer auswählbaren Zeit (Nicht von openHAB aus, sondern z.B. über eine zugehörige App)?
Ja, in der Ikea-app gibt es solche Möglichkeiten z.B. Sonnenaufgang
and IT works ;)

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

Re: Wecker mit TRADFRI realisieren

Beitrag von udo1toni »

atk69 hat geschrieben: 7. Sep 2019 18:23Ja, in der Ikea-app gibt es solche Möglichkeiten z.B. Sonnenaufgang
Ich meinte es eher so, dass man z.B. die Zeit zum Dimmen zwischen zwei Werten auf z.B. 5 Sekunden setzt. Dann könnte man in der Rule größere Schritte verwenden und entsprechend längere Zeiträume verwenden, falls die Steuerfrequenz (also der zeitliche Abstand zwischen zwei Befehlen) das Problem sein sollte.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Re: Wecker mit TRADFRI realisieren

Beitrag von atk69 »

Hallo Udo1toni
das mit der Zeit kann ich dir nicht beantworten. Aber es wäre mir egal ob der Abstand zwischen den Stufen 1 sek oder 10 sek wäre oder die Abstufung 1% oder 10%.
Im Moment habe ich deine Anpassungen übernommen und auch im Paper UI eingestellt. Leider tut sich jetzt gar nichts mehr. Ein Loginfo erscheint auch nicht im log. :cry:
Im Paperui ist bei den items ein neuer eintrag (logisch)
Bild

rule:

Code: Alles auswählen

// Globale Variablen immer zu Beginn der Datei definieren!

var Timer tWecker = null

rule "Wecker Change"
when
    Member of gWecker changed
then
    if(previousState == NULL) return;

    // initialize all items that are of status NULL
    if(!(WeckDimmzeit.state instanceof Number)) WeckDimmzeit.postUpdate(1)
    if(!(WeckMaximum.state instanceof Number)) WeckMaximum.postUpdate(100)
    gWecker.members.filter[i | i.state == NULL && i instanceof SwitchItem].forEach[ n | n.postUpdate(OFF)]
    gWecker.members.filter[i | i.state == NULL && i instanceof NumberItem].forEach[ n | n.postUpdate(0)]
 
    var Number nWeckZeit = (WeckZeitStunde.state as Number) * 60 + (WeckZeitMinute.state as Number))
    WeckZeit.postUpdate(nWeckZeit)
	    var Number nWeckTage = 0
    gWecker.members.filter[i | i instanceof SwitchItem].forEach[n | 
        nWeckTage = nWeckTage + if(n.state == ON) 2^(Int::parseInt(n.name.split("_").get(1)))
    ]
    WeckTage.postUpdate(nWeckTage)
	logInfo("wecker_test","1 Status WeckDimmzeit: {}",WeckDimmzeit.state)
    tWecker?.cancel
    tWecker = createTimer(now.withTimeAtStartOfDay.plusMinutes(nWeckZeit).plusDays(if(now.getMinuteOfDay < nWeckZeit) 0 else 1), [ | 
        if((WeckTage.state as Number).toBigDecimal.toBigInteger.testBit(now.getDayOfWeek) && (MyDimmer.state as Number) < WeckMaximum) {
            MyDimmer.sendCommand( (MyDimmer.state as Number) + 1)
            tWecker.reschedule(now.plusSeconds((WeckDimmzeit.state as Number).intValue))
        }
        else
            tWecker.reschedule(now.withTimeAtStartOfDay.plusMinutes(nWeckZeit).plusDays(1))
    ])
end
item:

Code: Alles auswählen

Group gWecker
Number WeckZeitStunde "Stunde [%d]" (gWecker)
Number WeckZeitMinute "Minute [%d]" (gWecker)
Switch WeckZeitTag_1 "Montag [%s]" (gWecker)
Switch WeckZeitTag_2 "Dienstag [%s]" (gWecker)
Switch WeckZeitTag_3 "Mittwoch [%s]" (gWecker)
Switch WeckZeitTag_4 "Donnerstag [%s]" (gWecker)
Switch WeckZeitTag_5 "Freitag [%s]" (gWecker)
Switch WeckZeitTag_6 "Samstag [%s]" (gWecker)
Switch WeckZeitTag_7 "Sonntag [%s]" (gWecker)
Number WeckMaximum "Maximum [%d%%]"
Number WeckDimmzeit "Dimmzeit [%d Sek]"
Number WeckTage
Number WeckZeit

Dimmer MyDimmer "TradFri Wecker [%d %%]" { channel="tradfri:0220:gwa0c9a0d9a769:65537:brightness" }
sitemap (Auszug)

Code: Alles auswählen

Frame {
			Text label="Wecker [%s]" {
    Frame label="Zeit" {
       Setpoint item=WeckZeitStunde minValue=0 maxValue=23 step=1
        Setpoint item=WeckZeitMinute minValue=0 maxValue=55 step=5
    }
    Frame label="Wochentage" {
        Switch item=WeckZeitTag_1
        Switch item=WeckZeitTag_2
        Switch item=WeckZeitTag_3
       Switch item=WeckZeitTag_4
        Switch item=WeckZeitTag_5
        Switch item=WeckZeitTag_6
       Switch item=WeckZeitTag_7
    }
    Frame label="Konfiguration" {
        Setpoint item=WeckMaximum minValue=10 maxValue=100 step=5
       Setpoint item=WeckDimmzeit minValue=1 maxValue=20 step=1
    }
	}
	}
and IT works ;)

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

Re: Wecker mit TRADFRI realisieren

Beitrag von udo1toni »

Hast Du alle Items initialisiert (also für jedes Item einmal einen Wert ausgewählt)?

Logging gibt es natürlich nur, wenn man es auch einbaut:

Code: Alles auswählen

// Globale Variablen immer zu Beginn der Datei definieren!

var Timer tWecker = null

rule "Wecker Change"
when
    Member of gWecker changed
then
    logInfo("wecker_test","Rule Wecker Change getriggert")
    if(previousState == NULL) return;

    // initialize all items that are of status NULL
    if(!(WeckDimmzeit.state instanceof Number)) WeckDimmzeit.postUpdate(1)
    if(!(WeckMaximum.state instanceof Number)) WeckMaximum.postUpdate(100)
    gWecker.members.filter[i | i.state == NULL && i instanceof SwitchItem].forEach[ n | n.postUpdate(OFF)]
    gWecker.members.filter[i | i.state == NULL && i instanceof NumberItem].forEach[ n | n.postUpdate(0)]
 
    var Number nWeckZeit = (WeckZeitStunde.state as Number) * 60 + (WeckZeitMinute.state as Number))
    WeckZeit.postUpdate(nWeckZeit)
    var Number nWeckTage = 0
    gWecker.members.filter[i | i instanceof SwitchItem].forEach[n | 
        nWeckTage = nWeckTage + if(n.state == ON) 2^(Int::parseInt(n.name.split("_").get(1)))
    ]
    WeckTage.postUpdate(nWeckTage)
    logInfo("wecker_test","1 Status WeckDimmzeit: {}",WeckDimmzeit.state)
    tWecker?.cancel
    tWecker = createTimer(now.withTimeAtStartOfDay.plusMinutes(nWeckZeit).plusDays(if(now.getMinuteOfDay < nWeckZeit) 0 else 1), [ | 
        if((WeckTage.state as Number).toBigDecimal.toBigInteger.testBit(now.getDayOfWeek) && (MyDimmer.state as Number) < WeckMaximum) {
            MyDimmer.sendCommand( (MyDimmer.state as Number) + 1)
            tWecker.reschedule(now.plusSeconds((WeckDimmzeit.state as Number).intValue))
        }
        else
            tWecker.reschedule(now.withTimeAtStartOfDay.plusMinutes(nWeckZeit).plusDays(1))
    ])
end
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Re: Wecker mit TRADFRI realisieren

Beitrag von atk69 »

Mit initialisieren meinst du wohl in der BasicUI einmal alle Schalter und Einstellungen betätigen, oder ?

Bild

habe ich gemacht.
um 20:49 deine aktuelle Rule eingefügt. Im Log kommt dann folgendes:

Code: Alles auswählen

2019-09-08 20:49:46.671 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'wecker.rules' has errors, therefore ignoring it: [17,100]: mismatched input ')' expecting 'end'

2019-09-08 20:49:47.718 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'wecker.rules' has errors, therefore ignoring it: [17,100]: mismatched input ')' expecting 'end'

2019-09-08 20:50:49.583 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'wecker.rules' has errors, therefore ignoring it: [18,100]: mismatched input ')' expecting 'end'
um 20:51 alle Einstellungen betätigt und auf 20:55 den Wecker gestellt.
Es passiert gar nichts. Auch keine Logeinträge. Somit läuft die rule erst gar nicht an ?!
and IT works ;)

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

Re: Wecker mit TRADFRI realisieren

Beitrag von udo1toni »

Na ja, die Fehlermeldung besagt, dass die Rule gar nicht erst ausgeführt wird.
Was steht in Zeile 17?

Falls es diese Zeile ist:

Code: Alles auswählen

    var Number nWeckZeit = (WeckZeitStunde.state as Number) * 60 + (WeckZeitMinute.state as Number))
lösche bitte das letzte Zeichen (eine schließende Klammer), die ist zu viel.
Und wenn Du schon dabei bist, habe ich noch einen weiteren Fehler gefunden ;) und zwar in Zeile 27:

Code: Alles auswählen

        if((WeckTage.state as Number).toBigDecimal.toBigInteger.testBit(now.getDayOfWeek) && (MyDimmer.state as Number) < WeckMaximum) {
es muss stattdessen

Code: Alles auswählen

        if((WeckTage.state as DecimalType).toBigDecimal.toBigInteger.testBit(now.getDayOfWeek) && (MyDimmer.state as Number) < WeckMaximum) {
heißen, also as DecimalType statt as Number, das liegt daran, dass Number keine Methode toBigDecimal kennt.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Re: Wecker mit TRADFRI realisieren

Beitrag von atk69 »

Vielen Dank für deine "Spätschicht" udo1toni :-)
Habe es korrigiert.
Werde es heute Abend testen und rückmelden.
EDIT:
so, habe getestet und folgendes erhalten:

Code: Alles auswählen

2019-09-09 17:06:26.913 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'wecker.rules' has errors, therefore ignoring it: [21,51]: no viable alternative at input '^'
Er mag wohl das Zeichen "^" nicht :

Code: Alles auswählen

nWeckTage = nWeckTage + if(n.state == ON) 2^(Int::parseInt(n.name.split("_").get(1)))
So langsam mag ich Java nicht mehr 8-)
Gruss
atk69
and IT works ;)

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

Re: Wecker mit TRADFRI realisieren

Beitrag von udo1toni »

Das kommt davon, wenn man es selbst nicht ausprobiert...

^ bedeutet in Java Exclusives Oder. Es gibt wohl auch kein anderes Kurzzeichen, dafür aber eine Funktion. Math.pow(double a, double b).

Dementsprechend müsste die Zeile so aussehen:

Code: Alles auswählen

nWeckTage = nWeckTage + if(n.state == ON) (Math.pow(2,(Int::parseInt(n.name.split("_").get(1))))).intValue
Das .intValue ist notwendig, weil Math.pow() mit double rechnet.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten