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

Re: Wecker mit TRADFRI realisieren

Beitrag von atk69 »

Ja, wenn ich mit der Einstellung vom Bild aus der Eintrag vom 8. Sep 2019 14:56 (1te Seite) "SZ_Decke_L_Helligkeit " einen GUI Eintrag erstelle, ist es automatisch ein Slider, der auch funktioniert.
Hast du das Bild überhaupt gesehen ?
Ist etwas schwierig hier ein Bild / Screenshot reinzubekommen. Ist ein link zur telekom-cloud.
Hier nochmals der link:Bild

P.S. der Slider funktioniert auch, wenn ich das item "MyDimmer" eintrage. "MyDimmer" stammt ja aus der wecker.items.
and IT works ;)

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

Re: Wecker mit TRADFRI realisieren

Beitrag von udo1toni »

Ogottogott...

Bitte nicht ohne triftigen Grund mehrere Items auf einen Channel verlinken. Bitte niemals unterschiedliche Itemtypen auf einen Channel verlinken.

Soll heißen: Wenn Du ein Item SZ_Decke_L_Helligkeit hast, mit dem die Steuerung funktioniert, musst Du natürlich in einer Rule, die diesen Channel steuern soll, dieses Item zum Steuern verwenden, nicht ein weiteres Item mit dem Channel verlinken.

Ich sehe auf dem Bild ein Item OG_SZ_Decke, welches mit dem Label ON / OFF versehen ist. Mach das bitte weg!

Du hast ein Dimmer Item SZ_Decke_L_Helligkeit, dieses versteht ON, OFF, INCREASE, DECREASE und die Zahlen 0 bis 100 als Befehle. Es liefert den Status grundsätzlich als Zahlenwert zurück.
Wenn Du dieses Dimmer Item in einer Sitemap mit einem Switch Widget verbindest, wird das Switch Widget bei allen Zahlen > 0 auf ON springen und bei 0 auf OFF. Weiterhin wird der Dimmer auf den ON oder OFF Befehl reagieren.

Es gibt Situationen, wo man mehrere Items auf einen Channel verlinkt, hier ist das aber falsch.

Zum Bild: Wenn Du "Vollständiger Editor & Vorschau" anklickst, bekommst Du unterhalb des Editor-Bereichs zwei Karteireiter, einer mit Optionen, der andere für Dateianhänge.
Da es leider massive Belästigungen durch Spammer gab, darf nicht jeder automatisch beliebig Dateianhänge posten, grundsätzlich sollte es aber gehen (Versuch macht kluch, oder so ähnlich... ;) ). Es sollte sogar Drag&Drop in den Editor funktionieren, allerdings nur mit lokal vorhandenen Bildern (die Funktion hab ich noch nie ausprobiert).
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 »

Uups, ich Dummerchen (auch wenn es mir nicht bewusst war) :oops: :oops: :oops:
Sorry, habe jetzt alle verlinkte Items enfernt, so dass nur der Dimmer übrig blieb.
Es funktioniert jetzt einwandfrei :lol:

Aber eine Frage hätte ich denoch, während des Dimmes lässt sich die rule offenbar nicht stoppen (per Fernbedienung)
nach der eingestellten Dimmzeit geht die Lampe wieder an. Ist der Dimmvorgang abgeschlossen, kann ich "normal" abschalten.
Lässt sich da noch was ändern (ohne grossen Aufwand) ?

Gruss
und Dank

atk69
and IT works ;)

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

Re: Wecker mit TRADFRI realisieren

Beitrag von udo1toni »

Ja, selbstverständlich lässt sich ein laufender Timer auch abbrechen, mittels tWecker?.cancel. Du musst halt eine weitere Rule dazu bauen, die das erledigt. Der größte Knackpunkt dabei ist aber, dass der Timer anschließend für den nächsten Wecktermin gestartet wird. Am besten wäre es also, innerhalb des Timers ein Item abzufragen, falls das dann OFF ist (Wecker aus), springt der Timer gleich in den else-Teil, in dem die nächste Weckzeit programmiert wird.
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 »

Alles klar, das habe ich verstanden.
Wird aber wohl nicht realisierbar sein, da die FB nur "Batterieladung" und "Niedriger Batteriestatus" als Channel liefert. Kein ON / OFF Status oder ähnliches.
Trotzdem vielen Dank.

Gruss
atk69
P.S. kleiner Denkfehler: ich muss ja nicht die FB abfragen, sonder nur, ob die Lampe selbst den Status=off hat. Das natürlich erst wenn sie zuvor eingeschaltet wurde. Etwas tricki, mal sehen ob ich da etwas hinbekomme. ;)
and IT works ;)

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

Re: Wecker mit TRADFRI realisieren

Beitrag von udo1toni »

Ah. Die Fernbedienung schaltet die Lampe direkt... Na dann wäre die Variante, die Lampe auf volle Helligkeit zu schalten und die Zeitspanne zu warten, bis der Timer wieder getriggert wird. da kommt es natürlich drauf an, wie lange die einzelnen Schritte dauern (also was im Item WeckDimmzeit hinterlegt ist)
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 »

Sorry, jetzt verstehe ich nur Bahnhof :?: :?: :?:
da kommt es natürlich drauf an, wie lange die einzelnen Schritte dauern (also was im Item WeckDimmzeit hinterlegt ist)
Die Schritte sehe ich ja gut in der GUI, sind immer 1%
Wenn ich die "Dimmzeit" auf 5sec stelle und Maxwert 50%, sind das 50*5=250sec bis zum Ende der rule.
and IT works ;)

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

Re: Wecker mit TRADFRI realisieren

Beitrag von udo1toni »

Genau. Aber wenn Du vor Ablauf der 250 Sekunden das Licht auf volle Helligkeit dimmst, wird die Rule im nächsten Schritt (also innerhalb 5 Sekunden) den Timer auf den nächsten Tag setzen.
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 zusammen

nach einigen Monaten Inaktivität, habe ich die Rule (Wecker) wieder aktiviert.
Zwischenzeitlich habe ich upgedated auf OH 2.5.6.
Leider bekomme ich wieder einen Fehler mit dem Timer (quartz) den ich nicht verstehe bzw. nicht beheben kann.
Ich vermute einen Syntaxfehler in der Rule. Obwohl ich nichts verändert habe.
Zu besseren Übersicht nochmals die aktuellen items und die rule:

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

    logInfo("wecker_test","1 Status WeckDimmzeit: {}",WeckDimmzeit.state)
    tWecker?.cancel
    tWecker = createTimer(now.withTimeAtStartOfDay.plusMinutes(nWeckZeit.intValue).plusDays(if(now.getMinuteOfDay < nWeckZeit.intValue) 0 else 1), [ | 
        if((gWecker.members.filter[i | i instanceof SwitchItem && i.name.contains(now.getDayOfWeek.toString)].head.state == ON && (MyDimmer.state as Number) < (WeckMaximum.state as Number))) {
            MyDimmer.sendCommand( (MyDimmer.state as Number) + 1)
            tWecker.reschedule(now.plusSeconds((WeckDimmzeit.state as Number).intValue))
        }
        else
            tWecker.reschedule(now.withTimeAtStartOfDay.plusMinutes((WeckZeit.state as Number).intValue).plusDays(1))
    ])
end
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)

//String weckZeitMessage "%s"
//Number weckZeitStunde "Stunde [%d]" <clock>
//Number weckZeitMinute "Minute [%d]" <clock>


Number WeckMaximum "Maximum [%d%%]"
Number WeckDimmzeit "Dimmzeit [%d Sek]"
Number WeckTage
Number WeckZeit

Dimmer MyDimmer "TradFri Wecker [%d %%]" { channel="tradfri:0220:gwa0c9a0d9a769:65548:brightness" }
hier das log:

Code: Alles auswählen

2020-10-19 13:10:00.065 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.Timer 2 2020-10-19T13:10:00.000+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@6f8d60a4 (conditionalExpression: false)
} ] threw an unhandled Exception: 
java.lang.reflect.UndeclaredThrowableException: null
	at com.sun.proxy.$Proxy189.apply(Unknown Source) ~[?:?]
	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]
	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [bundleFile:?]
	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]
Caused by: org.eclipse.smarthome.model.script.engine.ScriptExecutionException: Could not cast NULL to java.lang.Number; line 24, column 132, length 24
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter._doEvaluate(ScriptInterpreter.java:253) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:245) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluateArgumentExpressions(XbaseInterpreter.java:1205) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1135) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:1081) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:991) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:237) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:981) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:237) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:469) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:255) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]
	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]
	... 4 more

Ich hoffe auf Hilfe ;-)

Gruss
Andreas
and IT works ;)

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

Re: Wecker mit TRADFRI realisieren

Beitrag von udo1toni »

Kurzerklärung: Dein Dimmer MyDimmer wird noch keinen gültigen Wert haben.

Lange Version:
Die Fehlermeldung liefert threw an unhandled Exception: und als Grund weiter unten: Caused by: org.eclipse.smarthome.model.script.engine.ScriptExecutionException: Could not cast NULL to java.lang.Number; line 24, column 132, length 24

In Zeile 24, Spalte 132 Beginnt der Ausdruck MyDimmer.state as Number welcher offensichtlich zu mZeitpunkt der Ausführung NULL enthält, das ist keine gültige Zahl und kann also auch nicht nach Number gecastet werden. Im Zweifel kannst Du im Block // initialize all items that are of status NULLeine Zeile ergänzen:

Code: Alles auswählen

    if(!(MyDimmer.state instanceof Number)) MyDimmer.postUpdate(0)
Die Rule geht dann halt davon aus, dass der Dimmer, falls er noch keinen Wert hat, sicher aus ist.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten