Advertisement
Guest User

Untitled

a guest
Jul 15th, 2018
791
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 89.94 KB | None | 0 0
  1. {
  2. "dashboards": [
  3. {
  4. "id": "Media",
  5. "name": "Media",
  6. "widgets": [
  7. {
  8. "name": "New Widget",
  9. "sizeX": 3,
  10. "sizeY": 3,
  11. "type": "template",
  12. "customwidget": "direction-buttons",
  13. "row": 3,
  14. "col": 0,
  15. "config": {
  16. "center_button": "SmartTV_KeyCode",
  17. "direction_button": "SmartTV_KeyCode",
  18. "center_label": "Enter",
  19. "center_command": "KEY_ENTER",
  20. "up_command": "KEY_UP",
  21. "down_command": "KEY_DOWN",
  22. "left_command": "KEY_LEFT",
  23. "right_command": "KEY_RIGHT",
  24. "btn_color": "#FFFFFF"
  25. }
  26. },
  27. {
  28. "name": "Source",
  29. "sizeX": 2,
  30. "sizeY": 3,
  31. "item": "SmartTV_SourceName",
  32. "type": "selection",
  33. "row": 3,
  34. "col": 3,
  35. "font_size": 30,
  36. "iconset": "eclipse-smarthome-classic",
  37. "icon": "video",
  38. "icon_size": 32,
  39. "choices_columns": 3,
  40. "choices_source": "csv",
  41. "choices": "HDMI1/DVI=HDMI1,HDMI2=HDMI2,HDMI3=HDMI3,HDMI-CEC=HDMI-CEC",
  42. "keep_open": true
  43. },
  44. {
  45. "name": "Television Power",
  46. "sizeX": 1,
  47. "sizeY": 2,
  48. "item": "SmartTV_Power",
  49. "type": "switch",
  50. "row": 1,
  51. "col": 0
  52. },
  53. {
  54. "name": "Television",
  55. "sizeX": 9,
  56. "sizeY": 1,
  57. "item": null,
  58. "type": "label",
  59. "row": 0,
  60. "col": 0,
  61. "font_size": "50"
  62. },
  63. {
  64. "name": "Mute",
  65. "sizeX": 1,
  66. "sizeY": 1,
  67. "item": "SmartTV_Mute",
  68. "type": "switch",
  69. "row": 1,
  70. "col": 1,
  71. "iconset": "eclipse-smarthome-classic",
  72. "icon": "soundvolume_mute",
  73. "icon_size": 32
  74. },
  75. {
  76. "name": "Volume",
  77. "sizeX": 2,
  78. "sizeY": 2,
  79. "item": "SmartTV_Volume",
  80. "type": "knob",
  81. "row": 1,
  82. "col": 3,
  83. "floor": 0,
  84. "ceil": 100,
  85. "step": 1,
  86. "skinType": "tron",
  87. "ranges": [],
  88. "startAngle": null,
  89. "endAngle": null,
  90. "rangesEnabled": false,
  91. "rangesTextColorMatching": false,
  92. "scaleEnabled": true
  93. },
  94. {
  95. "name": "Eject",
  96. "sizeX": 1,
  97. "sizeY": 1,
  98. "item": "BluRayDiscPlayer_Primary_IRCCCommand",
  99. "type": "button",
  100. "row": 5,
  101. "col": 7,
  102. "command": "Eject",
  103. "iconset": "custom-icon",
  104. "icon": "eject",
  105. "icon_size": "32"
  106. },
  107. {
  108. "name": "New Widget",
  109. "sizeX": 4,
  110. "sizeY": 3,
  111. "type": "template",
  112. "customwidget": "MusicControl",
  113. "row": 1,
  114. "col": 5,
  115. "config": {
  116. "action_item": "SmartTV_KeyCode",
  117. "status_item": "SmartTV_KeyCode",
  118. "volume": "SmartTV_Volume",
  119. "next_command": "KEY_FF",
  120. "prev_command": "KEY_REWIND",
  121. "step": 1,
  122. "my_name": "Television"
  123. }
  124. },
  125. {
  126. "name": "Subtitle",
  127. "sizeX": 1,
  128. "sizeY": 1,
  129. "item": "BluRayDiscPlayer_Primary_IRCCCommand",
  130. "type": "button",
  131. "row": 5,
  132. "col": 8,
  133. "command": "Subtitle",
  134. "iconset": "custom-icon",
  135. "icon": "cc",
  136. "icon_size": 32
  137. },
  138. {
  139. "name": "Blu Ray",
  140. "sizeX": 2,
  141. "sizeY": 1,
  142. "item": "BluRayDiscPlayer_Primary_Power",
  143. "type": "switch",
  144. "row": 5,
  145. "col": 5
  146. },
  147. {
  148. "name": "Blu-Ray",
  149. "sizeX": 4,
  150. "sizeY": 1,
  151. "item": null,
  152. "type": "label",
  153. "row": 4,
  154. "col": 5,
  155. "font_size": "40"
  156. },
  157. {
  158. "name": "Exit",
  159. "sizeX": 1,
  160. "sizeY": 1,
  161. "item": "SmartTV_KeyCode",
  162. "type": "button",
  163. "command": "KEY_EXIT",
  164. "iconset": "custom-icon",
  165. "icon": "exit",
  166. "icon_size": "32",
  167. "row": 2,
  168. "col": 1
  169. },
  170. {
  171. "name": "Smarthub",
  172. "sizeX": 1,
  173. "sizeY": 1,
  174. "item": "SmartTV_KeyCode",
  175. "type": "button",
  176. "command": "KEY_W_LINK",
  177. "iconset": "custom-icon",
  178. "icon": "smarthub",
  179. "icon_size": "32",
  180. "row": 2,
  181. "col": 2
  182. },
  183. {
  184. "name": "Menu",
  185. "sizeX": 1,
  186. "sizeY": 1,
  187. "item": "SmartTV_KeyCode",
  188. "type": "button",
  189. "command": "KEY_MENU",
  190. "iconset": "custom-icon",
  191. "icon": "menu",
  192. "icon_size": "32",
  193. "row": 1,
  194. "col": 2
  195. },
  196. {
  197. "name": "New Widget",
  198. "sizeX": 3,
  199. "sizeY": 6,
  200. "type": "template",
  201. "customwidget": "Chromecast",
  202. "row": 0,
  203. "col": 9,
  204. "config": {
  205. "widget_name": "Chromecast",
  206. "font": "24px",
  207. "default_image": "/static/openhab-logo-square.png",
  208. "backdrop_image": "/static/openhab-logo-square.png",
  209. "title": "LivingRoomHOMeSg11_Title",
  210. "seriesTitle": "LivingRoomHOMeSg11_SeriesTitle",
  211. "image_url": "LivingRoomHOMeSg11_ImageURL",
  212. "current_time": "LivingRoomHOMeSg11_CurrentTime",
  213. "duration": "LivingRoomHOMeSg11_Duration",
  214. "control": "LivingRoomHOMeSg11_Control",
  215. "playURI": "LivingRoomHOMeSg11_PlayURI",
  216. "volume": "LivingRoomHOMeSg11_Volume"
  217. }
  218. }
  219. ],
  220. "row": 0,
  221. "col": 0,
  222. "tile": {},
  223. "widget_margin": null,
  224. "mobile_mode_enabled": false,
  225. "$$hashKey": "object:19"
  226. },
  227. {
  228. "id": "Climate Control",
  229. "name": "Climate Control",
  230. "widgets": [
  231. {
  232. "name": "Living Room Temperature",
  233. "sizeX": 2,
  234. "sizeY": 2,
  235. "item": "LRTemperature",
  236. "type": "dummy",
  237. "row": 0,
  238. "col": 0,
  239. "font_size": "32",
  240. "unit": "",
  241. "iconset": "eclipse-smarthome-classic",
  242. "icon": "temperature",
  243. "icon_size": 32,
  244. "useserverformat": true
  245. },
  246. {
  247. "name": "Living Room Temperature",
  248. "sizeX": 2,
  249. "sizeY": 2,
  250. "item": "LRHumidity",
  251. "type": "dummy",
  252. "font_size": "32",
  253. "unit": "",
  254. "iconset": "eclipse-smarthome-classic",
  255. "icon": "humidity",
  256. "icon_size": 32,
  257. "row": 0,
  258. "col": 2,
  259. "useserverformat": true
  260. },
  261. {
  262. "name": "Living Room Temperature",
  263. "sizeX": 4,
  264. "sizeY": 2,
  265. "item": "LRHumidity",
  266. "type": "chart",
  267. "row": 4,
  268. "col": 0,
  269. "charttype": "interactive",
  270. "service": "influxdb",
  271. "period": "D",
  272. "axis": {
  273. "y": {
  274. "min": 1,
  275. "max": 100,
  276. "ticks": 5
  277. }
  278. },
  279. "series": [
  280. {
  281. "axis": "y",
  282. "display_line": true,
  283. "display_area": true,
  284. "item": "LRTemperature",
  285. "name": "Living Room Temperature",
  286. "color": "#FF0000"
  287. }
  288. ],
  289. "liveUpdates": {}
  290. },
  291. {
  292. "name": "Living Room Humidity",
  293. "sizeX": 4,
  294. "sizeY": 2,
  295. "item": "LRHumidity",
  296. "type": "chart",
  297. "charttype": "interactive",
  298. "service": "influxdb",
  299. "period": "D",
  300. "axis": {
  301. "y": {
  302. "min": 1,
  303. "max": 100,
  304. "ticks": 5
  305. }
  306. },
  307. "series": [
  308. {
  309. "axis": "y",
  310. "display_line": true,
  311. "display_area": true,
  312. "item": "LRHumidity",
  313. "name": "Living Room Humidity",
  314. "color": "#33CCFF"
  315. }
  316. ],
  317. "liveUpdates": {},
  318. "row": 2,
  319. "col": 0
  320. },
  321. {
  322. "name": "Cool",
  323. "sizeX": 2,
  324. "sizeY": 1,
  325. "item": "ACMode",
  326. "type": "button",
  327. "row": 1,
  328. "col": 6,
  329. "command": "COOL",
  330. "background_active": "#3399FF"
  331. },
  332. {
  333. "name": "Air Conditoner",
  334. "sizeX": 2,
  335. "sizeY": 1,
  336. "item": "ACPower",
  337. "type": "switch",
  338. "row": 1,
  339. "col": 4,
  340. "iconset": "custom-icon",
  341. "icon": "ac",
  342. "icon_size": "45"
  343. },
  344. {
  345. "name": "Fan",
  346. "sizeX": 2,
  347. "sizeY": 1,
  348. "item": "ACMode",
  349. "type": "button",
  350. "command": "FAN",
  351. "background_active": "#FF9900",
  352. "row": 2,
  353. "col": 6
  354. },
  355. {
  356. "name": "Sleep",
  357. "sizeX": 2,
  358. "sizeY": 1,
  359. "item": "ACSleep",
  360. "type": "switch",
  361. "row": 2,
  362. "col": 4,
  363. "iconset": "eclipse-smarthome-classic",
  364. "icon": "moon",
  365. "icon_size": 32
  366. },
  367. {
  368. "name": "Speed",
  369. "sizeX": 2,
  370. "sizeY": 2,
  371. "item": "ACSpeed",
  372. "type": "knob",
  373. "row": 3,
  374. "col": 4,
  375. "floor": 1,
  376. "ceil": 3,
  377. "step": 1,
  378. "ranges": [],
  379. "subTextEnabled": true,
  380. "startAngle": null,
  381. "endAngle": null
  382. },
  383. {
  384. "name": "Temperature",
  385. "sizeX": 2,
  386. "sizeY": 2,
  387. "item": "ACTemp",
  388. "type": "knob",
  389. "row": 3,
  390. "col": 6,
  391. "floor": 60,
  392. "ceil": 85,
  393. "step": 1,
  394. "unit": "˚F",
  395. "ranges": [],
  396. "subTextEnabled": true,
  397. "barWidth": null,
  398. "trackWidth": null,
  399. "scaleEnabled": false,
  400. "scaleType": "lines",
  401. "skinType": "simple"
  402. },
  403. {
  404. "name": "Air Conditoner",
  405. "sizeX": 4,
  406. "sizeY": 1,
  407. "item": null,
  408. "type": "label",
  409. "row": 0,
  410. "col": 4,
  411. "font_size": "25"
  412. }
  413. ],
  414. "row": 1,
  415. "col": 0,
  416. "tile": {},
  417. "drawer": {
  418. "use_custom_widget": true,
  419. "custom_widget": "side widget",
  420. "custom_widget_config": {}
  421. },
  422. "mobile_mode_enabled": true,
  423. "mobile_breakpoint": 1024,
  424. "$$hashKey": "object:20"
  425. },
  426. {
  427. "id": "Lighting",
  428. "name": "Lighting",
  429. "widgets": [
  430. {
  431. "name": "Television Lamp",
  432. "sizeX": 2,
  433. "sizeY": 2,
  434. "item": "TVLAMP",
  435. "type": "switch",
  436. "row": 0,
  437. "col": 0,
  438. "iconset": "custom-icon",
  439. "icon": "wemo.svg",
  440. "icon_size": "128"
  441. },
  442. {
  443. "name": "Desk Lamp",
  444. "sizeX": 2,
  445. "sizeY": 2,
  446. "item": "DeskLamp_Switch",
  447. "type": "switch",
  448. "iconset": "custom-icon",
  449. "icon": "wemo.svg",
  450. "icon_size": "128",
  451. "row": 2,
  452. "col": 0
  453. },
  454. {
  455. "name": "New Widget",
  456. "sizeX": 4,
  457. "sizeY": 4,
  458. "type": "template",
  459. "customwidget": "color-light",
  460. "row": 0,
  461. "col": 2,
  462. "config": {
  463. "name": "LIFX",
  464. "brightness": "LIFXColorLight_Color",
  465. "color": "LIFXColorLight_Color",
  466. "colortemp_item": "LIFXColorLight_Temperature",
  467. "colortemp_show": true
  468. }
  469. }
  470. ],
  471. "row": 2,
  472. "col": 0,
  473. "$$hashKey": "object:21"
  474. },
  475. {
  476. "id": "Security",
  477. "name": "Security",
  478. "widgets": [
  479. {
  480. "name": "Motion",
  481. "sizeX": 4,
  482. "sizeY": 4,
  483. "item": "Motion",
  484. "type": "dummy",
  485. "row": 0,
  486. "col": 0
  487. },
  488. {
  489. "name": "",
  490. "sizeX": 8,
  491. "sizeY": 1,
  492. "item": null,
  493. "type": "timeline",
  494. "row": 3,
  495. "col": 4,
  496. "service": "influxdb",
  497. "period": "3D",
  498. "colorMaps": [
  499. {
  500. "state": "OPEN",
  501. "color": "#FF0000"
  502. },
  503. {
  504. "state": "CLOSED",
  505. "color": "#66FF66"
  506. }
  507. ],
  508. "series": [
  509. {
  510. "item": "Motion",
  511. "name": "Motion"
  512. }
  513. ]
  514. },
  515. {
  516. "name": "New Widget",
  517. "sizeX": 5,
  518. "sizeY": 3,
  519. "item": null,
  520. "type": "template",
  521. "row": 0,
  522. "col": 4,
  523. "template": "<div style=\"height: 610px\">\n <div uib-carousel active=\"0\" no-wrap=\"false\">\n <div uib-slide index=\"0\">\n <img src=\"//192.168.20.94/html/cam_pic_new.php?time=1521661009278&pDelay=40000\" style=\"margin:auto;\"/>\n </div>\n <div uib-slide index=\"1\">\n <img src=\"//192.168.20.94:8081\" style=\"margin:auto;\"/>\n </div>\n </div>\n</div>"
  524. }
  525. ],
  526. "row": 3,
  527. "col": 0,
  528. "$$hashKey": "object:22"
  529. },
  530. {
  531. "id": "Home",
  532. "name": "Home",
  533. "widgets": [],
  534. "row": 4,
  535. "col": 0,
  536. "tile": {},
  537. "$$hashKey": "object:23"
  538. },
  539. {
  540. "id": "Power",
  541. "name": "Power",
  542. "widgets": [
  543. {
  544. "name": "Washing Machine",
  545. "sizeX": 4,
  546. "sizeY": 1,
  547. "item": "WashingMachineUse",
  548. "type": "dummy",
  549. "row": 0,
  550. "col": 0,
  551. "font_size": ""
  552. },
  553. {
  554. "name": "New Widget",
  555. "sizeX": 4,
  556. "sizeY": 3,
  557. "item": null,
  558. "type": "chart",
  559. "row": 1,
  560. "col": 0,
  561. "charttype": "interactive",
  562. "service": "influxdb",
  563. "period": "8h",
  564. "axis": {
  565. "y": {}
  566. },
  567. "series": [
  568. {
  569. "axis": "y",
  570. "display_line": true,
  571. "display_area": true,
  572. "item": "WashingMachine_Power"
  573. }
  574. ],
  575. "liveUpdates": {}
  576. },
  577. {
  578. "name": "New Widget",
  579. "sizeX": 4,
  580. "sizeY": 4,
  581. "item": "TotalPowerDay",
  582. "type": "dummy",
  583. "row": 0,
  584. "col": 4
  585. }
  586. ],
  587. "row": 5,
  588. "col": 0,
  589. "$$hashKey": "object:24"
  590. }
  591. ],
  592. "menucolumns": 1,
  593. "settings": {
  594. "theme": "translucent",
  595. "additional_stylesheet_url": "/static/progress.css",
  596. "show_header_clock": true,
  597. "header_clock_format": "EEEE, MMMM d h:mm:ss a",
  598. "speech_synthesis_item": "HABpanelvoice",
  599. "floating_speech": false,
  600. "hide_drawer_footer": false,
  601. "background_image": "/static/bg.jpg",
  602. "speech_synthesis_voice": "Alex"
  603. },
  604. "customwidgets": {
  605. "color-light": {
  606. "name": "Color Light",
  607. "author": "Kuba Wolanin",
  608. "description": "Combined color, brightness and switch widgets.",
  609. "template": "<div ng-init='picker = {\n \"name\": config.name,\n \"item\": config.color,\n \"style\": \"aCKolor\"\n};slider = {\n \"name\": \"\",\n \"item\": config.brightness,\n \"floor\": 0,\n \"ceil\": 100,\n \"step\": 1,\n \"unit\": \"\",\n \"vertical\": false\n};slider2 = {\n \"name\": \"\",\n \"item\": config.colortemp_item,\n \"floor\": 0,\n \"ceil\": 100,\n \"step\": 1,\n \"unit\": \"\",\n \"vertical\": false\n};switch = {\n \"name\": \"\",\n \"item\": config.brightness,\n \"hidelabel\": true,\n \"hideicon\": false,\n \"hideonoff\": true\n}'>\n <style>\n .cl-switch .switch {\n position: absolute;\n top: 0;\n width: 100%;\n\t\t}\n </style>\n <widget-colorpicker ng-model=\"picker\"></widget-colorpicker>\n <widget-slider ng-model=\"slider\"></widget-slider>\n \t<div ng-show=\"config.colortemp_show\"><widget-slider ng-model=\"slider2\"></widget-slider></div>\n</div>",
  610. "settings": [
  611. {
  612. "type": "string",
  613. "id": "name",
  614. "label": "Name",
  615. "default": "Color Light",
  616. "description": "Title of the widget"
  617. },
  618. {
  619. "type": "item",
  620. "id": "brightness",
  621. "label": "Brightness Item",
  622. "description": "Dimmer item for light brightness"
  623. },
  624. {
  625. "type": "item",
  626. "id": "color",
  627. "label": "Color Item",
  628. "description": "Color item"
  629. },
  630. {
  631. "type": "checkbox",
  632. "id": "colortemp_show",
  633. "label": "Show color temperature slider",
  634. "description": "Show color temperature slider",
  635. "default": false
  636. },
  637. {
  638. "type": "item",
  639. "id": "colortemp_item",
  640. "label": "Color temperature item",
  641. "description": "Color temperature item"
  642. }
  643. ],
  644. "source_url": "https://raw.githubusercontent.com/kubawolanin/habpanel-widgets/master/color-light.widget.json",
  645. "readme_url": "https://github.com/kubawolanin/habpanel-widgets"
  646. },
  647. "dashboard-link": {
  648. "name": "Dashboard Link",
  649. "author": "Kuba Wolanin",
  650. "description": "Clicking on widgets surface will move you to a given dashboard",
  651. "settings": [
  652. {
  653. "type": "string",
  654. "id": "dashboard_name",
  655. "label": "Dashboard name"
  656. },
  657. {
  658. "type": "item",
  659. "id": "habpanel_item",
  660. "label": "HABPanel Item"
  661. },
  662. {
  663. "type": "string",
  664. "id": "font_size",
  665. "label": "Font size"
  666. },
  667. {
  668. "type": "string",
  669. "id": "label",
  670. "label": "Label"
  671. }
  672. ],
  673. "template": "<style>\n .dashboard-link {\n background: transparent;\n border: 0;\n width: 100%;\n padding: 25px 0;\n font-size: {{config.font_size}};\n outline: none;\n}\n</style>\n<button class=\"dashboard-link\" \n ng-click=\"sendCmd(config.habpanel_item, config.dashboard_name)\">\n {{config.label}}\n</button>",
  674. "source_url": "https://raw.githubusercontent.com/kubawolanin/habpanel-widgets/master/dashboard-link.widget.json",
  675. "readme_url": "https://github.com/kubawolanin/habpanel-widgets"
  676. },
  677. "direction-buttons": {
  678. "template": "<style>\nnav.directions {\n --bg-color: transparent;\n --btn-color: {{config.btn_color || '#fff'}};\n --btn-active: #ccc;\n --text-color: #222;\n --size: {{ (ngModel.sizeY > ngModel.sizeX) ? (ngModel.sizeX * 65) : (ngModel.sizeY * 65) }}px\n}\n\nnav.directions {\n width: var(--size);\n height: var(--size);\n background: var(--bg-color);\n border-radius: 50%;\n padding: 20px;\n -webkit-transform: rotate(45deg);\n -moz-transform: rotate(45deg);\n transform: rotate(45deg);\n box-shadow: inset 12px 0 12px -6px var(--btn-color), inset 0 0 0 12px var(--btn-color);\n box-sizing: border-box;\n position: relative;\n margin: 10px auto;\n}\n\nnav.directions button {\n background: var(--btn-color);\n color: var(--text-color);\n text-decoration: none;\n outline: none;\n display: block;\n border: none;\n -webkit-transition: .1s background, .2s box-shadow;\n}\n \nnav.directions button:active {\n background: var(--btn-active);\n box-shadow: inset 2px 4px rgba(0, 0, 0, 0.2);\n}\n\nnav.directions .center-button { \n height: 38%;\n width: 38%;\n position: absolute;\n top: 31%;\n left: 31%;\n border-radius: 50%;\n -webkit-transform: rotate(-45deg);\n -moz-transform: rotate(-45deg);\n transform: rotate(-45deg);\n font-size: 1.250em;\n font-weight: 500;\n text-transform: uppercase;\n box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .33), inset -2px -4px rgba(0, 0, 0, 0.2);\n}\n\nnav.directions .center-button:active {\n box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .33), inset 2px 4px rgba(0, 0, 0, 0.2);\n}\n\nnav.directions .button {\n width: 46%;\n height: 46%;\n margin: 2%;\n position: relative;\n float: left;\n}\n\nnav.directions .button::after {\n content: \"\";\n width: 0;\n position: absolute;\n border-radius: initial;\n}\n\nnav.directions button.top {\n border-radius: 100% 0 0 0;\n}\n\nnav.directions button.top::after {\n bottom: 0;\n right: 0;\n}\n\nnav.directions button.right {\n border-radius: 0 100% 0 0;\n}\n\nnav.directions button.right::after {\n bottom: 0;\n left: 0;\n}\n\nnav.directions button.left {\n border-radius: 0 0 0 100%;\n}\n\nnav.directions button.left::after {\n top: 0;\n right: 0;\n}\n\nnav.directions button.bottom {\n border-radius: 0 0 100% 0;\n}\n\nnav.directions button.bottom::after {\n top: 0;\n left: 0;\n box-shadow: inset -2px -3px 2px -2px rgba(0, 0, 0, 0.4), -10px -10px 0 10px var(--bg-color);\n}\n\nnav.directions i {\n -webkit-transform: rotate(-45deg);\n -moz-transform: rotate(-45deg);\n transform: rotate(-45deg);\n position: absolute;\n font-size: calc(var(--size)/10);\n top: 36%;\n left: 39%;\n text-shadow: 1px 1px 4px var(--btn-color), 0px 0px 0px rgba(0, 0, 0, 0.5);\n color: rgba(0, 0, 0, 0.15);\n}\n\nnav.directions .button:active i {\n color: var(--text-color);\n text-shadow: none;\n}\n\nnav.directions .top i {\n top: 35%;\n left: 41%;\n}\n\nnav.directions .left i {\n top: 41%;\n left: 35%;\n}\n\nnav.directions .right i {\n top: 35%;\n left: 41%;\n}\n\nnav.directions .bottom i {\n top: 39%;\n left: 42%;\n}\n</style>\n<nav class=\"directions\">\n <button class=\"button top\" ng-click=\"sendCmd(config.direction_button, config.up_command)\"><i class=\"glyphicon glyphicon-chevron-up\"></i></button>\n <button class=\"button right\" ng-click=\"sendCmd(config.direction_button, config.right_command)\"><i class=\"glyphicon glyphicon-chevron-right\"></i></button>\n <button class=\"button left\" ng-click=\"sendCmd(config.direction_button, config.left_command)\"><i class=\"glyphicon glyphicon-chevron-left\"></i></button>\n <button class=\"button bottom\" ng-click=\"sendCmd(config.direction_button, config.down_command)\"><i class=\"glyphicon glyphicon-chevron-down\"></i></button>\n <button class=\"center-button\" ng-click=\"sendCmd(config.center_button, config.center_command)\">{{config.center_label}}</button>\n</nav>\n ",
  679. "settings": [
  680. {
  681. "type": "item",
  682. "id": "center_button",
  683. "label": "Center button"
  684. },
  685. {
  686. "type": "string",
  687. "id": "center_label",
  688. "label": "Center button label"
  689. },
  690. {
  691. "type": "string",
  692. "id": "center_command",
  693. "label": "Center command"
  694. },
  695. {
  696. "type": "item",
  697. "id": "direction_button",
  698. "label": "Directions"
  699. },
  700. {
  701. "type": "string",
  702. "id": "up_command",
  703. "label": "Up command"
  704. },
  705. {
  706. "type": "string",
  707. "id": "down_command",
  708. "label": "Down command"
  709. },
  710. {
  711. "type": "string",
  712. "id": "left_command",
  713. "label": "Left command"
  714. },
  715. {
  716. "type": "string",
  717. "id": "right_command",
  718. "label": "Right command"
  719. },
  720. {
  721. "type": "color",
  722. "id": "btn_color",
  723. "label": "Button color"
  724. }
  725. ],
  726. "name": "Direction buttons",
  727. "author": "Kuba Wolanin",
  728. "description": "Simple remote control-like direction buttons",
  729. "source_url": "https://raw.githubusercontent.com/kubawolanin/habpanel-widgets/master/direction-buttons.widget.json",
  730. "readme_url": "https://github.com/kubawolanin/habpanel-widgets"
  731. },
  732. "progress-3d": {
  733. "name": "Progress bar 3D",
  734. "author": "Kuba Wolanin",
  735. "description": "Based on Codrops Shaded Progress Bar",
  736. "template": "<!--\nNote:\nYou need to place `progress.css` file from\nhttps://github.com/kubawolanin/habpanel-widgets\nto your <openhab-config>/html/ folder and\npoint to http://youropenhab:8080/static/progress.css\nin HABPanel settings to make it work.\n-->\n\n<h4 style=\"margin: 0\">{{ngModel.name}}</h4>\n\n<div class=\"progress-factor flexy-item\">\n <div class=\"progress-bar\">\n <div class=\"bar has-rotation has-colors red {{config.type}}-gradient\" role=\"progressbar\" aria-valuenow=\"{{itemValue(config.item)}}\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n <div class=\"ps-tooltip white\"></div>\n <div class=\"bar-face face-position roof percentage\"></div>\n <div class=\"bar-face face-position back percentage\"></div>\n <div class=\"bar-face face-position floor percentage volume-lights\"></div>\n <div class=\"bar-face face-position left\"></div>\n <div class=\"bar-face face-position right\"></div>\n <div class=\"bar-face face-position front percentage volume-lights shine\"></div>\n </div>\n </div>\n</div>",
  737. "settings": [
  738. {
  739. "type": "item",
  740. "id": "item",
  741. "label": "Number Item",
  742. "description": "Number item"
  743. },
  744. {
  745. "type": "choice",
  746. "id": "type",
  747. "label": "Bar type",
  748. "default": "heat",
  749. "choices": "default,heat"
  750. }
  751. ],
  752. "source_url": "https://raw.githubusercontent.com/kubawolanin/habpanel-widgets/master/progress-3d.widget.json",
  753. "readme_url": "https://github.com/kubawolanin/habpanel-widgets"
  754. },
  755. "weather-underground": {
  756. "template": "<!-- Download: https://github.com/manifestinteractive/weather-underground-icons -->\n<!-- And place icons somewhere in your /conf/html folder structure -->\n<div ng-init=\"ServerPath='/static/weather-underground-icons/dist'; IconSet='white'\">\n</div>\n\n<link rel=\"stylesheet\" type=\"text/css\" href=\"{{ServerPath}}/dist/wu-icons-style.min.css\">\n \n<style>\n@media (min-width: 992px) {\n .col-md-border:not(:last-child) {\n\t\t\tborder-right: 1px solid #d7d7d7;\n }\n .col-md-border + .col-md-border {\n\t\t\tborder-left: 1px solid #d7d7d7;\n\t\t\tmargin-left: -1px;\n }\n \t.day:first-letter {\n \ttext-transform: uppercase;\n\t\t}\n \t.current-icon {\n\t\t\twidth: 14em !important;\n \t\theight: 14em !important;\n \t\tmargin-top: -1em;\n\t\t}\n \t.condition {\n \t\theight: 2em;\n \t\t}\n}\n</style>\n\n<div id=\"container\">\n <div class=\"row\">\n \t<div class=\"col-md-9\">\n <i class=\"wu wu-{{IconSet}} wu-256 wu-{{itemValue('Weather_ConditionId')}} current-icon pull-right\"></i>\n <h2 class=\"text-left\">{{itemValue('Weather_Condition0')}}</h2>\n </div>\n <div class=\"col-md-3 text-right\">\n <h2 style=\"margin-bottom:1em;\">{{'%.1f' | sprintf:itemValue('Weather_Temperature')}} °C</h2>\n <h5><img style=\"height:16px;\" src=\"{{ServerPath}}/images/humidity.png\"/> {{itemValue('Weather_Humidity')}} %</h5>\n <h5><img style=\"height:16px;\" src=\"{{ServerPath}}/images/wind.png\"/> {{itemValue('Weather_Wind_Speed')}} km/h</h5>\n <h5><img style=\"height:16px;\" src=\"{{ServerPath}}/images/feel.png\"/> {{itemValue('Weather_Temperature_Feel')}} °C</h5>\n <h5>{{itemValue('Weather_ObservationTime') | date: 'H:MM'}}</h5>\n \t</div>\n </div>\n\t<div class=\"row\" style=\"margin-top: 1em;\">\n\t\t<div class=\"col-md-3 col-md-border\">\n <h4 class=\"day\">Vandaag</h4>\n <i class=\"wu wu-{{IconSet}} wu-64 wu-{{itemValue('Weather_ConditionId0')}}\"></i>\n <h5 class=\"condition\">{{itemValue('Weather_Condition0')}}</h5>\n <h4><b>{{'%.0f' | sprintf:itemValue('Weather_Temp_Max0')}}</b> / {{'%.0f' | sprintf:itemValue('Weather_Temp_Min0')}} °C</h4>\n </div>\n <div class=\"col-md-3 col-md-border\">\n <h4 class=\"day\">{{itemValue('Weather_Forecast_Time1') | date:'EEEE'}}</h4>\n <i class=\"wu wu-{{IconSet}} wu-64 wu-{{itemValue('Weather_ConditionId1')| lowercase }}\"></i>\n <h5 class=\"condition\">{{itemValue('Weather_Condition1')}}</h5>\n\t\t\t<h4><b>{{'%.0f' | sprintf:itemValue('Weather_Temp_Max1')}}</b> / {{'%.0f' | sprintf:itemValue('Weather_Temp_Min1')}} °C</h4>\n </div>\n <div class=\"col-md-3 col-md-border\">\n <h4 class=\"day\">{{itemValue('Weather_Forecast_Time2') | date:'EEEE'}}</h4>\n <i class=\"wu wu-{{IconSet}} wu-64 wu-{{itemValue('Weather_ConditionId2')| lowercase }}\"></i>\n <h5 class=\"condition\">{{itemValue('Weather_Condition2')}}</h5>\n <h4><b>{{'%.0f' | sprintf:itemValue('Weather_Temp_Max2')}}</b> / {{'%.0f' | sprintf:itemValue('Weather_Temp_Min2')}} °C</h4>\n </div>\n <div class=\"col-md-3 col-md-border\">\n <h4 class=\"day\">{{itemValue('Weather_Forecast_Time3') | date:'EEEE'}}</h4>\n <i class=\"wu wu-{{IconSet}} wu-64 wu-{{itemValue('Weather_ConditionId3')| lowercase }}\"></i>\n <h5 class=\"condition\">{{itemValue('Weather_Condition3')}}</h5>\n <h4><b>{{'%.0f' | sprintf:itemValue('Weather_Temp_Max3')}}</b> / {{'%.0f' | sprintf:itemValue('Weather_Temp_Min3')}} °C</h4>\n </div>\n\t</div>\n</div>\n",
  757. "name": "Weather Underground",
  758. "author": "Bastiaan van Haastrecht",
  759. "description": "Local Weather, use with Weather Underground binding OH2-SNAPSHOT 2.3.0 from build 1212 - https://github.com/BasvanH",
  760. "source_url": "https://raw.githubusercontent.com/BasvanH/habpanel-widget-weatherunderground/master/weather-underground.widget.json",
  761. "readme_url": "https://github.com/BasvanH/habpanel-widget-weatherunderground"
  762. },
  763. "MusicControl": {
  764. "template": "<style>\n.btn-pad{\n padding:20px 32px;\n }\n .btn-radius{\n padding:40px 40px;\n border-radius: 50%;!important\n background-color: #d23f31;\n height: 56px;\n width: 56px;\n box-shadow: 0 0 4px rgba(0,0,0,.14), 0 4px 8px rgba(0,0,0,.28);\n box-sizing: content-box;\n margin-left:-13px;\n position: relative;\n z-index:1000;\n cursor:pointer;\n }\n .btn-red{\n background-color:red;\n }\n .glyphicon-text{\n \tfont-size:xx-large;\n \tpadding: 10px 0 0 5px;\n }\n .btn-lf{\n position: relative;\n top: -6px;\n background-color:#fff;\n box-shadow: 0 0 4px rgba(0,0,0,.14), 0 4px 8px rgba(0,0,0,.28);\n color:#000;\n border-top-left-radius:50%;\n border-bottom-left-radius:50%;\n cursor:pointer;\n }\n .btn-lf:hover{\n background-color:#eaeaea;\n color:#fff;\n }\n .btn-rt{\n position: relative;\n top: -6px;\n margin-left:-13px;\n background-color:#fff;\n box-shadow: 0 0 4px rgba(0,0,0,.14), 0 4px 8px rgba(0,0,0,.28);\n color:#000;\n border-top-right-radius:50%;\n border-bottom-right-radius:50%;\n cursor:pointer;\n }\n .btn-rt:hover{\n background-color:#eaeaea;\n color:#fff;\n }\n .title-text{\n margin-left: -90px;\n display:block;\n }\n \n .div-slider{\n width:280px;\n margin:0 auto;\n }\n</style>\n\n<div>\n <label class=\"title-text\">{{config.my_name}}</label>\n <div class=\"btn-group\">\n <label class=\"btn-pad btn-lf\"\n ng-click=\"sendCmd(config.action_item,(config.prev_command))\"><i class=\"glyphicon glyphicon-step-backward\"></i></label>\n \t<label class=\"btn-radius btn-danger\" ng-if=\"itemValue(config.status_item) !='PLAY'\"\n ng-click=\"sendCmd(config.action_item,'PLAY')\"><i class=\"glyphicon glyphicon-play glyphicon-text\"></i></label>\n <label class=\"btn-radius btn-warning\" ng-if=\"itemValue(config.status_item) =='PLAY'\"\n ng-click=\"sendCmd(config.action_item,'PAUSE')\"><i class=\"glyphicon glyphicon-pause glyphicon-text\"></i></label>\n <label class=\"btn-pad btn-rt\"\n ng-click=\"sendCmd(config.action_item,(config.next_command))\"><i class=\"glyphicon glyphicon-step-forward\"></i></label>\n </div>\n <div class=\"div-slider\">\n<div ng-init='model={\"item\": (config.volume), \"floor\": 0, \"ceil\": 100, \"step\":(config.step)}'>\n <widget-slider ng-model=\"model\" />\n \n</div>\n </div>\n</div>",
  765. "name": "Music Control",
  766. "author": "Mike Murphy",
  767. "description": "Music Control Player",
  768. "settings": [
  769. {
  770. "type": "item",
  771. "id": "action_item",
  772. "label": "Send action to item"
  773. },
  774. {
  775. "type": "item",
  776. "id": "status_item",
  777. "label": "Get item status"
  778. },
  779. {
  780. "type": "string",
  781. "id": "my_name",
  782. "label": "Speaker Location/Name"
  783. },
  784. {
  785. "type": "item",
  786. "id": "volume",
  787. "label": "Volume Item"
  788. },
  789. {
  790. "type": "number",
  791. "id": "step",
  792. "label": "Volume Increment"
  793. },
  794. {
  795. "type": "string",
  796. "id": "next_command",
  797. "label": "Next Command Text"
  798. },
  799. {
  800. "type": "string",
  801. "id": "prev_command",
  802. "label": "Previous Command Text"
  803. }
  804. ],
  805. "readme_url": "https://community.openhab.org/t/20153"
  806. },
  807. "informational-header": {
  808. "template": "<style>\n\t.glow {\n /* \n Animation inspired by Jason Jones \n https://github.com/jmsjones/habpanel-widgets/blob/master/attention-with-button.widget.json) \n */\n\n animation-name: glow;\n animation-duration: 3s;\n animation-iteration-count: infinite;\n }\n @keyframes glow {\n 50% {background-color: black; border-color: transparent; color: white;}\n\t}\n</style>\n<h2>{{ngModel.name}}\n <div class=\"pull-right\" style=\"margin-left: 0.25em; display: inline-flex;\">\n <div ng-repeat=\"notification in itemsInGroup(config.notifications_group_name)\"\n ng-if=\"itemValue(notification.name) == config.notification_item_condition\"\n ng-click=\"sendCmd(notification.name, config.send_on_click_command)\"\n style=\"margin: inherit;\"\n class=\"btn {{config.additional_classes_btn}}\"\n ng-class=\"notification.tags\">{{ notification.label }}\n \t</div>\n </div>\n</h2>",
  809. "name": "Header with interactive notifications",
  810. "author": "Leroy Förster",
  811. "description": "Displays customizable, interactive notification items after the dashboard name. Notifications should be separate items and be member of a group you set in <Notifications Group Name>. Style the notification with Bootstrap3 button classes by adding one of these classes to your item's tags: \"btn-default\", \"btn-primary\", \"btn-success\", \"btn-info\", \"btn-warning\", \"btn-danger\". Give the buttons an additional glowing animation by adding \"glow\" to the item's tags in addition to the btn-color-classes.",
  812. "settings": [
  813. {
  814. "type": "item",
  815. "id": "notifications_group_name",
  816. "label": "Notifications Group Name",
  817. "default": "notifications",
  818. "description": "A group of Switch Items. The Items' labels will be displayed when the item's state matches the state you set below."
  819. },
  820. {
  821. "type": "string",
  822. "id": "notification_item_condition",
  823. "label": "Notification item condition",
  824. "default": "ON",
  825. "description": "The notification is shown if a member of the group <Notifications Group> has exactly the state you set here."
  826. },
  827. {
  828. "type": "string",
  829. "id": "send_on_click_command",
  830. "label": "Send command on click",
  831. "default": "OFF",
  832. "description": "Sends a command to the single notification that was clicked."
  833. },
  834. {
  835. "type": "choice",
  836. "id": "additional_classes_btn",
  837. "label": "Additional bootstrap3 classes for the buttons",
  838. "choices": "btn-sm,btn-lg,",
  839. "description": "This modifies the style classes of all buttons. Make them smaller or larger as you desire."
  840. }
  841. ],
  842. "source_url": "https://raw.githubusercontent.com/gersilex/informational-header/master/informational-header.widget.json",
  843. "readme_url": "https://github.com/gersilex/informational-header"
  844. },
  845. "MultiState": {
  846. "template": "<style>\n.myswitch { position: relative; display: inline-block; width: 60px; height: 30px; left: 20px;}\n.myswitch input {display:none;}\n.myslider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #3F4F5F; -webkit-transition: 0s; transition: .2s;}\n.myslider:before { position: absolute; content: \"\"; height: 22px; width: 22px; left: 8px; bottom: 4px; background-color: white; -webkit-transition: 0s; transition: .2s;}\ninput:checked + .myslider { background-color: #26FF33; }\ninput:focus + .myslider { box-shadow: 0 0 1px #26FF33; }\ninput:checked + .myslider:before { -webkit-transform: translateX(26px); -ms-transform: translateX(26px); transform: translateX(26px);}\n.myslider.round { border-radius: 30px;}\n.myslider.round:before { border-radius: 50%;}\n.nosliderOff { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; width: 45px; background-color: #3F4F5F; }\n.nosliderOff.round { border-radius: 30px;} \n.nosliderOn { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; width: 45px; background-color: #26FF33; }\n.nosliderOn.round { border-radius: 30px;} \n<!-- thanks to ... for style @ https://community.openhab.org/t/template-for-many-switches-in-a-group/21739 -->\n</style>\n<div ng-if=\"(config.item_header!='')\">\n <div ng-if=\"config.item_showsummary\"><h4>{{config.item_header}} : {{(itemsInGroup(config.item_groupid) | filter:{state:'ON'}).length}} von {{(itemsInGroup(config.item_groupid)).length}}</h4></div>\n <div ng-if=\"!config.item_showsummary\"><h4>{{config.item_header}}</h4></div>\n</div>\n<table class=\"table \">\n <tr ng-repeat=\"item in itemsInGroup(config.item_groupid)\">\n\n <td class=\"text-right\"><div style=\"height:25px; padding-top:4px;\">{{item.label.substr(config.item_skipncharsindescription,99)}}\n <div ng-if=\"(config.item_type=='Rollershutter')\">{{itemState(item.name)}}%</div></div></td>\n <td class=\"text-left\">\n <div ng-if=\"(config.item_type=='Switch')\">\n\t\t\t\t\t\t\t\t<div style=\"height:30px;\"><label class=\"myswitch\">\n <input type=\"checkbox\" ng-checked=\"(itemValue(item.name)=='ON')||(itemValue(item.name)>0)\" ng-click=\"sendCmd(item.name, (itemValue(item.name)=='OFF') ? 'ON':'OFF')\"/><div class=\"myslider round\"></div></label>\n </div>\n </div>\n <div ng-if=\"(config.item_type=='Window')\">\n <div ng-style=\"{'background-color': (itemState(item.name)=='OPEN') ? '#26FF33' : 'transparent' }\">\n <button style=\"width: 100%; height: 2em; border: 0; color: white; background: transparent; font-size: 16px\" ng-click=\"\">\n <div ng-if=\"((config.item_icon_iconset)==NULL)\"><widget-icon iconset=\"'freepik-household'\" icon=\"'window-9'\" /></div>\n <div ng-if=\"((config.item_icon_iconset)!=NULL)\"><widget-icon iconset='config.item_icon_iconset' icon='config.item_icon' /></div>\n </button>\n </div>\n </div>\n <div ng-if=\"(config.item_type=='Showvalues_ON')\">\n <div ng-style=\"{'height': (itemValue(item.name + '_soll')!='N/A') ? '40px' : '25px' }\">\n <button style=\"width:100%; height: 2em; border: 0; color: white; background: transparent; font-size: 16px\" ng-click=\"\">\n <div ng-style=\"{'background-color': (itemState(item.name)=='ON') ? '#26FF33' : 'transparent' }\">\n {{itemState(item.name).substr(0,4)}}{{config.item_unit.replace(\"_\",\" \")}}\n <div ng-if=\"(config.item_extension!=NULL)\">\n <div ng-if=\"itemValue(item.name + config.item_extension)!='N/A'\">\n <div style=\"color:#606060;\"> \n \t\t[ {{itemState(item.name+config.item_extension).substr(0,4)}}{{config.item_unit.replace(\"_\",\" \")}} ]\n </div>\n </div>\n </div>\n </div>\n </button>\n </div>\n </div>\n <div ng-if=\"(config.item_type=='Showvalues_OFF')\">\n <div ng-style=\"{'height': (itemValue(item.name + '_soll')!='N/A') ? '40px' : '25px' }\">\n <button style=\"width:100%; height: 2em; border: 0; color: white; background: transparent; font-size: 16px\" ng-click=\"\">\n <div ng-style=\"{'background-color': (itemState(item.name)=='OFF') ? '#26FF33' : 'transparent' }\">\n {{itemState(item.name).substr(0,4)}}{{config.item_unit.replace(\"_\",\" \")}}\n <div ng-if=\"(config.item_extension!=NULL)\">\n <div ng-if=\"itemValue(item.name + config.item_extension)!='N/A'\">\n <div style=\"color:#606060;\"> \n \t\t[ {{itemState(item.name+config.item_extension).substr(0,4)}}{{config.item_unit.replace(\"_\",\" \");}} ]\n </div>\n </div>\n </div>\n </div>\n </button>\n </div>\n </div>\n\n \n <div ng-if=\"(config.item_type=='Toggle')\">\n <button style=\"width:45%; height: 2em; border: 0; color: white; background: transparent; font-size: 16px\" ng-click=\"sendCmd((item.name), (itemState(item.name)!='ON')?'ON':'OFF')\">\n <div ng-style=\"{'background-color': (itemState(item.name)=='ON') ? '#26FF33' : 'transparent' }\">\n <div ng-if=\"((config.item_icon_iconset)==NULL)\"><widget-icon iconset=\"'freepik-household'\" icon=\"'light-bulb-1'\" /></div>\n <div ng-if=\"((config.item_icon_iconset)!=NULL)\"><widget-icon iconset='config.item_icon_iconset' icon='config.item_icon' /></div>\n </div>\n </button>\n <button style=\"width: 45%; height: 2em; border: 0; color: white; background: transparent; font-size: 16px\" ng-click=\"sendCmd((item.name), (itemState(item.name)!='ON')?'ON':'OFF')\">\n <div ng-style=\"{'background-color': (itemState(item.name)=='OFF') ? '#003399' : 'transparent' }\">\n <div ng-if=\"((config.item_icon_iconset)==NULL)\"><widget-icon iconset=\"'freepik-household'\" icon=\"'light-bulb-1'\" /></div>\n <div ng-if=\"((config.item_icon_iconset)!=NULL)\"><widget-icon iconset='config.item_icon_iconset' icon='config.item_icon' /></div>\n </div>\n </button>\n </div>\n\n \t<div ng-if=\"(config.item_type=='Rollershutter')\">\n <div style=\"height:40px;\">\n <button style=\"width: 15%; height: 2em; border: 0; color: white; background: transparent; font-size: 16px\" ng-click=\"sendCmd((item.name), 'UP')\">&uarr;</button>\n <button style=\"width: 50%; height: 2em; border: 0; color: white; background: transparent; font-size: 16px\" ng-click=\"sendCmd((item.name), 'STOP')\">Stop</button>\n <button style=\"width: 15%; height: 2em; border: 0; color: white; background: transparent; font-size: 16px\" ng-click=\"sendCmd((item.name), 'DOWN')\">&darr;</button>\n </div>\n </div>\n </td>\n </tr>\n \n <tr >\n <td class=\"text-right\">\n <div ng-if=\"(config.item_switchgroupall)\">{{config.item_header}}</div>\n \t\t</td>\n <td class=\"text-left\">\n\t\t\t <div ng-if=\"(config.item_switchgroupall)\">\n <div ng-if=\"((config.item_type=='Toggle') || ((config.item_type=='Switch')))\">\n <label class=\"myswitch\"><input type=\"checkbox\" ng-checked=\"false\" ng-click=\"sendCmd(config.item_groupid, 'OFF')\"/><div class=\"nosliderOff round\"></div></label>\n <label class=\"myswitch\"><input type=\"checkbox\" ng-checked=\"true\" ng-click=\"sendCmd(config.item_groupid, 'ON')\"/><div class=\"nosliderOn round\"></div></label> \n </div>\n\n \t<div ng-if=\"(config.item_type=='Rollershutter')\">\n <button style=\"width: 15%; height: 2em; border: 0; color: white; background: transparent; font-size: 16px\" ng-click=\"sendCmd((config.item_groupid), 'UP')\">&uarr;</button>\n <button style=\"width: 50%; height: 2em; border: 0; color: white; background: transparent; font-size: 16px\" ng-click=\"sendCmd((config.item_groupid), 'STOP')\">Stop</button>\n <button style=\"width: 15%; height: 2em; border: 0; color: white; background: transparent; font-size: 16px\" ng-click=\"sendCmd((config.item_groupid), 'DOWN')\">&darr;</button>\n </div>\n </div>\n </td>\n </tr>\n \n</table>",
  847. "name": "MultiState / MultiItem display of a group of values in one widget",
  848. "author": "Michael Martens",
  849. "description": "V1 - Nov 2017 - Items of a group are shown, depending on config they are just displayed or can be changed.",
  850. "settings": [
  851. {
  852. "type": "string",
  853. "id": "item_header",
  854. "label": "Header of table",
  855. "default": "Erdgeschoss",
  856. "description": "Enter a header, if needed"
  857. },
  858. {
  859. "type": "item",
  860. "id": "item_groupid",
  861. "label": "GroupID",
  862. "default": "gEG",
  863. "description": "Enter the group to visualize"
  864. },
  865. {
  866. "type": "icon",
  867. "id": "item_icon",
  868. "label": "Iconset and Icon to be displayed",
  869. "description": "What icon shall be used (e.g.: freepik-household, light-bulb-1); If empty, these icons are used"
  870. },
  871. {
  872. "type": "choice",
  873. "choices": "Switch,Toggle,Rollershutter,Window,Showvalues_ON,Showvalues_OFF",
  874. "id": "item_type",
  875. "label": "Type of items to display",
  876. "default": "Switch",
  877. "description": "Enter here the type of switch to allow proper selection; Showvalues_O.. showing green for the selected value"
  878. },
  879. {
  880. "type": "number",
  881. "id": "item_skipncharsindescription",
  882. "label": "Skip first n chars in description",
  883. "default": "0",
  884. "description": "if all labels start with \"EG..\" you can skip them by entering a number of chars"
  885. },
  886. {
  887. "type": "checkbox",
  888. "id": "item_showsummary",
  889. "label": "Show summary of states",
  890. "default": true,
  891. "description": "Check if you want to see how many items are in the \"on\" state"
  892. },
  893. {
  894. "type": "checkbox",
  895. "id": "item_switchgroupall",
  896. "label": "Offer general switch for all items",
  897. "description": "Check here to switch all items at once (No for Windows usefull)",
  898. "default": true
  899. },
  900. {
  901. "type": "string",
  902. "id": "item_extension",
  903. "label": "Additional value",
  904. "default": "",
  905. "description": "If a second value shall be displayed as a reference, the name variable must be identical plus the value. E.g. Temp1 and Temp1_soll by naming \"_soll\""
  906. },
  907. {
  908. "type": "string",
  909. "id": "item_unit",
  910. "label": "Unit",
  911. "description": "If a unit shall be displayed, enter it here. E.g. \"_°C\" - with a leading underscore (converted to blanks) to create a distance"
  912. }
  913. ],
  914. "readme_url": "https://community.openhab.org/t/35913"
  915. },
  916. "Alarm_Keypad": {
  917. "template": "<style>\n @media screen and (max-width: 767px) {\n \t .alarmKpMainContainer {\n \t\t\t\t\theight: 300px !important;\n }\n\t }\n .alarmKpMainContainer {\n width: 100%;\n height: 100%;\n left: 0;\n top: 0;\n \t\t\twhite-space: nowrap;\n }\n\n .alarmKpMainContainer .container {\n width: 100%;\n height: 100%;\n position: relative;\n padding-top: 0;\n }\n\n .alarmKpMainContainer .container .row {\n height: 25%;\n }\n\n .alarmKpMainContainer button.btn-default {\n background: #424242;\n }\n\n .alarmKpMainContainer button.leftmost {\n margin-left: 0;\n }\n\n .alarmKpMainContainer button.rightmost {\n margin-right: 0;\n }\n\n .alarmKpMainContainer button.col-sm-3 {\n width: calc(25% - 10px);\n height: calc(100% - 10px);\n margin: 5px;\n }\n\n .alarmKpMainContainer button {\n position: relative;\n overflow: hidden;\n border-radius: 4px;\n border-color: transparent !important;\n color: #fff !important;\n font-size: 2em;\n }\n\n .alarmKpMainContainer button.leftmost {\n font-size: 1.25em;\n }\n\n .alarmKpMainContainer button:focus,\n .alarmKpMainContainer button:active {\n outline: none !important;\n }\n\n .alarmKpMainContainer button:focus:not(:active)::after {\n animation: ripple 1s ease-out;\n }\n\n .alarmKpMainContainer button:after {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n width: 5px;\n height: 5px;\n background: rgba(255, 255, 255, .5);\n opacity: 0;\n border-radius: 100%;\n transform: scale(1, 1) translate(-50%);\n transform-origin: 50% 50%;\n }\n\n .alarmKpMainContainer button .subText {\n font-size: .5em;\n position: absolute;\n top: 7px;\n right: 7px;\n font-style: italic;\n color: #7b6845;\n }\n\n .alarmKpMainContainer button .subText.bigger {\n font-size: .75em;\n }\n\n @keyframes ripple {\n 0% {\n transform: scale(0, 0);\n opacity: 1;\n }\n 20% {\n transform: scale(25, 25);\n opacity: 1;\n }\n 100% {\n opacity: 0;\n transform: scale(40, 40);\n }\n }\n\n .alarmKpMainContainer .subText.offColor {\n color: #449d44;\n }\n\n .alarmKpMainContainer .subText.awayColor {\n color: #ec971f;\n }\n\n .alarmKpMainContainer .subText.stayColor {\n color: #31b0d5;\n }\n</style>\n<div class=\"alarmKpMainContainer\">\n <div class=\"container\">\n <div class=\"row gutter4\">\n <button data-ng-click=\"sendCmd(config.alarmPnlCmdOff, '1')\" class=\"btn btn-success col-sm-3 leftmost\">\n <span data-ng-bind-html=\"config.mainLabel_off\"></span>\n <span class=\"subText bigger\">off</span>\n </button>\n <button data-ng-click=\"sendCmd(config.alarmPnlCmd, '1')\" class=\"btn btn-default col-sm-3\">\n 1\n <span class=\"subText offColor\">off</span>\n </button>\n <button data-ng-click=\"sendCmd(config.alarmPnlCmd, '2')\" class=\"btn btn-default col-sm-3\">\n 2 \n <span class=\"subText awayColor\">away</span>\n </button>\n <button data-ng-click=\"sendCmd(config.alarmPnlCmd, '3')\" class=\"btn btn-default col-sm-3 rightmost\">\n 3\n <span class=\"subText stayColor\">stay</span>\n </button>\n </div>\n <div class=\"row gutter4\">\n <button data-ng-click=\"sendCmd(config.alarmPnlCmdS, '1')\" class=\"btn btn-info col-sm-3 leftmost\">\n <span data-ng-bind-html=\"config.mainLabel_armStay\"></span>\n <span class=\"subText bigger\">arm stay</span>\n </button>\n <button data-ng-click=\"sendCmd(config.alarmPnlCmd, '4')\" class=\"btn btn-default col-sm-3\">\n 4\n <span class=\"subText\">max</span>\n </button>\n <button data-ng-click=\"sendCmd(config.alarmPnlCmd, '5')\" class=\"btn btn-default col-sm-3\">\n 5\n <span class=\"subText\">test</span>\n </button>\n <button data-ng-click=\"sendCmd(config.alarmPnlCmd, '6')\" class=\"btn btn-default col-sm-3 rightmost\">\n 6\n <span class=\"subText\">bypass</span>\n </button>\n </div>\n <div class=\"row gutter4\">\n <button data-ng-click=\"sendCmd(config.alarmPnlCmdA, '1')\" class=\"btn btn-warning col-sm-3 leftmost\">\n <span data-ng-bind-html=\"config.mainLabel_armAway\"></span>\n <span class=\"subText bigger\">arm away</span>\n </button>\n <button data-ng-click=\"sendCmd(config.alarmPnlCmd, '7')\" class=\"btn btn-default col-sm-3\">\n 7\n <span class=\"subText\">instant</span>\n </button>\n <button data-ng-click=\"sendCmd(config.alarmPnlCmd, '8')\" class=\"btn btn-default col-sm-3\">\n 8\n <span class=\"subText\">code</span>\n </button>\n <button data-ng-click=\"sendCmd(config.alarmPnlCmd, '9')\" class=\"btn btn-default col-sm-3\">\n 9\n <span class=\"subText\">chime</span>\n </button>\n </div>\n <div class=\"row gutter4\">\n <button data-ng-click=\"sendCmd(config.alarmPnlCmdA, '1')\" class=\"btn btn-danger col-sm-3 leftmost\"><strong><em>Panic !</em></strong></button>\n <button data-ng-click=\"sendCmd(config.alarmPnlCmd, '10')\" class=\"btn btn-default col-sm-3\">\n *\n <span class=\"subText\">ready</span>\n </button>\n <button data-ng-click=\"sendCmd(config.alarmPnlCmd, '0')\" class=\"btn btn-default col-sm-3\">0</button>\n <button data-ng-click=\"sendCmd(config.alarmPnlCmd, '11')\" class=\"btn btn-default col-sm-3 rightmost\">#</button>\n </div>\n </div>\n</div>",
  918. "name": "Alarm Keypad",
  919. "author": "Lucky Mallari",
  920. "settings": [
  921. {
  922. "type": "item",
  923. "id": "alarmPnlCmd",
  924. "label": "Alarm Panel Command",
  925. "description": "Alarm Panel Item Command receiver. This is tied to a rule.",
  926. "default": "alarmPanelCommand"
  927. },
  928. {
  929. "type": "item",
  930. "id": "alarmPnlCmdA",
  931. "label": "Alarm Panel Command for Away",
  932. "description": "Alarm Panel Item Command receiver for Arm Away. This is the item name that is also tied to a rule where your back-end sends the Arm Away command to your Alarm (such as Alarm Decoder module)",
  933. "default": "alarmPanelCommandMacroAway"
  934. },
  935. {
  936. "type": "item",
  937. "label": "Alarm Panel Command for Stay",
  938. "id": "alarmPnlCmdS",
  939. "description": "Alarm Panel Item Command receiver for Arm Away. This is the item name that is also tied to a rule where your back-end sends the Arm Stay command to your Alarm (such as Alarm Decoder module)",
  940. "default": "alarmPanelCommandMacroStay"
  941. },
  942. {
  943. "type": "item",
  944. "id": "alarmPnlCmdOff",
  945. "description": "Alarm Panel Item Command receiver for OFF. This is the item name that is also tied to a rule where your back-end sends the OFF command to your Alarm (such as Alarm Decoder module)",
  946. "label": "Alarm Panel Command for Off",
  947. "default": "alarmPanelCommandMacroOff"
  948. },
  949. {
  950. "type": "string",
  951. "id": "mainLabel_off",
  952. "label": "Off Text",
  953. "default": "Off",
  954. "description": "Main Label for Off. You can change this to anything. I prefer \"Patay\" which means off or dead in my language. You can use simple html here such as Line1<br>Line2"
  955. },
  956. {
  957. "type": "string",
  958. "id": "mainLabel_armStay",
  959. "label": "Stay Text",
  960. "default": "Stay",
  961. "description": "Main Label for Arm Stay. You can change this to anything. I prefer \"Dito Lang\" which means \"just here\" in my language. You can use simple html here such as Line1<br>Line2"
  962. },
  963. {
  964. "type": "string",
  965. "id": "mainLabel_armAway",
  966. "label": "Away Text",
  967. "default": "Away",
  968. "description": "Main Label for Arm Away. You can change this to anything. I prefer \"Alis Muna\" which means \"Leaving..\" in my language. You can use simple html here such as Line1<br>Line2"
  969. }
  970. ],
  971. "description": "Alarm Keypad",
  972. "readme_url": "https://community.openhab.org/t/37409"
  973. },
  974. "side widget": {
  975. "template": "<span>{{ngModel.name}}</span> <span class=\"pull-right label label-primary\">Living Room</span>\n<dl style=\"padding: 0; margin: 0; font-size: 8pt; text-transform: none;\">\n <dd class=\"pull-right value\">{{\"%0.1f°F\"|fmt:+itemState(\"LRTemperature\")}}</dd>\n <dt>{{\"Temperature\"}} </dt>\n <dd class=\"pull-right value\">{{\"%0.1f%%\"|fmt:+itemState(\"LRHumidity\")}}</dd>\n <dt>{{\"Humidity\"}} </dt>\n</dl>",
  976. "settings": []
  977. },
  978. "Keypad": {
  979. "template": "<!-- \nWidget Keypad \nfor openHAB\nLucky Mallari 2018\n-->\n<form name=\"_gkw\" ng-init=\"config.marginPx = (config.marginPx < 0 ? 0 : config.marginPx)\">\n <style>\n .genericKeypadWidget {\n \tdisplay: flex;\n \tflex-wrap: wrap;\n \tflex: 0 1 100%;\n \twidth: 100%;\n \theight: 100%;\n \tposition: absolute;\n \ttop: 0;\n \tleft: 0;\n \tpadding: {{config.marginPx / 2}}px;\n }\n \n .genericKeypadWidget button {\n \toutline: none;\n }\n \n .genericKeypadWidget .keys {\n \tdisplay: flex;\n flex: 0 1 100%;\n \toverflow: hidden;\n flex-wrap: wrap;\n \theight: 100%;\n }\n \n .genericKeypadWidget .key {\n \tmargin: {{config.marginPx / 2}}px;\n flex: 1;\n \tflex-basis: calc(33% - {{config.marginPx}}px - 1px);\n \tbreak-inside: avoid;\n justify-content: center;\n align-items: center;\n\t\t\tfont-size: {{config.keyFontSize}};\n border: none;\n cursor: pointer;\n\t\t\tbackground: {{config.btnKeysBgColor}};\n \toverflow: hidden;\n \theight: calc({{config.isShowOutputBox?'20%':'25%'}} - {{config.marginPx}}px);\n \tposition: relative;\n \tborder-radius: {{config.btnBorderRadius}};\n }\n \n .genericKeypadWidget .key:not(:disabled)::after {\n \t\tcontent: '';\n\t\t position: absolute;\n \t\ttop: 50%;\n \t\tleft: 50%;\n \t\twidth: 5px;\n \t\theight: 5px;\n \t\tbackground: rgba(255, 255, 255, .5);\n \t\topacity: 0;\n \t\tborder-radius: 100%;\n \t\ttransform: scale(1, 1) translate(-50%);\n \t\ttransform-origin: 50% 50%;\n }\n \n .genericKeypadWidget .key:focus:not(:active)::after {\n \t\tanimation: ripple 1s ease-out;\n\t\t}\n \n .genericKeypadWidget .key.outputBox {\n display: flex;\n \tmargin: {{config.marginPx / 2}}px;\n \tflex-basis: 100%;\n justify-content: {{config.outputBoxTextAlign == 'right' ? 'flex-end': config.outputBoxTextAlign}};\n align-items: center;\n font-size: {{config.outputBoxFontSize}};\n background: #000;\n color: #fff;\n flex-basis: 100%;\n \tposition: relative;\n \tpointer-events: {{ config.isOutputBoxClickable ? 'auto' : 'none' }};\n\t\t} \n \n .genericKeypadWidget .key.btn_disabled::after {\n content: '';\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0px;\n left: 0px;\n background: rgba(0,0,0,.65);\n \tmargin: 0px;\n \tborder-radius: {{config.btnBorderRadius}};\n } \n \n .genericKeypadWidget input.noshow {\n display: none;\n }\n\n .genericKeypadWidget .key.btn_ok {\n\t\t\tbackground: {{config.btnOkBgColor}};\n }\n\t\t\n .genericKeypadWidget .key.btn_del {\n \tbackground: {{config.btnDelBgColor}};\n } \n \n .genericKeypadWidget .key.btn_clr {\n \tdisplay: flex;\n \tposition: absolute;\n \ttop: 0;\n \tleft: 0;\n \tbackground: rgba(0,0,0,0.15);\n \theight: 100%;\n \talign-items: center;\n \tfont-size: 1.5vh;\n \tpointer-events: auto;\n \tmargin: 0;\n \tpadding: 10px;\n }\n \n @keyframes ripple {\n 0% {\n transform: scale(0, 0);\n opacity: 1;\n }\n 20% {\n transform: scale(25, 25);\n opacity: 1;\n }\n 100% {\n opacity: 0;\n transform: scale(40, 40);\n }\n } \n </style>\n\n <div class=\"genericKeypadWidget\" ng-init=\"gwk_data={ current: '' }\">\n <input type=\"text\" class=\"noshow\" name=\"current\" ng-model=\"gwk_data.current\" required=\"true\"></input>\n <div class=\"keys\">\n <div class=\"key outputBox\" contenteditable=\"true\" ng-if=\"config.isShowOutputBox\">\n \t<span class=\"outputBoxText\" ng-repeat=\"letter in gwk_data.current.split('') track by $index\">{{config.isMaskOutputBox ? config.maskChar : letter}}</span>\n \t<button class=\"key btn_clr\" contenteditable=\"false\" ng-if=\"_gkw.current.$valid\" ng-click=\"gwk_data.current=''\">{{config.text_btnClear}}</button>\n \t</div>\n\n <button class=\"key\" ng-click=\"gwk_data.current = gwk_data.current + '1'\">1</button>\n <button class=\"key\" ng-click=\"gwk_data.current = gwk_data.current + '2'\">2</button>\n <button class=\"key\" ng-click=\"gwk_data.current = gwk_data.current + '3'\">3</button>\n\n <button class=\"key\" ng-click=\"gwk_data.current = gwk_data.current + '4'\">4</button>\n <button class=\"key\" ng-click=\"gwk_data.current = gwk_data.current + '5'\">5</button>\n <button class=\"key\" ng-click=\"gwk_data.current = gwk_data.current + '6'\">6</button>\n\n <button class=\"key\" ng-click=\"gwk_data.current = gwk_data.current + '7'\">7</button>\n <button class=\"key\" ng-click=\"gwk_data.current = gwk_data.current + '8'\">8</button>\n <button class=\"key\" ng-click=\"gwk_data.current = gwk_data.current + '9'\">9</button>\n\n <button class=\"key btn_del\" ng-class=\"{'btn_disabled':_gkw.current.$invalid}\" ng-click=\"gwk_data.current = gwk_data.current.slice(0,-1)\" ng-disabled=\"_gkw.current.$invalid\" title=\"Hold to clear\">{{config.text_del}}</button>\n <button class=\"key\" ng-click=\"gwk_data.current = gwk_data.current + '0'\">0</button>\n <button class=\"key btn_ok\" ng-class=\"{'btn_disabled':_gkw.current.$invalid}\" ng-click=\"sendCmd(config.keypadReceiver, gwk_data.current); (config.isClearOnSubmit && (gwk_data.current='') || true)\" ng-disabled=\"_gkw.current.$invalid\" title=\"Submit\">{{config.text_ok}}</button>\n\n </div>\n </div>\n</form>\n\n",
  980. "name": "Keypad",
  981. "author": "Lucky Mallari",
  982. "description": "Generic Keypad Widget",
  983. "settings": [
  984. {
  985. "type": "item",
  986. "id": "keypadReceiver",
  987. "label": "Receiving Item",
  988. "default": "keypadReceiver",
  989. "description": "Item that receives the keypad value. MUST BE A Number or String Item"
  990. },
  991. {
  992. "type": "string",
  993. "id": "text_ok",
  994. "label": "OK Text",
  995. "default": "OK",
  996. "description": "Text of the OK/submit button"
  997. },
  998. {
  999. "type": "string",
  1000. "id": "text_del",
  1001. "label": "Delete/Backspace Text",
  1002. "default": "del",
  1003. "description": "Text of the Delete/Backspace button"
  1004. },
  1005. {
  1006. "type": "number",
  1007. "id": "marginPx",
  1008. "label": "Spacing",
  1009. "default": "5",
  1010. "description": "Spacing (in px) between keys. Minimum enforced value of 0"
  1011. },
  1012. {
  1013. "type": "checkbox",
  1014. "id": "isShowOutputBox",
  1015. "label": "Show Output Box",
  1016. "default": true,
  1017. "description": "Shows the output box if checked"
  1018. },
  1019. {
  1020. "type": "checkbox",
  1021. "id": "isMaskOutputBox",
  1022. "label": "Masks the output box",
  1023. "default": true,
  1024. "description": "Masks the output box if checked"
  1025. },
  1026. {
  1027. "type": "string",
  1028. "id": "outputBoxFontSize",
  1029. "default": "2em",
  1030. "label": "Output Box Font Size",
  1031. "description": "Font size - INCLUDE UNIT (px, em, etc.)"
  1032. },
  1033. {
  1034. "type": "string",
  1035. "id": "maskChar",
  1036. "label": "Mask Character",
  1037. "default": "♣",
  1038. "description": "Mask Character (any). Examples: ✿ ♣ ● X"
  1039. },
  1040. {
  1041. "type": "string",
  1042. "id": "outputBoxBg",
  1043. "label": "Output Box Background",
  1044. "description": "Output Box Background. Example: white, #F1F1F1, inherit, or even rgba(255,255,255,.5). url('//source.unsplash.com/random') also works",
  1045. "default": "#c5c5c5"
  1046. },
  1047. {
  1048. "type": "string",
  1049. "id": "outputBoxColor",
  1050. "label": "Output Box char color",
  1051. "default": "#000",
  1052. "description": "Output Box text color"
  1053. },
  1054. {
  1055. "type": "choice",
  1056. "id": "outputBoxTextAlign",
  1057. "label": "Output Box Text Alignment",
  1058. "default": "center",
  1059. "choices": "left,center,right",
  1060. "description": "Alignment of the output box text"
  1061. },
  1062. {
  1063. "type": "checkbox",
  1064. "id": "isClearOnSubmit",
  1065. "label": "Clear On Submit",
  1066. "description": "Clears the output box on submit",
  1067. "default": true
  1068. },
  1069. {
  1070. "type": "checkbox",
  1071. "id": "isOutputBoxClickable",
  1072. "label": "Output Box Clickable",
  1073. "default": false,
  1074. "description": "If checked, you can click on the box and the text cursor will be there."
  1075. },
  1076. {
  1077. "type": "string",
  1078. "id": "keyColor",
  1079. "label": "Key Color",
  1080. "default": "inherit",
  1081. "description": "Key Color in valid CSS code. Example: white, #F1F1F1, inherit, or even rgba(255,255,255,.5). url('//source.unsplash.com/random') also works"
  1082. },
  1083. {
  1084. "type": "string",
  1085. "id": "btnOkBgColor",
  1086. "label": "OK Background",
  1087. "description": "OK/Submit button background color. Example: white, #F1F1F1, inherit, or even rgba(255,255,255,.5). url('//source.unsplash.com/random') also works",
  1088. "default": "#197500"
  1089. },
  1090. {
  1091. "type": "string",
  1092. "id": "btnDelBgColor",
  1093. "label": "Del/Clear Background",
  1094. "default": "#9c0000",
  1095. "description": "Backspace/Clear button background color. Example: white, #F1F1F1, inherit, or even rgba(255,255,255,.5). url('//source.unsplash.com/random') also works"
  1096. },
  1097. {
  1098. "type": "string",
  1099. "id": "btnKeysBgColor",
  1100. "label": "0-9 Keys Background",
  1101. "default": "#616161",
  1102. "description": "0-9 button background color. Example: white, #F1F1F1, inherit, or even rgba(255,255,255,.5). url('//source.unsplash.com/random') also works"
  1103. },
  1104. {
  1105. "type": "string",
  1106. "id": "btnBorderRadius",
  1107. "label": "Rounded corner radius",
  1108. "default": "4px",
  1109. "description": "Border radius for all keys. INCLUDE UNIT. Example: 4px, 50% (round)"
  1110. },
  1111. {
  1112. "type": "string",
  1113. "id": "text_btnClear",
  1114. "label": "Clear Button",
  1115. "default": "x",
  1116. "description": "Clear button text/character"
  1117. },
  1118. {
  1119. "type": "string",
  1120. "id": "keyFontSize",
  1121. "label": "Keys Font Size",
  1122. "default": "2em",
  1123. "description": "Font size - INCLUDE UNIT (px, em, etc.)"
  1124. }
  1125. ],
  1126. "readme_url": "https://community.openhab.org/t/39002"
  1127. },
  1128. "MansionDash": {
  1129. "template": "<style>\n .modcol {\n \tfloat: left;\n \tpadding-right: 30px;\n }\n</style>\n\n<a href=\"#/view/{{config.target}}\">\n \n<img class=\"box-content img-fluid\" style=\"width: 100%; padding:0; {{config.filter}}\" src=\"{{config.img_url}}\"></img>\n</a>\n<div class=\"table\" style=\"position:absolute; bottom: 10px; width: 100%; pointer-events: none;\">\n\t<!-- Room Label -->\n\t<div class=\"row\">\n <div class=\"col-md-12 modcol\">\n\t\t\t<h2 style=\"text-align: left; font-weight: bold;\"> {{ngModel.name}}</h2>\n </div>\n </div>\n \n <div class=\"row\">\n <!-- Icon 1 -->\n \t<div class=\"col-md modcol\" ng-if=\"!config.item1_val\">\n \t\t<i class=\"fas fa-{{config.icon1}} fa-2x\" ng-style=\"{opacity : itemValue(config.item1) == 'OFF' ? 0.3 : 1.0}\"></i>\n </div>\n \t<div class=\"col-md modcol\" ng-if=\"config.item1_val\">\n \t\t<i class=\"fas fa-{{config.icon1}} fa-2x\" style=\"opacity : 1.0\"></i>\n {{itemValue(config.item1)}} {{config.item1_suffix}}\n </div>\n \n \t<!-- Icon 2 --> \n \t<div class=\"col-md modcol\" ng-if=\"!config.item2_val\">\n \t\t<i class=\"fas fa-{{config.icon2}} fa-2x\" ng-style=\"{opacity : itemValue(config.item2) == 'OFF' ? 0.3 : 1.0}\"></i>\n </div>\n \t<div class=\"col-md modcol\" ng-if=\"config.item2_val\">\n \t\t<i class=\"fas fa-{{config.icon2}} fa-2x\" style=\"opacity : 1.0\"></i>\n {{itemValue(config.item2)}} {{config.item2_suffix}}\n </div>\n \n <!-- Icon 3 -->\n \t<div class=\"col-md modcol\" ng-if=\"!config.item3_val\">\n \t\t<i class=\"fas fa-{{config.icon3}} fa-2x\" ng-style=\"{opacity : itemValue(config.item3) == 'OFF' ? 0.3 : 1.0}\"></i>\n </div>\n \t<div class=\"col-md modcol\" ng-if=\"config.item3_val\">\n \t\t<i class=\"fas fa-{{config.icon3}} fa-2x\" style=\"opacity : 1.0\"></i>\n {{itemValue(config.item3)}} {{config.item3_suffix}}\n </div>\n\n <!-- Icon 4 -->\n \t<div class=\"col-md modcol\" ng-if=\"!config.item4_val\">\n \t\t<i class=\"fas fa-{{config.icon4}} fa-2x\" ng-style=\"{opacity : itemValue(config.item4) == 'OFF' ? 0.3 : 1.0}\"></i>\n </div>\n \t<div class=\"col-md modcol\" ng-if=\"config.item4_val\">\n \t\t<i class=\"fas fa-{{config.icon4}} fa-2x\" style=\"opacity : 1.0\"></i>\n {{itemValue(config.item4)}} {{config.item4_suffix}}\n </div>\n \n </div>\n</div>\n\n",
  1130. "name": "MansionDash",
  1131. "author": "Hammar",
  1132. "description": "Custom Dashboard Tile",
  1133. "settings": [
  1134. {
  1135. "type": "string",
  1136. "id": "img_url",
  1137. "label": "Image URL",
  1138. "description": "Image URL",
  1139. "default": "//source.unsplash.com/random"
  1140. },
  1141. {
  1142. "type": "string",
  1143. "id": "filter",
  1144. "label": "CSS Image Filter",
  1145. "description": "Paste the filter contents from a site like www.cssfilters.co for the image filter you want. Note: only paste the contents of the .filter tag i.e. between the curly braces"
  1146. },
  1147. {
  1148. "type": "string",
  1149. "id": "target",
  1150. "label": "Target Dashboard"
  1151. },
  1152. {
  1153. "type": "item",
  1154. "id": "item1",
  1155. "label": "Item 1"
  1156. },
  1157. {
  1158. "type": "string",
  1159. "id": "icon1",
  1160. "label": "Font Awesome Icon 1"
  1161. },
  1162. {
  1163. "type": "checkbox",
  1164. "id": "item1_val",
  1165. "label": "Is value?",
  1166. "choices": "switch,value",
  1167. "description": "Is this a switch item or a value item?"
  1168. },
  1169. {
  1170. "type": "string",
  1171. "id": "item1_suffix",
  1172. "label": "Item 1 suffix (if a value)",
  1173. "default": "°C"
  1174. },
  1175. {
  1176. "type": "item",
  1177. "id": "item2",
  1178. "label": "Item 2"
  1179. },
  1180. {
  1181. "type": "string",
  1182. "id": "icon2",
  1183. "label": "Font Awesome Icon 2"
  1184. },
  1185. {
  1186. "type": "checkbox",
  1187. "id": "item2_val",
  1188. "label": "Is value?"
  1189. },
  1190. {
  1191. "type": "string",
  1192. "label": "Item 2 suffix (if a value)",
  1193. "id": "item2_suffix",
  1194. "default": "°C"
  1195. },
  1196. {
  1197. "type": "item",
  1198. "id": "item3",
  1199. "label": "Item 3"
  1200. },
  1201. {
  1202. "type": "string",
  1203. "label": "Font Awesome Icon 3",
  1204. "id": "icon3"
  1205. },
  1206. {
  1207. "type": "checkbox",
  1208. "id": "item3_val",
  1209. "label": "Is a value?"
  1210. },
  1211. {
  1212. "type": "string",
  1213. "id": "item3_suffix",
  1214. "label": "Item 3 suffix (if a value)",
  1215. "default": "°C"
  1216. },
  1217. {
  1218. "type": "item",
  1219. "id": "item4",
  1220. "label": "Item 4"
  1221. },
  1222. {
  1223. "type": "string",
  1224. "label": "Font Awesome Icon 4",
  1225. "id": "icon4"
  1226. },
  1227. {
  1228. "type": "checkbox",
  1229. "id": "item4_val",
  1230. "label": "Is a value?"
  1231. },
  1232. {
  1233. "type": "string",
  1234. "id": "item4_suffix",
  1235. "label": "Item 4 suffix (if a value)",
  1236. "default": "°C"
  1237. }
  1238. ]
  1239. },
  1240. "Chromecast": {
  1241. "template": "<div class=\"row\">\n\t<div class=\"col-xs-12\">\t<h4 ng-style=\"{'color': (config.color) ,'font-size': (config.font)}\">{{config.widget_name}}</h4></div>\n</div>\n<div class=\"row\">\n\t<div class=\"col-xs-12\" ng-if=\"itemValue(config.title) !='UNDEF'\">\t<h4>{{itemValue(config.title)}}</h4></div>\n \t<div class=\"col-xs-12\" ng-if=\"itemValue(config.seriesTitle) !='UNDEF'\">\t<h4>{{itemValue(config.seriesTitle)}}</h4></div>\n</div>\n<div class=\"row\">\n\t<div class=\"col-xs-12\">\n\t\t<img src=\"{{itemValue(config.image_url)}}\" class=\"img-thumbnail\" ng-if=\"itemValue(config.image_url) !='UNDEF'\"></img> \n <img src=\"{{(config.default_image)}}\" class=\"img-thumbnail\" ng-if=\"itemValue(config.image_url) =='UNDEF'\"></img> \n\t</div>\n</div>\n<div class=\"row\">\n\t<div class=\"col-xs-12\">\n\t\t<div class=\"progress\">\n\t\t\t<div class=\"progress-bar\" role=\"progressbar\" aria-valuenow={{itemValue(config.current_time)}} aria-valuemin=\"0\" aria-valuemax=\"{{itemValue(config.duration)}}\" style=\"width:{{(itemValue(config.current_time)*100)/itemValue(config.duration)}}%\">\n\t\t\t\t<span class=\"sr-only\">100% Complete</span>\n\t\t\t</div>\n\t\t</div> \n\t</div>\n</div>\n<div class=\"row\">\n\t<div class=\"col-xs-6\">\n\t\t<label class=\"btn btn-primary btn-lg btn-block btn-danger\" ng-if=\"itemValue(config.control) !='PLAY'\" ng-click=\"sendCmd(config.control, 'PLAY')\">\n\t\t\t<i class=\"glyphicon glyphicon-play glyphicon-text\"></i>\n\t\t</label>\n\t\t<label class=\"btn btn-primary btn-lg btn-block btn-danger\" ng-if=\"itemValue(config.control) =='PLAY'\" ng-click=\"sendCmd(config.control, 'PAUSE')\">\n\t\t\t<i class=\"glyphicon glyphicon-pause glyphicon-text\"></i>\n\t\t</label>\n \t</div>\n \t<div class=\"col-xs-6\"> \n\t\t<label class=\"btn btn-primary btn-lg btn-block btn-danger\" ng-click=\"sendCmd(config.playURI,config.backdrop_image)\">\n\t\t\t<i class=\"glyphicon glyphicon-stop glyphicon-text\"></i>\n\t\t</label> \n \t</div>\n</div>\n<div class=\"row\">\n\t<div class=\"col-xs-12\">\n\t\t<div ng-init=\"model={ name: 'My switch', item: (config.volume), hidelabel: 'true', hidepointer: 'true' }\">\n \t\t<widget-slider ng-model=\"model\"></widget-slider>\n\t\t</div>\t\n </div> \n</div>",
  1242. "author": "David C.",
  1243. "description": "Widget to Control Chromecast",
  1244. "name": "Chromecast Widget",
  1245. "settings": [
  1246. {
  1247. "type": "string",
  1248. "id": "widget_name",
  1249. "label": "Widget Name",
  1250. "description": "Name shown at the top of the widget",
  1251. "default": "Room"
  1252. },
  1253. {
  1254. "type": "string",
  1255. "id": "font",
  1256. "label": "Title Font",
  1257. "default": "38px"
  1258. },
  1259. {
  1260. "type": "color",
  1261. "id": "color",
  1262. "label": "Title Color",
  1263. "description": "Color Of the Title"
  1264. },
  1265. {
  1266. "type": "string",
  1267. "id": "default_image",
  1268. "label": "Default Image",
  1269. "description": "Image Shown when the widget is unable to retrieve a valid one",
  1270. "default": "https://www.openhab.org/assets/images/openhab-logo-square.png"
  1271. },
  1272. {
  1273. "type": "string",
  1274. "id": "backdrop_image",
  1275. "label": "Backdrop Image",
  1276. "default": "https://www.openhab.org/assets/images/openhab-logo-square.png",
  1277. "description": "Image sent to Chromecast to stop the playback"
  1278. },
  1279. {
  1280. "type": "item",
  1281. "id": "title",
  1282. "label": "Item: Title",
  1283. "description": "Name of the Item created for the property Title"
  1284. },
  1285. {
  1286. "type": "item",
  1287. "id": "seriesTitle",
  1288. "label": "Item: Series Title",
  1289. "description": "Name of the Item created for the property Series Title"
  1290. },
  1291. {
  1292. "type": "item",
  1293. "id": "image_url",
  1294. "label": "Item: Image URL",
  1295. "default": "",
  1296. "description": "Name of the Item Created for the Item Image URL."
  1297. },
  1298. {
  1299. "type": "item",
  1300. "id": "current_time",
  1301. "label": "Item: Current Time",
  1302. "description": "Name of the Item Created for the Item Current Time."
  1303. },
  1304. {
  1305. "type": "item",
  1306. "id": "duration",
  1307. "label": "Item: Duration",
  1308. "description": "Name of the Item Created for the Item Duration."
  1309. },
  1310. {
  1311. "type": "item",
  1312. "id": "control",
  1313. "label": "Item: Control",
  1314. "description": "Name of the Item Created for the Item Control."
  1315. },
  1316. {
  1317. "type": "item",
  1318. "id": "playURI",
  1319. "label": "Play URI",
  1320. "description": "Name of the Item Created for the Item PlayURI"
  1321. },
  1322. {
  1323. "type": "item",
  1324. "id": "volume",
  1325. "label": "Item: Volume",
  1326. "description": "Name of the Item Created for the Item Volume."
  1327. }
  1328. ]
  1329. }
  1330. }
  1331. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement