Stimmt... Da bin ich auf den Namen reingefallen (OH1 Binding hat einen ziemlich anderen Namen als das OH2 Binding). Kommt davon...
Ankündigung
Einklappen
Keine Ankündigung bisher.
openhab2 + harmony hub + Einschaltszene
Einklappen
X
-
Hi Jungs,
ich muss das Thema noch einmal kurz aufgreifen....
mein Bestreben ist es zusätzlich zur Einschaltszene "Fernsehen" (über Harmony Hub) auch noch die KNX Rollos in Position fahren zu lassen.
kann ich das über eine "rule" lösen oder muss ich dazu eine 2te rule mit dem gleichen Befehl hinzufügen?
die Einschaltszene " Fernsehen" funkt ja bereits:
item:
HTML-Code:String harmony_hub_tv "TVgucken" (gHarmony) { channel="harmonyhub:hub:MediaHarmonyHub:currentActivity" } Switch harmony_hub_tv_act "Fernseher" (gHarmony) [ "Switchable" ]
HTML-Code:rule "Fernseher an/aus" when Item harmony_hub_tv_act received command then switch(receivedCommand) { case ON : harmony_hub_tv.sendCommand("TVgucken") case OFF : harmony_hub_tv.sendCommand("PowerOff") } end
jetzt möchte ich noch zu diesem Befehl hinzugeben, dass meine Rollos z.B.:70% runterfahren wenn der Befehl "Fernsehen" gesprochen wird.
meine Rollos werden wie folgt gesteuert:
HTML-Code:Rollershutter RolloWohnen_site "Rollladen Wohnen1 [%d %%]" (gRollo) { knx="4/0/2,4/1/16,4/4/1+<4/5/1" } Switch RolloWohnen "Rollladen Wohnen" [ "Lighting" ]
kann ich dann gleich in der bestehenden rule die Rollos miteinbauen oder muss ich dazu eine gesonderte rule machen wo ich mit dem gleichen Befehl "Fernsehen ein" die Rollos zusätzlich steuere?
z.B.: so..
HTML-Code:rule "Fernseher an/aus + Rollos runter" when Item harmony_hub_tv_act received command then switch(receivedCommand) { case ON : RolloWohnen_site.sendCommand(Down) case OFF : RolloWohnen_site.sendCommand(UP) } end
und um den ganzen noch eines drauf zu setzen.....
wenn die Rollos 100% Runter (also geschlossen sind) sollen diese nichts machen. z.B.: bei mir fahren die Rollos automatisch am Abend runter und da möchte ich dann nicht wenn "Fernseher EIN oder AUS" gesagt wird dass sich die Rollos noch bewegen.
machbar so etwas?
Kommentar
-
Es sollte reichen, die rule zu ergänzen. Wie fahren die Läden automatisch? Hast Du dafür shcon eine Rule, oder läuft das rein auf knx-Ebene?
Wichtig ist erstmal, dass Du Dir merkst, ob die Läden automatisch geschlossen wurden. Falls also der Steuerbefehl z.B. von einer Schaltuhr in knx kommt, musst Du den Steuerausgang auch in openHAB als Switch Item anlegen, damit Du den Zustand hast. Falls Du die Läden ohnehin über openHAB steuerst, kannst Du natürlich einfach ein ungebundenes Item verwenden, um Dir den Zustand zu merken. Dann geht's in der Rule so:
Code:rule "Fernseher an/aus" when Item harmony_hub_tv_act received command then switch(receivedCommand) { case ON : { harmony_hub_tv.sendCommand("TVgucken") if ((RolloWohnen_site.state as DecimalType).intValue != 100) RolloWohnen_site.sendCommand(DOWN) } case OFF : { harmony_hub_tv.sendCommand("PowerOff") if (meinAutoItem.state!=ON) RolloWohnen_site.sendCommand(UP) } } end
Wenn der Fernseher dagegen ausgeschaltet wird, wird geprüft, ob der Laden eigentlich offen sein sollte und entsprechend eventuell geöffnet.
Das Ganze lässt sich natürlich noch verfeinern, vielleicht wurde der Laden ja ursprünglich von der Beschattungsposition verfahren, dann sollte diese angefahren werden, aber vielleicht nur, wenn sich die Lichtverhältnisse nicht inzwischen geändert haben.
Es kann auch sein (je nach Fernsehgewohnheiten) dass Du in der Rule einen Merker setzen musst, den Du wiederum beim automatischen Öffnen der Läden abfragen musst, damit die Läden nicht automatisch auffahren, obwohl Du doch gerade noch fern siehst.
EDIT: Strenggenommen ist das erste if unnötig, der Laden soll auf jeden Fall zugefahren werden. Wenn er schon zu ist, sollte er nicht zucken, da bereits in der Endlage.
Kommentar
-
udo1toni
danke...den Ansatz werde ich mal ausprobieren.
Ja, für die Rollo's habe ich bereits rules und tun auch das was sie solllen (AUF/AB...fahre 50%, usw...).....auch für die Rollo Wohnen. (hatte ich vergessen anzuführen)
HTML-Code:rule "RolloWohnen" when Item RolloWohnen received command then switch(receivedCommand) { case ON : RolloWohnen_site.sendCommand(UP) case OFF : RolloWohnen_site.sendCommand(DOWN) } end
D.h.: wenn zum bestimmten Zeitpunkt zum runterfahren ist, soll es auch so sein u. bleiben! Egal ob ich die Einschaltzene Aktiviere EIN od. AUSschalte.
ich glaube ich muss mich nochmal mit den ganzen "if, else, etc..." beschäftigen.....ich kapier das einfach nicht wann was und vor allem wie anzuwenden ist....
Kommentar
-
Zitat von MrWichtig Beitrag anzeigender Steuerbefehl kommt von meiner Visu....aber ich glaube die brauche ich hierfür eigentlich nicht miteinbeziehen, denn diese hat natürlich immer PRIO1.
D.h.: wenn zum bestimmten Zeitpunkt zum runterfahren ist, soll es auch so sein u. bleiben! Egal ob ich die Einschaltzene Aktiviere EIN od. AUSschalte.Und der Punkt ist auch nicht das Zufahren, sondern das Auffahren der Läden. In dem Moment, wo Du fernsiehst, möchtest Du, dass die Läden geschlossen werden, unabhängig von der Tageszeit -> die Rule fährt die Läden zu. Wenn Du mit Fernsehen aufhörst, muss openHAB prüfen, ob die Läden nun offen oder geschlossen sein sollen, weil jetzt die Priorität nicht mehr beim Fernsehen liegt. Umgekehrt muss die Rule zum Öffnen der Läden prüfen, ob RolloWohnen geöffnet werden darf, denn falls der Fernseher aktiv ist, wäre das unerwünscht. Entsprechendes gilt eben für die Verschattung auch.
ich glaube ich muss mich nochmal mit den ganzen "if, else, etc..." beschäftigen.....ich kapier das einfach nicht wann was und vor allem wie anzuwenden ist....
switch () case funktioniert ja ähnlich, hier gibt es aber nur einen Parameter, der dafür verschiedene Werte annehmen kann. Bei if() gibt es nur zwei Zustände, dafür kann man mit boolscher Algebra ziemlich komplexe Bedingungen erstellen.
Kommentar
-
udo1toni
also ich habe die von erstellte Regel jetzt einmal 1:1 übernommen.
prinzipiell geht da gar nichts jetzt... und im Designer werden mir bei dieser Regel ungültige Syntax angezeigt. Siehe Screenshot
weiters nehme ich an bei dem Punkt "meinAutoItem" (in deiner Regel benannt) meinst Du die GA von der Zeitsteuerung der Rollos? und dafür muss aich auch vorher eine eigene Regel anlegen?
Angehängte Dateien
Kommentar
-
Stimmt, da fehlt eine zweite öffnende Klammer, die Zeile muss korrekt heißen:
Code:if ((RolloWohnen_site.state as DecimalType).intValue != 100)
Wenn Du die Zeitsteuerung momentan über eine GA auf knx-Seite machst, musst Du das Item mit der GA verknüpfen.
Wenn Du die Zeitsteuerung über openHAB erledigst, musst Du das Item mit in die Zeitsteuerung einbinden.
Kommentar
-
ah..was so eine Klammer bewirkt
funkt...und ich habe jetzt glaube auch den if-Befehl verstanden und gleich eine 2.te Rollo mitlaufen lassen. :-)
bin auch gedanklich noch einmal das "Fernseher aus" durchgegangen und eigentlich reicht mir hier NUR das ausschalten der Mediateile und die Rollos sollen in dem Zustand verbleiben bis ich diese extra mit einem Befehl rauf od. runter lasse...Deshalb habe ich die "meinAutoItem Rule" weggelassen.
eine Frage noch zu der Szene:
die Rollos sollen nur zu 70% runtergehen bei der Szene.....jetzt bin ich davon ausgegangen der Wert "intValue != 100" ist dafür zuständig?!
habe den mal auf 50 geändert aber da fahren sie trotzdem 100% runter....muss ich den Wert noch gesondert wo festlegen? und wenn ja was bedeuten die 100?
HTML-Code:rule "Fernseher an/aus" when Item harmony_hub_tv_act received command then switch(receivedCommand) { case ON : { harmony_hub_tv.sendCommand("TVgucken") if ((RolloWohnen_site.state as DecimalType).intValue != 100) RolloWohnen_site.sendCommand(DOWN) if ((RolloEckeSued_site.state as DecimalType).intValue != 100) RolloEckeSued_site.sendCommand(DOWN) } case OFF : { harmony_hub_tv.sendCommand("PowerOff") } } end
Kommentar
-
Das .intValue != 100 bedeutet, die Rollos stehen nicht auf 100 (% geschlossen). Die Abfrage wäre also dann < 70, falls das Rollo schon geschlossen ist, soll es ja nicht auffahren, wenn Du fernsehen willst.
Und dann solltest Du versuchen, ob die Läden die Absolutposition anfahren können, also RolloWohnen_site.sendCommand(70). Falls das nicht geht, wird es schnell ziemlich aufwändig (nötige Fahrzeit von der aktuellen Position berechnen, Rollo verfahren, rechtzeitig abstoppen)
Nur nochmal zur Erläuterung der Einzelteile der if-Anweisung if ((RolloWohnen_site.state as DecimalType).intValue < 70):
Code:if() -> wenn die Bedingung in den Klammern erfüllt ist, führe die nächste Anweisung aus, ansonsten überspringe sie. RolloWohnen_site -> das Item, welches untersucht werden soll. .state -> nimm den Status des Items. as DecimalType -> betrachte den vorhergehenden Wert als Dezimalwert (...).intValue -> wandle den Wert in der Klammer in einen Integerwert (das geht, weil die Klammer ein Wert vom Type Decimal ist) a < b -> a ist kleiner b 100 -> der Zahlenwert 100
Die Abfrage ist also recht einfach zu verstehen. Die größten Probleme sind immer, wie man einen Wert korrekt in einen bestimmten Typ wandelt, damit die beiden Werte korrekt miteinander verglichen werden können.
Zum Beispiel könnte man durchaus einen Status als String betrachten. Dann müsste der Vergleichswert natürlich auch ein String sein, also z.B.:
meinItem.state.toString == "50". Allerdings kann man so nur vergleichen, ob ein Zahlenwert identisch ist oder nicht, man kann aber nicht prüfen, ob der Zahlenwert kleiner oder größer ist.
Kommentar
-
ich habe jetzt einmal wie von Dir vorgeschlagen versucht die Absolute Position anzufahren....
hier sehe ich aber im Log dass der Befehl gar nicht gemeldet wird und somit im Log nicht aufscheint.
habe ich in der Regel noch einen Fehler (Klammer, etc..) ?
HTML-Code:rule "Fernseher an/aus" when Item harmony_hub_tv_act received command then switch(receivedCommand) { case ON : harmony_hub_tv.sendCommand("TVgucken") case ON : RolloWohnen_site.sendCommand(70) case ON : RolloEckeSued_site.sendCommand(70) case OFF : { harmony_hub_tv.sendCommand("PowerOff") } } end
Kommentar
-
Definitiv ja. Du musst Dich schon an die korrekte Schreibweise halten
Code:rule "Fernseher an/aus" when Item harmony_hub_tv_act received command then switch(receivedCommand) { case ON : { harmony_hub_tv.sendCommand("TVgucken") RolloWohnen_site.sendCommand(70) RolloEckeSued_site.sendCommand(70) } case OFF : { harmony_hub_tv.sendCommand("PowerOff") } } end
Code:rule "Fernseher an/aus" when Item harmony_hub_tv_act received command then switch(receivedCommand) { case ON : { harmony_hub_tv.sendCommand("TVgucken") [COLOR=#FF0000] if((RolloWohnen_site.state as DecimalType).intValue < 70)[/COLOR] RolloWohnen_site.sendCommand(70) [COLOR=#FF0000] if((RolloEckeSued_site.state as DecimalType).intValue < 70)[/COLOR] RolloEckeSued_site.sendCommand(70) } case OFF : { harmony_hub_tv.sendCommand("PowerOff") } } end
Zuletzt geändert von udo1toni; 28.07.2017, 12:33.
Kommentar
-
die Szene mit den Rollos hat "mit richtiger Schreibweise wohlgemerkt" vor 2 Tagen funktioniert. Rollos sind automatisch mitgeschalten worden.
heute habe ich es wieder ausprobiert und die Rollos werden nicht mehr angefahren?! gibt es dafür eine Erklärung?
TV-Szene....also alles was Harmony ist schaltet normal ein/aus.
im events.log sehe ich es auch dass die Rollos kein Kommando mehr bekommen.
HTML-Code:2017-07-30 09:35:49.222 [ItemCommandEvent ] - Item 'harmony_hub_tv_act' received command ON 2017-07-30 09:35:49.261 [ItemStateChangedEvent ] - harmony_hub_tv changed from PowerOff to TVgucken 2017-07-30 09:35:49.477 [ItemCommandEvent ] - Item 'harmony_hub_tv' received command TVgucken 2017-07-30 09:35:58.040 [ItemStateChangedEvent ] - harmony_hub_ps3 changed from PowerOff to TVgucken
hier das events.log bis vor 2 Tagen wo es funktioniert hat mit der Rule:
HTML-Code:2017-07-28 13:55:50.081 [ItemCommandEvent ] - Item 'harmony_hub_tv_act' received command ON 2017-07-28 13:55:53.076 [ItemCommandEvent ] - Item 'harmony_hub_tv' received command TVgucken 2017-07-28 13:55:53.081 [ItemStateChangedEvent ] - harmony_hub_tv changed from PowerOff to TVgucken 2017-07-28 13:55:53.275 [ItemCommandEvent ] - Item 'RolloWohnen_site' received command 70 2017-07-28 13:55:53.282 [ItemCommandEvent ] - Item 'RolloEckeSued_site' received command 70 2017-07-28 13:56:01.852 [ItemStateChangedEvent ] - harmony_hub_ps3 changed from PowerOff to TVgucken 2017-07-28 13:56:14.381 [ItemStateChangedEvent ] - RolloEckeSued_site changed from 0 to 70 2017-07-28 13:56:21.341 [ItemStateChangedEvent ] - RolloWohnen_site changed from 0 to 70
im openhab.log ist mir jetzt folgender Error noch aufgefallen:
HTML-Code:2017-07-30 11:06:33.139 [ERROR] [.script.engine.ScriptExecutionThread] - Rule 'Fernseher an/aus': org.eclipse.smarthome.core.library.types.DecimalType 2017-07-30 11:12:32.731 [ERROR] [.script.engine.ScriptExecutionThread] - Rule 'Fernseher an/aus': org.eclipse.smarthome.core.library.types.DecimalType
Zuletzt geändert von MrWichtig; 30.07.2017, 10:17.
Kommentar
-
Hast Du die Abfrage mit drin, oder nicht? Falls ja, könnte es sein, dass der Status leer ist, dann müsste eigentlich eine Fehlermeldung kommen, jedenfalls könnte die Abfrage dann natürlich nicht mehr wahr sein, so dass die Rollos nicht verfahren werden. Um das auszuschließen könntest Du folgendes ergänzen:
Code:if((!(RolloWohnen_site.state instanceof DecimalType) || RolloWohnen_site.state as DecimalType).intValue < 70)
Code:logInfo("TV_an_aus","RolloWohnen_site.state: {}",RolloWohnen_site.state)
Code:logInfo("TV_an_aus","RolloWohnen_site.state: {}",RolloWohnen_site.state) if((!(RolloWohnen_site.state instanceof DecimalType) || RolloWohnen_site.state as DecimalType).intValue < 70) { logInfo("TV_an_aus","RolloWohnen_site verfahren auf 70%%") RolloWohnen_site.sendCommand(70) }
Kommentar
-
habe ich die Rule so richtig umgebaut als das ganze? im Designer zeigt es mir wieder Fehler an...?siehe Screenshot
HTML-Code:rule "Fernseher an/aus" when Item harmony_hub_tv_act received command then switch(receivedCommand) { case ON : { harmony_hub_tv.sendCommand("TVgucken") if((RolloWohnen_site.state as DecimalType).intValue < 70) RolloWohnen_site.sendCommand(70) logInfo("TV_an_aus","RolloWohnen_site.state: {}",RolloWohnen_site.state) if((!(RolloWohnen_site.state instanceof DecimalType) || RolloWohnen_site.state as DecimalType).intValue < 70) { logInfo("TV_an_aus","RolloWohnen_site verfahren auf 70%%") RolloWohnen_site.sendCommand(70) } if((RolloEckeSued_site.state as DecimalType).intValue < 70) RolloEckeSued_site.sendCommand(70) logInfo("TV_an_aus","RolloWohnen_site.state: {}",RolloWohnen_site.state) if((!(RolloEckeSued_site.state instanceof DecimalType) || RolloEckeSued_site.state as DecimalType).intValue < 70) { logInfo("TV_an_aus","RolloWohnen_site verfahren auf 70%%") RolloEckeSued_site.sendCommand(70) } } case OFF : { harmony_hub_tv.sendCommand("PowerOff") } } end
in welchem Log sollte ich dann mehr Infos stehen haben? events.log oder openhab.log?Angehängte Dateien
Kommentar
Kommentar