diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..15a15b2
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..639900d
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..49916e0
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000..7dfddeb
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1555006799282
+
+
+ 1555006799282
+
+
+ 1555007456798
+
+
+
+ 1555007456798
+
+
+ 1555014306510
+
+
+
+ 1555014306510
+
+
+ 1555532343346
+
+
+
+ 1555532343346
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.8
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.txt b/README.txt
new file mode 100644
index 0000000..7b80edd
--- /dev/null
+++ b/README.txt
@@ -0,0 +1,22 @@
+Installing proxy for paperUI
+sudo bash
+apt-get update
+apt-get install nginx
+
+rm /etc/nginx/sites-enabled/default
+cat >/etc/nginx/sites-available/openhab <<"EOF"
+server {
+ listen 80;
+ server_name lights.level2.lu;
+
+ location / {
+ proxy_pass http://localhost:8080/basicui/;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ }
+}
+EOF
+ln -s /etc/nginx/sites-available/openhab /etc/nginx/sites-enabled/
+service nginx restart
diff --git a/items/allengineeringlights.items b/items/allengineeringlights.items
new file mode 100644
index 0000000..85204c3
--- /dev/null
+++ b/items/allengineeringlights.items
@@ -0,0 +1 @@
+Switch all_engineering_lights "All Engineering Lights" (engineering)
diff --git a/items/alllights.items b/items/alllights.items
new file mode 100644
index 0000000..83964dd
--- /dev/null
+++ b/items/alllights.items
@@ -0,0 +1 @@
+Switch all_lights "All Lights" (level2)
diff --git a/items/level2.items b/items/level2.items
index a3c61ca..3bf22ff 100644
--- a/items/level2.items
+++ b/items/level2.items
@@ -7,16 +7,22 @@ Group engineering "Engineering" (main_floor)
Group lab "Lab" (main_floor)
Group chill_zone "Chill Zone" (main_floor)
Group entrance "Entrance" (main_floor)
+Group area42 "Area42" (main_floor)
//-------------------------------------------------------------------------------
-Switch entrance_door_status "Door Status" { channel="mqtt:topic:entrance_door_status:status" }
+Number entrance_people_counter "People Counter [%s]" (entrance)
+Switch entrance_door_status "Door Status" { channel="mqtt:topic:entrance_door_status:status" }
Switch entrance_ceiling_lamps "Ceiling Lamps" (entrance) { channel="mqtt:topic:entrance_ceiling_lamps:power" }
Switch chill_zone_lamps "Lamps" (chill_zone) { channel="mqtt:topic:chill_zone_lamps:power" }
Switch engineering_table_lamps "Table Lamps" (engineering) { channel="mqtt:topic:engineering_table_lamps:power" }
Switch engineering_ceiling_lamps "Ceiling Lamps" (engineering) { channel="mqtt:topic:engineering_ceiling_lamps:power" }
Switch engineering_status_lamp "Status Lamp" (engineering) { channel="mqtt:topic:engineering_status_lamp:power" }
Switch engineering_ceiling_phone_flash "Ceiling Phone Flash" (engineering) { channel="mqtt:topic:engineering_phone_flash:pulse" }
+Switch area42_status_lamp "Status Lamp" (area42) { channel="mqtt:topic:area42_status_lamp:power" }
+Switch lab_soldering_table "Soldering table" (lab) { channel="mqtt:topic:mosquitto:lab_soldering_table:power" }
+
+
// ----------------------------------------------------------------------------
@@ -38,6 +44,10 @@ Switch chill_zone_beamer
// ----------------------------------------------------------------------------
+//Switch chill_zone_meaow "Meaow" {channel="exec:command:meaow:run"}
+
+// ----------------------------------------------------------------------------
+
Switch chill_zone_screen_button_up
"Screen up"
{ channel="mqtt:topic:chill_zone_screen:up", autoupdate="false" }
@@ -49,3 +59,10 @@ Switch chill_zone_screen_button_stop
Switch chill_zone_screen_button_down
"Screen down"
{ channel="mqtt:topic:chill_zone_screen:down", autoupdate="false" }
+
+Rollershutter chill_projection_screen "Projection Screen"
+
+
+String IRCode_01 "IR Code" { channel="mqtt:topic:mosquitto:irremote:ir_code" }
+String proxyIR
+
diff --git a/persistence/mapdb.persist b/persistence/mapdb.persist
new file mode 100644
index 0000000..72b5227
--- /dev/null
+++ b/persistence/mapdb.persist
@@ -0,0 +1,7 @@
+Strategies {
+ default = everyChange
+}
+
+Items {
+ entrance_people_counter: strategy = everyChange
+}
diff --git a/rules/alllights.rules b/rules/alllights.rules
new file mode 100644
index 0000000..08c095d
--- /dev/null
+++ b/rules/alllights.rules
@@ -0,0 +1,23 @@
+rule "All Lights ON"
+when
+ Item all_lights changed from OFF to ON
+then
+ engineering_table_lamps.sendCommand("ON")
+ engineering_ceiling_lamps.sendCommand("ON")
+ //all_engineering_lights.postUpdate("ON")
+ chill_zone_lamps.sendCommand("ON")
+ entrance_ceiling_lamps.sendCommand("ON")
+end
+
+
+rule "All Lights OFF"
+when
+ Item all_lights changed from ON to OFF
+then
+ engineering_table_lamps.sendCommand("OFF")
+ engineering_ceiling_lamps.sendCommand("OFF")
+ chill_zone_lamps.sendCommand("OFF")
+ entrance_ceiling_lamps.sendCommand("OFF")
+end
+
+
diff --git a/rules/engineeringlights.rules b/rules/engineeringlights.rules
new file mode 100644
index 0000000..8564b6e
--- /dev/null
+++ b/rules/engineeringlights.rules
@@ -0,0 +1,18 @@
+rule "Engineering Lights ON"
+when
+ Item all_engineering_lights changed from OFF to ON
+then
+ engineering_table_lamps.sendCommand("ON")
+ engineering_ceiling_lamps.sendCommand("ON")
+end
+
+
+rule "Engineering Lights OFF"
+when
+ Item all_engineering_lights changed from ON to OFF
+then
+ engineering_table_lamps.sendCommand("OFF")
+ engineering_ceiling_lamps.sendCommand("OFF")
+end
+
+
diff --git a/rules/ir.rules b/rules/ir.rules
new file mode 100644
index 0000000..7562e4f
--- /dev/null
+++ b/rules/ir.rules
@@ -0,0 +1,6 @@
+rule "proxy IR mqtt"
+when
+ Item proxyIR received command
+then
+ IRCode_01.sendCommand(transform("MAP", "ir.map", receivedCommand.toString))
+end
\ No newline at end of file
diff --git a/rules/level2.rules b/rules/level2.rules
index 7305634..3d4613a 100644
--- a/rules/level2.rules
+++ b/rules/level2.rules
@@ -1,4 +1,6 @@
+var Timer ChromeCastOffTimer = null
+
rule "Door Status"
when
Item entrance_door_status changed
@@ -15,6 +17,7 @@ then
engineering_table_lamps.sendCommand("ON")
engineering_ceiling_lamps.sendCommand("ON")
engineering_status_lamp.sendCommand("ON")
+ area42_status_lamp.sendCommand("ON")
} else {
logInfo('door', 'closed')
// turn the beamer off
@@ -25,6 +28,8 @@ then
engineering_table_lamps.sendCommand("OFF")
engineering_ceiling_lamps.sendCommand("OFF")
engineering_status_lamp.sendCommand("OFF")
+ area42_status_lamp.sendCommand("OFF")
+ lab_soldering_table.sendCommand("OFF")
}
@@ -33,6 +38,31 @@ end
// ----------------------------------------------------------------------------
+rule "Poll People Counter"
+when
+ // sec min hour day month weekday year(opt)
+ Time cron "*/2 * * ? * *"
+then
+ val response = sendHttpGetRequest("http://10.2.113.8/output.cgi")
+ val count = java.lang.Integer.parseInt(
+ transform("XPATH", "/table/tr[4]/td[2]/text()", response).trim()
+ )
+ if ( count != Integer.parseInt(entrance_people_counter.previousState().state.toString)) {
+ entrance_people_counter.postUpdate(count)
+ }
+end
+
+// ----------------------------------------------------------------------------
+
+rule "Tweet People Count"
+when
+ Item entrance_people_counter changed
+then
+// sendTweet('There are currently ' + entrance_people_counter.state.toString + ' hackers present. Just pass by!')
+end
+
+// ----------------------------------------------------------------------------
+
rule "Phone Ringing"
when
Time cron "*/2 * * ? * *"
@@ -68,49 +98,47 @@ end
// ----------------------------------------------------------------------------
+
rule "Chromecast changed"
when
Item chill_zone_chromecast_status changed
then
- chill_zone_beamer.sendCommand("ON")
- chill_zone_screen_button_down.sendCommand("ON")
- val app = chill_zone_chromecast_status.state.toString
- if (app === null || app == UNDEF || app == 'UNDEF' || app == '' ) {
- // set input to DVI - hackerspace video
- sendHttpGetRequest("http://10.2.113.7/tgi/return.tgi?command=2a3109f6070566")
- logInfo('beamer', 'Switch to input DVI')
+ val l2state = entrance_door_status.state.toString
+ if (l2state == 'ON') {
+ // do nothing if Level2 is closed
+
} else {
+
+ val app = chill_zone_chromecast_status.state.toString
+ if (app === null || app == UNDEF || app == 'UNDEF' || app == '' || app == 'BackDrop' ) {
+ // set input to DVI - hackerspace video
+ logInfo('beamer', 'start 2min delay before switch input to DVI')
+// ChromeCastOffTimer.cancel() // stop any timer running
+ ChromeCastOffTimer=createTimer(now.plusSeconds(30)) [
+ app = chill_zone_chromecast_status.state.toString
+ if (app === null || app == UNDEF || app == 'UNDEF' || app == '' || app == 'BackDrop' ) {
+ sendHttpGetRequest("http://10.2.113.7/tgi/return.tgi?command=2a3109f6070566")
+ logInfo('beamer', 'Switch to input DVI (after 2min)')
+ } else {
+ logInfo('beamer', 'after 2min, chromecast again streaming. Not switching off.')
+ }
+ ]
+ } else {
+ if (ChromeCastOffTimer !== null) {
+ logInfo('chromecast', 'disabling off timer')
+ ChromeCastOffTimer.cancel() // stop any timer running
+ } else {
+ logInfo('chromecast', 'no off time running')
+ }
+ // only switch beamer on if chromecast is actually showing something
+ logInfo('chromecast', 'is streaming from '+app)
+ chill_zone_beamer.sendCommand("ON")
+ chill_zone_screen_button_down.sendCommand("ON")
// set input to HDMI2 - chromecast
sendHttpGetRequest("http://10.2.113.7/tgi/return.tgi?command=2a3109f6071576")
- logInfo('beamer', 'Switch to input HDMI2')
+ val state = chill_zone_beamer.state.toString
+ logInfo('beamer', 'Switch from {} to input HDMI2',state)
+ }
}
end
-// ----------------------------------------------------------------------------
-
-rule "Screen up"
-when
- Item chill_zone_screen_button_up received command ON
-then
- logInfo('screen', 'Screen up')
- Thread::sleep(2000)
- chill_zone_screen_button_up.sendCommand(OFF)
-end
-
-rule "Screen stop"
-when
- Item chill_zone_screen_button_stop received command ON
-then
- logInfo('screen', 'Screen stop')
- Thread::sleep(2000)
- chill_zone_screen_button_stop.sendCommand(OFF)
-end
-
-rule "Screen down"
-when
- Item chill_zone_screen_button_down received command ON
-then
- logInfo('screen', 'Screen down')
- Thread::sleep(2000)
- chill_zone_screen_button_down.sendCommand(OFF)
-end
\ No newline at end of file
diff --git a/rules/projectionscreen.rules b/rules/projectionscreen.rules
new file mode 100644
index 0000000..8ca9740
--- /dev/null
+++ b/rules/projectionscreen.rules
@@ -0,0 +1,62 @@
+// this basically implements a vitual device
+// first the 3 buttons
+rule "Screen up"
+when
+ Item chill_zone_screen_button_up received command ON
+then
+ logInfo('screen', 'Screen up')
+ Thread::sleep(1000)
+ chill_zone_screen_button_up.sendCommand(OFF)
+end
+
+rule "Screen stop"
+when
+ Item chill_zone_screen_button_stop received command ON
+then
+ logInfo('screen', 'Screen stop')
+ Thread::sleep(1000)
+ chill_zone_screen_button_stop.sendCommand(OFF)
+end
+
+rule "Screen down"
+when
+ Item chill_zone_screen_button_down received command ON
+then
+ logInfo('screen', 'Screen down')
+ Thread::sleep(1000)
+ chill_zone_screen_button_down.sendCommand(OFF)
+end
+
+// and here is the thing as a window blind
+rule "Chill Projection Screen"
+when
+ Item chill_projection_screen received command
+then
+ switch(receivedCommand.toString.toUpperCase){
+ case "UP": {
+ chill_zone_screen_button_up.sendCommand("ON")
+ }
+ case "STOP": {
+ chill_zone_screen_button_stop.sendCommand("ON")
+ }
+ case "DOWN": {
+ chill_zone_screen_button_down.sendCommand("ON")
+ }
+ }
+end
+
+ // val maxCount = 1
+ // if (count > maxCount) {
+ //logInfo("loggerName", "more than {}", maxCount)
+ // chill_zone_meaow.sendCommand("ON")
+
+
+ // while(chill_zone_meaow.state != OFF){
+ // Thread::sleep(500)
+ // }
+
+ // Thread::sleep(3500)
+
+ //playSound("doorbell.mp3")
+ // }
+
diff --git a/services/addons.cfg b/services/addons.cfg
index 5861a2a..cec9130 100644
--- a/services/addons.cfg
+++ b/services/addons.cfg
@@ -26,7 +26,7 @@
# Include legacy 1.x bindings. If set to true, it also allows the installation of 1.x bindings for which there is
# already a 2.x version available (requires remote repo access, see above). (default is false)
#
-#legacy = true
+legacy = true
# A comma-separated list of bindings to install (e.g. "binding = sonos,knx,zwave")
binding = chromecast,mqtt,http1,exec,systeminfo
@@ -35,10 +35,10 @@ binding = chromecast,mqtt,http1,exec,systeminfo
ui = basic,habmin,habpanel,paper
# A comma-separated list of persistence services to install (e.g. "persistence = rrd4j,jpa")
-#persistence = influxdb
+persistence = mapdb
# A comma-separated list of actions to install (e.g. "action = mail,pushover")
-action = mail
+action = mail,twitter,mqtt
# A comma-separated list of transformation services to install (e.g. "transformation = map,jsonpath")
transformation = jsonpath,map,regex,scale,xpath
diff --git a/services/runtime.cfg b/services/runtime.cfg
index 079ff7b..8d83fa8 100644
--- a/services/runtime.cfg
+++ b/services/runtime.cfg
@@ -16,7 +16,7 @@
# The persistence service to use if no other is specified.
#
-#org.eclipse.smarthome.persistence:default=
+org.eclipse.smarthome.persistence:default=mapdb
################### AUDIO #######################
diff --git a/sitemaps/default.sitemap b/sitemaps/default.sitemap
new file mode 100644
index 0000000..b00971a
--- /dev/null
+++ b/sitemaps/default.sitemap
@@ -0,0 +1,53 @@
+sitemap default label="Level2" {
+ Frame label="Lights" {
+ Switch item=chill_zone_lamps label="Chill Lights" icon="light"
+ Switch item=all_engineering_lights label="Engineering Lights" icon="light"
+ Switch item=all_lights label="All Lights" icon="light"
+ }
+ Frame label="Multimedia" {
+ Switch item=chill_zone_beamer label="Beamer" icon="projector"
+ // mir brauchen en screen rule mat 3 status dei een kann setzen
+ // Switch item=chill_zone_screen_button_up label="Projection Screen (todo)" icon="screen" mappings=[up="up",stop="stop",down="down"]
+ Switch item=chill_projection_screen icon="screen" mappings=[UP="up",STOP="stop",DOWN="down"]
+
+ Frame label="Amplifier" {
+ Switch item=proxyIR label="power" mappings=['amp_on'='on','amp_off'='off']
+ Switch item=proxyIR label="volume" mappings=['amp_volup'='up','amp_voldown'='down']
+ Selection item=proxyIR label="input" mappings=['amp_jack1'='jack1','amp_jack2'='jack2','amp_hdmi'='hdmi','amp_optical'='optical','amp_cd'='cd','amp_tuner'='tuner']
+ }
+ Frame label="Bluray" {
+ Switch item=proxyIR label="power" mappings=['br_power'='power']
+ Switch item=proxyIR label="play" mappings=['br_play'='play','br_pause'='pause'] icon="mediacontrol"
+ Switch item=proxyIR label="control" mappings=['br_menu'='menu','br_ok'='ok']
+ Switch item=proxyIR label="navigate" mappings=['br_left'='left','br_up'='up','br_down'='down','br_right'='right'] icon="movecontrol"
+ Switch item=proxyIR label="language" mappings=['br_language'='audio','br_subtitle'='subtitles']
+ }
+ }
+ Frame label="Other" {
+ // een knaeppchen deen nemmen aus geht
+ Switch item=lab_soldering_table label="Soldering Table" icon="poweroutlet" mappings=[OFF="off"]
+ Switch item=engineering_ceiling_phone_flash label="Phone flashlight" icon="siren" mappings=[OFF="off"]
+ // wei switchen ech dei 2 status lights?. Dat hei ass fir status un ze maachen falls se net un wiren
+ Switch item=area42_status_lamp label="Status lights (todo)" mappings=[ON="ON"]
+ }
+ Frame label="Main Floor" icon="firstfloor" {
+ Group item=engineering
+ // Group item=lab
+ Group item=chill_zone
+ Group item=entrance
+
+ // Selection item=chill_zone_beamer_input
+ // label="Beamer Input"
+ // mappings=[
+ // 0="DVI", // Hackerspace video
+ // 1="HDMI 1",
+ // 2="HDMI 2", // Chromecast
+ // 3="VGA 1",
+ // 4="VGA 2"
+ // ]
+ }
+ Frame label="Ground Floor" icon="groundfloor" {
+ Group item=ground_floor
+ // Image url="https://raw.githubusercontent.com/wiki/openhab/openhab/images/features.png"
+ }
+}
diff --git a/things/level2.things b/things/level2.things
index 21b0f31..b84d76d 100644
--- a/things/level2.things
+++ b/things/level2.things
@@ -76,7 +76,38 @@ Bridge mqtt:broker:mosquitto "Mosquitto" [
]
}
+ // ----------------------------------------------------------------------------
+
+ Thing topic area42_status_lamp "Area42 Status Lamp" @ "Area42" {
+ Channels:
+ Type switch : power "Power" [
+ commandTopic="cmnd/area42/status_lamp/Power"
+ ]
+ }
+
+ // ----------------------------------------------------------------------------
+
+ Thing topic lab_soldering_table "Soldering table" @ "Lab" {
+ Channels:
+ Type switch : power "Power" [
+ commandTopic="cmnd/lab/soldering_table/Power", stateTopic="stat/lab/soldering_table/Power"
+ ]
+ }
+
+ // ----------------------------------------------------------------------------ยง
+
+
+ Thing topic irremote "IR remote" @ "Chill Zone" {
+
+ Type string : ir_code "ircode"
+ [ commandTopic="cmnd/chill_zone/irremote/IRSEND"
+ ]
+
+ }
}
// See services/chromecast.cfg for the callback URL
Thing chromecast:chromecast:b000d809ccb35a409a3dd3d14e0fbf08 [ipAddress="10.2.113.120", port=8009]
+
+//Thing exec:command:meaow [command="espeak -s 250 'meow meow meow meow meow meow meow meow' && espeak -s 250 -p 99 'meow meow meow meow meow meow' && espeak -s 250 -p 10 'meow meow meow meow meow meow' && espeak -s 30 -p 1 'meow meow meow meow'", autorun=false]
+//Thing exec:command:meaow [command="espeak -s 250 'meow meow meow meow meow meow meow meow'", autorun=false]
\ No newline at end of file
diff --git a/transform/ir.map b/transform/ir.map
new file mode 100644
index 0000000..8dd982a
--- /dev/null
+++ b/transform/ir.map
@@ -0,0 +1,22 @@
+amp_off = {"Protocol":"NEC","Bits":32,"Data":"0xA55AD827"}
+amp_on = {"Protocol":"NEC","Bits":32,"Data":"0xA55A38C7"}
+amp_jack1 = {"Protocol":"NEC","Bits":32,"Data":"0xA55AF00F"}
+amp_jack2 = {"Protocol":"NEC","Bits":32,"Data":"0xA55A708F"}
+amp_hdmi = {"Protocol":"NEC","Bits":32,"Data":"0xA55AA15E"}
+amp_optical = {"Protocol":"NEC","Bits":32,"Data":"0xA55A8877"}
+amp_cd = {"Protocol":"NEC","Bits":32,"Data":"0xA55A32CD"}
+amp_tuner = {"Protocol":"NEC","Bits":32,"Data":"0xA55AE21D"}
+amp_volup = {"Protocol":"NEC","Bits":32,"Data":"0xA55A50AF"}
+amp_voldown = {"Protocol":"NEC","Bits":32,"Data":"0xA55AD02F"}
+
+br_power = {"Protocol":"SONY","Bits":20,"Data":"0xA8B47"}
+br_menu = {"Protocol":"SONY","Bits":20,"Data":"0x34B47"}
+br_up = {"Protocol":"SONY","Bits":20,"Data":"0x9CB47"}
+br_down = {"Protocol":"SONY","Bits":20,"Data":"0x5CB47"}
+br_left = {"Protocol":"SONY","Bits":20,"Data":"0xDCB47"}
+br_right = {"Protocol":"SONY","Bits":20,"Data":"0x3CB47"}
+br_ok = {"Protocol":"SONY","Bits":20,"Data":"0xBCB47"}
+br_pause = {"Protocol":"SONY","Bits":20,"Data":"0x98B47"}
+br_play = {"Protocol":"SONY","Bits":20,"Data":"0x58B47"}
+br_language = {"Protocol":"SONY","Bits":20,"Data":"0x26B47"}
+br_subtitle = {"Protocol":"SONY","Bits":20,"Data":"0xC6B47"}
\ No newline at end of file