Seite 1 von 1

Kino Leinwnd und Beamer einzelt ausfahren mit Openhabian

Verfasst: 22. Jul 2018 12:38
von ModjoMc06
Hi, Ihr lieben.

Nun. ist es endlich so weit und mein Haus ist voll kommen smartHome, dank Raspi, und Openhab. Tolle software.
aber allerdings bin ich dabei Unser Kino mit openha kompatiebel zumachen. zumindest wenn ich Alexa sagen kino an, oder auf den Teblet auf den Reiter Kino an klicke. soll der Beamer automatisch runterfahren, und dann die leinwand runter fahren.

Leider bekomme ich das nicht so hin das es läuft. außer das ich alles Einzelt anklicken muss oder auch sagen muss. hat den jemand eine Idee.
oder auch sowas mal gemacht und eine lösung für mich.. parat

Re: Kino Leinwnd und Beamer einzelt ausfahren mit Openhabian

Verfasst: 23. Jul 2018 13:51
von udo1toni
Naja, das sollte eigentlich kein Problem sein. Du brauchst nur die passenden Items, je nachdem, wie es technisch gelöst ist je ein Item für Leinwand und Beamerlift, ein weiteres Item für die Szene, je nach Beamer noch ein paar weitere Items für die Beamersteuerung. Diese Items müssen natürlich mit den passenden Geräten verbunden werden, je nach eingesetzter Technik über ein OH2 Binding (dann mit Thing und Channel) oder über ein OH1 Binding (dann direkt mit dem Binding).
Das Item zur Steuerung (das nimmt den Befehl "Kino" entgegen) braucht kein Binding, dafür aber natürlich Kontakt zu Alexa und ein Widget in der Sitemap, damit man es bedienen kann. Dazu kommt dann noch eine Rule, die nacheinander die passenden Befehle aufruft, wenn der Befehl "Schalte Kino ein" kommt. Da hier verschiedene Geräte mit erheblicher zeitlicher Verzögerung eingeschaltet werden sollen, sollte ein Timer zum Einsatz kommen.

Nehmen wir mal folgende Items als gegeben an:

Code: Alles auswählen

Switch        scKino       "Kino"                             [ "switchable" ] //Szenensteuerung
Rollershutter rLeinwand    "Leinwand [%d %%]"   <cinemascreen> {channel="..."} //Leinwandlift
Rollershutter rBeamerlift  "Beamerlift [%d %%]" <beamer>       {channel="..."} //Beamerlift
Switch        sBeamerPower "Beamer Power [%s]"  <beamer>       {channel="..."} //Beamer Power
// ...
Nehmen wir weiter an, die Leinwand braucht 15 Sekunden, um herunter zu fahren, der Beamer braucht 20 Sekunden zum runterfahren und 30 Sekunden zum Einschalten. Der Beamer soll erst eingeschaltet werden, wenn der Lift schon vollständig ausgefahren ist. Dann sähe ein passende Rule ungefähr so aus:

Code: Alles auswählen

var Timer tKino = null                                 // Timervariable für die Szenensteuerung
var Number iKino = 0                                   //  Ablaufzähler für die Szenensteuerung

rule "Kino einschalten"
when
    Item scKino changed to ON
then
    if (tKino !== null) return;                        // die Szenensteuerung ist bereits in Betrieb, Abbruch!
    tKino = createTimer(now, [ |                       // setze Timer und führe ihn unmittelbar aus
        iKino = iKino + 1                   
        switch iKino {
            case 1: {                                  // 1. Schritt, schalte Beamer ein
                rBeamerlift.sendCommand(DOWN)
                tKino.reschedule(now.plusSeconds(20))  // nächster Schritt in 20 Sekunden (Beamer ist unten angekommen)
            }
            case 2: {                                  // 2. Schritt, Beamer an
                sBeamerPower.sendCommand(ON)
                tKino.reschedule(now.plusSeconds(15))  // Warmup 30 Sekunden, dann soll die Leinwand bereits unten sein
            }
            case 3: {                                  // 3. Schritt, Leinwand runter
                rLeinwand.sendCommand(DOWN)
                tKino.reschedule(now.plusSeconds(15))  // Szenensteuerung wird beendet, sobald die Leinwand unten ist
            }
            default: {                                 // 4. Schritt, Szene für nächsten Aufruf reinitialisieren
                iKino = 0
                tKino = null
            }
        }
    ])
end
Das Ganze ist eine rein zeitgesteuerte Ablaufsteuerung. Wenn der Beamer sehr schnell betriebsbereit ist (z.B. LED-Beamer), kann es sein, dass man Schritt zwei und drei tauschen muss, damit die Leinwand rechtzeitig unten ist. Vielleicht kann der Beamer auch schon eingeschaltet werden, während der Lift noch arbeitet, weil der Beamer nicht empfindlich gegen Erschütterungen ist.
Durch die switch-Anweisung ist der Rule-Aufbau denkbar einfach.
Die Rule selbst läuft nur wenige Millisekunden, die zum Prüfen auf einen vorhandenen Timer und das Initialisieren des Timers benötigt werden.
Der Timer ist ebenfalls simpel, jedesmal, wenn der Timer-Code ausgeführt wird, wird der Zähler iKino um eins erhöht. Anschließend wird mit der switch-Anweisung der Stand des Zählers geprüft. Der 1. Timer startet unmittelbar, der 1. Schritt wird ausgeführt. Am Ende dieses Schritts wird der Timer erneut geplant. Da der Timer bereits im Speicher ist, muss er nicht erneut initialisiert werden, das macht einen Teil der Einfachheit dieses Lösungsansatzes aus :)

Der Letzte Schritt in der Ablaufsteuerung ist default, dieser Schritt wird bei jedem nicht gelisteten Wert ausgeführt. Damit ist also sichergestellt, dass die Ablaufsteuerung auf jeden Fall wieder korrekt initialisiert ist.

Re: Kino Leinwnd und Beamer einzelt ausfahren mit Openhabian

Verfasst: 24. Jul 2018 12:27
von ModjoMc06
Hallo, udo1toni. Ichdanke dir für deine Rasche antwort. Und deiner Beschreibung. ich finde die ist echt super.
Und danach kann ich schon etwas weier arbeiten.. hatte ja auch genaus dieses problem mit den Rule... derzeitig musste ich alles einzelt abfragen. mit zb
alexa schalte kino an. leinwand an lüfter.. ob wohl alexa zum teil selbst dieses nicht erkennt. und mir sagt es tut mir leid ich kenne keine schümpfwörter. aber nun ja.

Na deiner ausführlichen anleitung und auf was man achte muss konnte ich gut vorran kommen.

in diesen sinne vielen lieben dank...

ja ja durch diese seite wird das haus immer besser.

Re: Kino Leinwnd und Beamer einzelt ausfahren mit Openhabian

Verfasst: 28. Jul 2018 08:41
von ModjoMc06
Hallo. ihr lieben..
Ich bin mir nun nicht wirklich so sicher ob ich dies nun so richtig gemacht hab. daher auch meine frage, ob ich dies hier nun richtig gemacht hab, de code setze ich natürlich rein. wenn es möglich ist gibt mir einfach ein feedback.

poweroutlets.items:

Code: Alles auswählen

Group grp_poweroutlets "Funksteckdosen Gruppe" <poweroutlet>
String poweroutletDSwitch "Wohnzimmer Kino" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletD-control:input", autoupdate="true" }
String poweroutletCSwitch "Wohnzimmer TV Center" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletC-control:input", autoupdate="true" }
String poweroutletBSwitch "Wohnzimmer Tv Lampe" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletB-control:input", autoupdate="true" }
String poweroutletASwitch "Wohnzimmer Lampe Fenster" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletA-control:input", autoupdate="true" }
String poweroutletESwitch "Wohnzimmer Playsation" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletE-control:input", autoupdate="true" }
String poweroutletFSwitch "Wohnzimmer Kino Lampe" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletF-control:input", autoupdate="true" }
String poweroutletWKSwitch "Wohnzimmer Klimaanlage" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutleWK-control:input", autoupdate="true" }
String poweroutletWSTSwitch "Wohnzimmer Studio" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutleWST-control:input", autoupdate="true" }
String poweroutletWDKSwitch "Wohnzimmer Decken Klimaanlage2" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutleWDK-control:input", autoupdate="true" }
# hier der Beamer Power
String poweroutletWPSwitch "Beamer " <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutleWP-control:input", autoupdate="true" }
# ende....

String poweroutletSTSwitch "Schlafzimmer Tv" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletST-control:input", autoupdate="true" }
String poweroutletSKSwitch "Schlafzimmer Klimaanlage" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletSK-control:input", autoupdate="true" }
String poweroutletSLSwitch "Schlafzimmer Lampe" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletSL-control:input", autoupdate="true" }
String poweroutletSOSwitch "Schlafzimmer Office" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletSO-control:input", autoupdate="true" }

String poweroutletKHSwitch "Heizung" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletKH-control:input", autoupdate="true" }
String poweroutletKWSwitch "küche waschmaschiene" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletKW-control:input", autoupdate="true" }
String poweroutletKSLSwitch "Küchen Schrank Lampe" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletKSL-control:input", autoupdate="true" }
String poweroutletKKSwitch "küche Kaffeemaschine" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletKK-control:input", autoupdate="true" }
String poweroutletKBLSwitch "Küchen Boden Lampe" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletKBL-control:input", autoupdate="true" }

String poweroutletSL2Switch "Pool lampen" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletSL2-control:input", autoupdate="true" }
String poweroutletSBLSwitch "Pool Pumpe" <poweroutlet> (grp_poweroutlets) [ "Switchable" ] { channel="exec:command:poweroutletSBL-control:input", autoupdate="true" }

# Kinos system
Switch        scKino       "Kino"                             [ "switchable" ] //Szenensteuerung
Rollershutter rLeinwand    "Leinwand [%d %%]"   <cinemascreen> {channel="..."} //Leinwandlift
Rollershutter rBeamerlift  "Beamerlift [%d %%]" <beamer>       {channel="..."} //Beamerlift
Switch        sBeamerPower "Beamer Power [%s]"  <beamer>       {channel="..."} //Beamer Power
Code kino.rules:

Code: Alles auswählen

var Timer tKino = null                                 // Timervariable für die Szenensteuerung
var Number iKino = 0                                   //  Ablaufzähler für die Szenensteuerung

rule "Kino einschalten"
when
    Item scKino changed to ON
then
    if (tKino !== null) return;                        // die Szenensteuerung ist bereits in Betrieb, Abbruch!
    tKino = createTimer(now, [ |                       // setze Timer und führe ihn unmittelbar aus
        iKino = iKino + 1                   
        switch iKino {
            case 1: {                                  // 1. Schritt, schalte Beamer ein
                rBeamerlift.sendCommand(DOWN)
                tKino.reschedule(now.plusSeconds(30))  // nächster Schritt in 20 Sekunden (Beamer ist unten angekommen)
            }
            case 2: {                                  // 2. Schritt, Beamer an
                sBeamerPower.sendCommand(ON)
                tKino.reschedule(now.plusSeconds(40))  // Warmup 30 Sekunden, dann soll die Leinwand bereits unten sein
            }
            case 3: {                                  // 3. Schritt, Leinwand runter
                rLeinwand.sendCommand(DOWN)
                tKino.reschedule(now.plusSeconds(30))  // Szenensteuerung wird beendet, sobald die Leinwand unten ist
            }
            default: {                                 // 4. Schritt, Szene für nächsten Aufruf reinitialisieren
                iKino = 0
                tKino = null
            }
        }
    ])
end
und zu letzt die Home.sitemap Code:

Code: Alles auswählen

sitemap poweroutlets label="poweroutlets" {
			Text item=Temperature icon="sun_clouds"
	Text label="Flur" icon="corridor"{
		Frame label="Aemparaturußent"
			Text item=Temperature icon="sun_clouds"
			}
			Text    label="Webcam Flur" icon="camera" {
					Video url="http://webcam.abcd.de/webcam.jpg" encoding="mjpeg" label="IP-Cam 01"
			}
	Text label="Schlafzimmer" icon="bedroom"{
		Frame label="Funkstekdosen Schlafzimmer Gruppe"
			Switch item=poweroutletSTSwitch icon="screen" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletSKSwitch  icon="fan_ceiling" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletSLSwitch icon="light" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletSOSwitch icon="network" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletSL2Switch icon="light" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletSBLSwitch icon="light" //mappings=[ "ON"="ON", "OFF"="OFF" ]
		}
	Text label="Schlafzimmer Böro" icon="office"{
		Frame label="Funkstekdosen Schlafzimmer Böro"
			Switch item=poweroutletSLSwitch icon="light" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletSOSwitch icon="network" //mappings=[ "ON"="ON", "OFF"="OFF" ]
		}
		Text    label="Webcam Schlafzimmer" icon="camera" {
					Video url="http://webcam.abcd.de/webcam.jpg" encoding="mjpeg" label="IP-Cam 01"
			}
	Text label="Küche" icon="kitchen"{
		Frame label="Funkstekdosen Küchen Gruppe"
			Switch item=poweroutletKHSwitch icon="heating" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletKWSwitch icon="washingmachine" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletKSLSwitch icon="light" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=RadioPower icon="soundvolume"
			Slider visibility=[RadioPower==ON] item=RadioVolume icon="soundvolume"
			Switch visibility=[RadioPower==ON] item=RadioMute
			Selection visibility=[RadioPower==ON] item=RadioPreset mappings=[0="Favourit 1", 1="Favourit 2", 2="Favourit 3", 3="Favourit 4"]
			Selection visibility=[RadioPower==ON] item=RadioMode mappings=[0="Internet Radio", 1="Musik Player", 2="DAB", 3="FM", 4="AUX"]
			Text visibility=[RadioPower==ON] item=RadioInfo1
			Text visibility=[RadioPower==ON] item=RadioInfo2
			Switch item=poweroutletKBLSwitch icon="light" //mappings=[ "ON"="ON", "OFF"="OFF" ]
		}
		
	Text label="Webcam Küche" icon="camera" {
		Frame label="Webcam Küche" icon="camera" 
			Video url="http://webcam.abcd.de/webcam.jpg" encoding="mjpeg" label="IP-Cam 01"
			}
	Text label="Wohnzimmer" icon="groundfloor"{
		Frame label="Funkstekdosen Wohnzimmer Gruppe " icon="projector"
			Switch item=poweroutletDSwitch icon="projector" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletCSwitch icon="screen" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletBSwitch icon="light" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletASwitch icon="light" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletESwitch icon="player" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletFSwitch icon="light" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletWKSwitch icon="snow" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletWSTSwitch icon="soundvolume" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletWDKSwitch icon="fan_ceiling" //mappings=[ "ON"="ON", "OFF"="OFF" ]
			Switch item=poweroutletDPSwitch icon="player" //mappings=[ "ON"="ON", "OFF"="OFF" ]
		}
		Text label="Kodi (Fire TV Stick)" icon="video" {
		Frame label="System" { 
		Text item=XBMC_System_State label="Systemstatus [%s]"
		Text item=XBMC_Label_System_Uptime label="Systemlaufzeit [%s]"
		//Switch item=XBMC_System_Shutdown label="Herunterfahen" mappings=[OFF="OK"] visibility=[XBMC_System_State==ON]
		}
		Frame label="Mediensteuerung" {
		Switch item=XBMC_Player_PlayPause label="Wiedergabe starten" mappings=[ON="Play"] visibility=[XBMC_Player_State==Pause]
		Switch item=XBMC_Player_PlayPause label="Wiedergabe pausieren" mappings=[ON="Pause"] visibility=[XBMC_Player_State==Play]
		Switch item=XBMC_Player_Stop label="Wiedergabe beenden" mappings=[ON="Stop"] visibility=[XBMC_Player_State==Play, XBMC_Player_State==Pause] 
		}
		Frame label="Medieninformationen" {
		Text item=XBMC_Player_State label="Medienstatus [%s]"
		Text item=XBMC_Player_Title label="Gerade läuft [%s]"
		Text item=XBMC_Label_Player_Time label="Aktuelle Laufzeit [%s]"
		Text item=XBMC_Label_Player_FinishTime label="Ende um [%s]"
		Text item=XBMC_Label_VideoPlayer_VideoCodec label="Video-Codec [%s]"
		} 
		Text label="Wohnzimmer Kino" icon="groundfloor"{
		Switch item=Kino_Leinwand label="Leinwand [%d %%]" icon="rollershutter_rev" mappings=[0="ZU", 25="25%", 40="40%", 50="50%", 75="75%", 98="FROST", 100="OFFEN"]
		Switch item=Beamer label="Beamer [%d %%]" icon="rollershutter_rev" mappings=[0="ZU", 25="25%", 40="40%", 50="50%", 75="75%", 98="FROST", 100="OFFEN"]
	}
	
	Text    label="Webcam Wohnzimmer" icon="camera" {
					Video url="http://webcam.abcd.de/webcam.jpg" encoding="mjpeg" label="IP-Cam 01"
			}
	}