mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
Merge remote-tracking branch 'origin/master' into temperture
This commit is contained in:
93
assets/webconfig/i18n/bg.json
Normal file
93
assets/webconfig/i18n/bg.json
Normal file
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"conf_effect_path_intro": "Заредете ефекти от дефинираните пътища. Освен това можете да деактивирате отделни ефекти по име, за да ги скриете от всички списъци с ефекти.",
|
||||
"conf_general_impexp_expbtn": "Експортиране",
|
||||
"conf_general_impexp_impbtn": "Импортиране",
|
||||
"conf_general_impexp_l1": "Импортирайте конфигурация, като изберете конфигурационен файл по-долу и щракнете върху „Импортиране“.",
|
||||
"conf_general_impexp_l2": "Експортирайте конфигурация, като щракнете върху „Експортиране“. Вашият браузър започва изтегляне.",
|
||||
"conf_general_impexp_title": "Импортиране/Експортиране на Конфигурация",
|
||||
"conf_general_intro": "Основни настройки около Hyperion и WebUI, които не се вписват в друга категория.",
|
||||
"conf_general_label_title": "Общи настройки",
|
||||
"conf_helptable_expl": "Обяснение",
|
||||
"conf_helptable_option": "Опции",
|
||||
"conf_leds_layout_checkp1": "Черният светодиод е вашият първи светодиод, първият светодиод е точката, в която въвеждате вашия сигнал с данни.",
|
||||
"conf_leds_layout_checkp2": "Оформлението винаги е изгледът отпред на вашия телевизор, никога отзад.",
|
||||
"conf_leds_layout_checkp3": "Уверете се, че посоката е правилна. Сивите светодиоди показват светодиод номер 2 и 3 за визуализиране на посоката на данните.",
|
||||
"conf_leds_optgroup_network": "Мрежа",
|
||||
"dashboard_alert_message_confedit": "Вашата конфигурация на Hyperion е променена. За да го приложите, рестартирайте Hyperion.",
|
||||
"dashboard_alert_message_confedit_t": "Конфигурацията е променена",
|
||||
"dashboard_alert_message_confsave_success": "Вашата конфигурация на Hyperion е запазена успешно. Вашите промени вече са активни.",
|
||||
"dashboard_alert_message_confsave_success_t": "Конфигурацията е запаметена",
|
||||
"dashboard_alert_message_disabled": "Тази инстанция в момента е деактивирана! За да я използвате отново, активирайте я на таблото за управление.",
|
||||
"dashboard_alert_message_disabled_t": "ЛЕД хардуерна инстанция е деактивирана",
|
||||
"dashboard_componentbox_label_comp": "Компонент",
|
||||
"dashboard_componentbox_label_status": "Статус",
|
||||
"dashboard_componentbox_label_title": "Статус на компонентите",
|
||||
"dashboard_infobox_label_currenthyp": "Вашата версия на Hyperion:",
|
||||
"dashboard_infobox_label_instance": "Инстанция:",
|
||||
"dashboard_infobox_label_latesthyp": "Последната версия на Hyperion:",
|
||||
"dashboard_infobox_label_platform": "Платформа:",
|
||||
"dashboard_infobox_label_ports": "Портове",
|
||||
"dashboard_infobox_label_statush": "Hyperion статус:",
|
||||
"dashboard_infobox_label_title": "Информация",
|
||||
"dashboard_infobox_message_updatesuccess": "Вие използвате най-новата версия на Hyperion.",
|
||||
"dashboard_infobox_message_updatewarning": "Нова версия на Hyperion е налична! ($1)",
|
||||
"dashboard_newsbox_label_title": "Hyperion-Блог",
|
||||
"dashboard_newsbox_noconn": "Не можете да се свържете с Hyperion Server, за да извлечете най-новите публикации, вашата интернет връзка работи ли?",
|
||||
"dashboard_newsbox_readmore": "Прочети повече",
|
||||
"dashboard_newsbox_visitblog": "Посети Hyperion-Блог",
|
||||
"edt_conf_webc_port_title": "HTTP порт",
|
||||
"general_access_default": "По подразбиране",
|
||||
"general_btn_back": "Назад",
|
||||
"general_btn_cancel": "Откажи",
|
||||
"general_btn_continue": "Продължи",
|
||||
"general_btn_next": "Следващ",
|
||||
"general_btn_off": "Изключване",
|
||||
"general_btn_ok": "ОК",
|
||||
"general_btn_on": "Включване",
|
||||
"general_btn_restarthyperion": "Рестартирай Hyperion",
|
||||
"general_btn_save": "Запази",
|
||||
"general_btn_saveandreload": "Запази и презареди",
|
||||
"general_btn_yes": "Да",
|
||||
"general_button_savesettings": "Запази настройките",
|
||||
"general_col_blue": "синьо",
|
||||
"general_col_green": "зелено",
|
||||
"general_col_red": "червено",
|
||||
"general_comp_LEDDEVICE": "ЛЕД Изход",
|
||||
"general_country_de": "Германия",
|
||||
"general_country_es": "Испания",
|
||||
"general_country_fr": "Франция",
|
||||
"general_country_it": "Италия",
|
||||
"general_country_nl": "Холандия",
|
||||
"general_country_uk": "Англия",
|
||||
"general_country_us": "САЩ",
|
||||
"general_speech_cs": "Чешки",
|
||||
"general_speech_de": "Немски",
|
||||
"general_speech_en": "Английски",
|
||||
"general_speech_es": "Испански",
|
||||
"general_speech_he": "Иврит",
|
||||
"general_speech_id": "Индонезийски",
|
||||
"general_speech_it": "Италиански",
|
||||
"general_speech_uk": "Украински",
|
||||
"general_webui_title": "Hyperion - Уеб Конфигурация",
|
||||
"main_ledsim_btn_togglelednumber": "Брой ЛЕД",
|
||||
"main_ledsim_btn_toggleleds": "Показване на светодиоди",
|
||||
"main_ledsim_btn_togglelivevideo": "Видео на живо",
|
||||
"main_ledsim_text": "Визуализация на живо на LED цветове и по избор текущия видео поток на вашето устройство за прихващане.",
|
||||
"main_ledsim_title": "ЛЕД Визуализация",
|
||||
"main_menu_about_token": "Относно Hyperion",
|
||||
"main_menu_colors_conf_token": "Обработка на изображение",
|
||||
"main_menu_configuration_token": "ЛЕД Инстанции",
|
||||
"main_menu_dashboard_token": "Табло за управление",
|
||||
"main_menu_effect_conf_token": "Ефекти",
|
||||
"main_menu_effectsconfigurator_token": "Конфигуратор на ефекти",
|
||||
"main_menu_general_conf_token": "Общи",
|
||||
"main_menu_input_selection_token": "Ибор на вход",
|
||||
"main_menu_leds_conf_token": "ЛЕД Изход",
|
||||
"main_menu_logging_token": "Дневник",
|
||||
"main_menu_network_conf_token": "Мрежови услуги",
|
||||
"main_menu_remotecontrol_token": "Дистанционно управление",
|
||||
"main_menu_support_token": "Поддръжка",
|
||||
"main_menu_system_token": "Система",
|
||||
"main_menu_update_token": "Актуализация",
|
||||
"main_menu_webconfig_token": "Уеб конфигурация"
|
||||
}
|
@@ -360,7 +360,7 @@
|
||||
"edt_conf_enum_NTSC": "NTSC",
|
||||
"edt_conf_enum_PAL": "PAL",
|
||||
"edt_conf_enum_SECAM": "SECAM",
|
||||
"edt_conf_enum_VERTICAL": "Horizontal",
|
||||
"edt_conf_enum_VERTICAL": "Vertikal",
|
||||
"edt_conf_enum_action_idle": "Leerlauf",
|
||||
"edt_conf_enum_action_restart": "Neustart",
|
||||
"edt_conf_enum_action_resume": "Aktivieren",
|
||||
@@ -496,15 +496,12 @@
|
||||
"edt_conf_log_level_expl": "Abhängig der Stufe sind weniger oder mehr Meldungen sichtbar.",
|
||||
"edt_conf_log_level_title": "Protokollstufe",
|
||||
"edt_conf_net_apiAuth_expl": "Zwinge alle Anwendungen, welche die Hyperion API nutzen sich zu authentifizieren. Aktivieren für höhere Sicherheit, da nun jede neue Anwendung einmalig von dir bestätigt werden muss.",
|
||||
"edt_conf_net_apiAuth_title": "API-Authentifizierung",
|
||||
"edt_conf_net_heading_title": "Network",
|
||||
"edt_conf_net_internetAccessAPI_expl": "Erlaube Zugriff auf das Hyperion API/Webinterface über das Internet. Deaktiviere den Zugriff für höhere Sicherheit.",
|
||||
"edt_conf_net_internetAccessAPI_title": "Internet API-Zugriff",
|
||||
"edt_conf_net_ipWhitelist_expl": "Anstatt den Zugriff für alle Verbindungen aus dem Internet zu erlauben kannst du hier Ausnahmen für zugelassene IP-Adressen hinzufügen.",
|
||||
"edt_conf_net_ipWhitelist_title": "Erlaubte IP-Adressen",
|
||||
"edt_conf_net_ip_itemtitle": "IP",
|
||||
"edt_conf_net_localAdminAuth_expl": "Wenn aktiviert, muss der Administrationszugriff aus dem Heimnetzwerk mit einem Passwort authentifiziert werden.",
|
||||
"edt_conf_net_localAdminAuth_title": "Lokale Admin Authentifizierung",
|
||||
"edt_conf_net_localApiAuth_expl": "Wenn aktiviert, müssen Verbindungen aus dem Heimnetzwerk mit einem Token authentifiziert werden.",
|
||||
"edt_conf_net_localApiAuth_title": "Lokale API-Authentifizierung",
|
||||
"edt_conf_net_restirctedInternetAccessAPI_expl": "Den Zugriff auf die API über das Internet auf bestimmte IP-Adressen beschränken",
|
||||
@@ -513,7 +510,7 @@
|
||||
"edt_conf_os_events_lockEnable_title": "Reagiere auf Bildschirmsperre",
|
||||
"edt_conf_os_events_suspendEnable_expl": "Reagiere auf Ereignisse, die das Betriebssystem aussetzen/fortsetzen",
|
||||
"edt_conf_os_events_suspendEnable_title": "Reagiere auf Ruhezusstand",
|
||||
"edt_conf_os_events_suspendOnLockEnable_expl": "Wechsel in den Ruhezustand, wenn der Bildschirm gesperrt ist; andernfalls in den Leerlaufmodus wechseln",
|
||||
"edt_conf_os_events_suspendOnLockEnable_expl": "Wechsel in den Ruhezustand, wenn der Bildschirm gesperrt ist, andernfalls in den Leerlaufmodus wechseln",
|
||||
"edt_conf_os_events_suspendOnLockEnable_title": "Leerlauf, bei Bildschirmsperre",
|
||||
"edt_conf_pbs_heading_title": "Protocol Buffers Server",
|
||||
"edt_conf_pbs_timeout_expl": "Wenn für die angegebene Zeit keine Daten empfangen werden, wird die Komponente (vorübergehend) deaktiviert",
|
||||
@@ -560,7 +557,7 @@
|
||||
"edt_conf_v4l2_encoding_title": "Videokodierungsformat",
|
||||
"edt_conf_v4l2_flip_expl": "Hiermit kannst du das Bild in horizontaler, vertikaler oder in beide Richtungen spiegeln.",
|
||||
"edt_conf_v4l2_flip_title": "Spiegelung",
|
||||
"edt_conf_v4l2_fpsSoftwareDecimation_expl": "Jeder n-te Frame wird übersprungen um Ressourcen zu sparen.\nBeispiel: Ein Wert von 5 resultiert bei einem Aufnahmegerät mit 30fps in einer neuen Framerate von 6 fps.",
|
||||
"edt_conf_v4l2_fpsSoftwareDecimation_expl": "Um Ressourcen zu sparen, wird nur jedes n-te Bild verarbeitet. Wenn z.B. der Grabber auf 30fps eingestellt ist und diese Option auf 5 gesetzt ist, wird das Endergebnis ca. 6fps sein.",
|
||||
"edt_conf_v4l2_fpsSoftwareDecimation_title": "Überspringen von Frames",
|
||||
"edt_conf_v4l2_framerate_expl": "Die unterstützten Bilder pro Sekunde des aktiven Gerätes. Auf 'Automatisch' wird der gewählte Modus vom v4l interface beibehalten.",
|
||||
"edt_conf_v4l2_framerate_title": "Bilder pro Sekunde",
|
||||
@@ -758,7 +755,7 @@
|
||||
"edt_eff_colorHour": "Farbe Stunde",
|
||||
"edt_eff_colorMarker": "Marker Farbe",
|
||||
"edt_eff_colorMinute": "Farbe Minute",
|
||||
"edt_eff_colorSecond": "Farbe Sekunde",
|
||||
"edt_eff_colorSecond": "Farbe der Sekunden",
|
||||
"edt_eff_colorcount": "Farblänge",
|
||||
"edt_eff_colorend": "Farbe Ende",
|
||||
"edt_eff_colorendtime": "Zeit für Start-Farbe",
|
||||
@@ -1071,7 +1068,7 @@
|
||||
"remote_input_sourceactiv_btn": "Quelle aktiv",
|
||||
"remote_input_status": "Status/Aktion",
|
||||
"remote_losthint": "Hinweis: Alle Änderungen gehen nach einem Neustart verloren.",
|
||||
"remote_maptype_intro": "Für gewöhnlich entscheidet dein LED-Layout welcher Bildbereich welche LED zugewiesen bekommt, dies kann hier geändert werden. $1",
|
||||
"remote_maptype_intro": "Für gewöhnlich entscheidet dein LED-Layout welcher Bildbereich welche LED zugewiesen bekommt, dies kann hier geändert werden: $1",
|
||||
"remote_maptype_label": "LED-Bereich Zuordnung",
|
||||
"remote_maptype_label_dominant_color": "Dominante Farbe",
|
||||
"remote_maptype_label_dominant_color_advanced": "Dominante Farbe fortgeschritten",
|
||||
@@ -1096,7 +1093,6 @@
|
||||
"support_label_fbtext": "Teile Inhalte in Facebook und halte dich und andere auf dem Laufenden",
|
||||
"support_label_forumtext": "Diskussion und Hilfestellung von der Community",
|
||||
"support_label_forumtitle": "Forum",
|
||||
"support_label_ggtext": "Platziere uns in deinen Kreisen auf Google+",
|
||||
"support_label_ghtext": "Besuche uns auf GitHub",
|
||||
"support_label_igtext": "Schau doch mal bei Instagram vorbei!",
|
||||
"support_label_intro": "Hyperion ist ein kostenloses Open Source Projekt und ein kleines Team arbeitet an seiner Weiterentwicklung. Darum benötigen wir DEINE Unterstützung, um weiter in bessere Infrastruktur und Weiterentwicklung investieren zu können.",
|
||||
|
@@ -186,6 +186,7 @@
|
||||
"conf_network_json_intro": "The JSON-RPC-Port of all Hyperion instances, used for remote control.",
|
||||
"conf_network_net_intro": "Network related settings which are applied to all network services.",
|
||||
"conf_network_proto_intro": "The PROTO-Port of all Hyperion instances, used for picture streams (HyperionScreenCap, Kodi Addon, Android Hyperion Grabber, ...)",
|
||||
"conf_network_tok_idhead": "ID",
|
||||
"conf_network_tok_cidhead": "Description",
|
||||
"conf_network_tok_comment_title": "Token description",
|
||||
"conf_network_tok_desc": "Tokens grant other applications access to the Hyperion API, an application can request a token where you need to accept it or you create them on your own below. These tokens are just required when \"API Authorization\" is enabled in network settings.",
|
||||
@@ -457,13 +458,13 @@
|
||||
"edt_conf_fw_flat_expl": "One flatbuffer target per configuration item",
|
||||
"edt_conf_fw_flat_itemtitle": "flatbuffer target",
|
||||
"edt_conf_fw_flat_services_discovered_expl": "Hyperion servers discovered providing flatbuffer services",
|
||||
"edt_conf_fw_flat_services_discovered_title": "Flatbuffer targets discoverded",
|
||||
"edt_conf_fw_flat_services_discovered_title": "Flatbuffer targets discovered",
|
||||
"edt_conf_fw_flat_title": "List of flatbuffer targets",
|
||||
"edt_conf_fw_heading_title": "Forwarder",
|
||||
"edt_conf_fw_json_expl": "One JSON target per configuration item",
|
||||
"edt_conf_fw_json_itemtitle": "JSON target",
|
||||
"edt_conf_fw_json_services_discovered_expl": "Hyperion servers discovered providing JSON-API services",
|
||||
"edt_conf_fw_json_services_discovered_title": "JSON targets discoverded",
|
||||
"edt_conf_fw_json_services_discovered_title": "JSON targets discovered",
|
||||
"edt_conf_fw_json_title": "List of JSON targets",
|
||||
"edt_conf_fw_remote_service_discovered_none": "No remote services discovered",
|
||||
"edt_conf_fw_service_name_expl": "Name of the service provider",
|
||||
@@ -503,19 +504,16 @@
|
||||
"edt_conf_log_level_expl": "Depending on loglevel you see less or more messages in your log.",
|
||||
"edt_conf_log_level_title": "Log-Level",
|
||||
"edt_conf_net_apiAuth_expl": "Enforce all applications that use the Hyperion API to authenticate themself against Hyperion (Exception: see \"Local API Authentication\"). Higher security, as you control the access and revoke it at any time.",
|
||||
"edt_conf_net_apiAuth_title": "API Authentication",
|
||||
"edt_conf_net_heading_title": "Network",
|
||||
"edt_conf_net_internetAccessAPI_expl": "Allow access to the Hyperion API/Webinterface from the internet. Disable for higher security.",
|
||||
"edt_conf_net_internetAccessAPI_expl": "Allow access to the Hyperion API/Web Interface from the Internet. Disable for increased security.",
|
||||
"edt_conf_net_internetAccessAPI_title": "Internet API Access",
|
||||
"edt_conf_net_ipWhitelist_expl": "You can whitelist IP addresses instead allowing all connections from internet to connect to the Hyperion API/Webinterface.",
|
||||
"edt_conf_net_ipWhitelist_title": "Whitelisted IP's",
|
||||
"edt_conf_net_ipWhitelist_expl": "Define whitelisted IP addresses from which API requests from the Internet are allowed. All other external connections will be denied.",
|
||||
"edt_conf_net_ipWhitelist_title": "Whitelisted IP addresses",
|
||||
"edt_conf_net_ip_itemtitle": "IP",
|
||||
"edt_conf_net_localAdminAuth_expl": "When enabled, administration access from your local network needs a password.",
|
||||
"edt_conf_net_localAdminAuth_title": "Local Admin API Authentication",
|
||||
"edt_conf_net_localApiAuth_expl": "When enabled, connections from your home network needs to authenticate themselves against Hyperion with a token.",
|
||||
"edt_conf_net_localApiAuth_expl": "When disabled, API authorisation via password or token is not required for local connections. The exception is administrative commands.",
|
||||
"edt_conf_net_localApiAuth_title": "Local API Authentication",
|
||||
"edt_conf_net_restirctedInternetAccessAPI_expl": "You can restrict the access to the API through the internet to certain IP's.",
|
||||
"edt_conf_net_restirctedInternetAccessAPI_title": "Restrict to IP's",
|
||||
"edt_conf_net_restirctedInternetAccessAPI_expl": "You can restrict API requests over the Internet to only those IP addresses on the whitelist.",
|
||||
"edt_conf_net_restirctedInternetAccessAPI_title": "Restrict to IP addresses",
|
||||
"edt_conf_os_events_lockEnable_title": "Listen to lock events",
|
||||
"edt_conf_os_events_lockEnable_expl": "Listen to screen lock/unlock events",
|
||||
"edt_conf_os_events_suspendEnable_title": "Listen to suspend events",
|
||||
@@ -764,17 +762,17 @@
|
||||
"edt_eff_collision_header": "color collision",
|
||||
"edt_eff_collision_header_desc": "Two color projectiles are sent from random positions and collide with each other",
|
||||
"edt_eff_color": "Color",
|
||||
"edt_eff_colorHour": "Color hour",
|
||||
"edt_eff_colorHour": "Color hours",
|
||||
"edt_eff_colorMarker": "Marker color",
|
||||
"edt_eff_colorMinute": "Color minute",
|
||||
"edt_eff_colorSecond": "Color second",
|
||||
"edt_eff_colorMinute": "Color minutes",
|
||||
"edt_eff_colorSecond": "Color seconds",
|
||||
"edt_eff_colorcount": "Color length",
|
||||
"edt_eff_colorend": "Color end",
|
||||
"edt_eff_colorendtime": "Time to hold start color",
|
||||
"edt_eff_colorevel": "Color level",
|
||||
"edt_eff_colorone": "Color one",
|
||||
"edt_eff_colorrandom": "Random color",
|
||||
"edt_eff_colorshift": "Color Shift",
|
||||
"edt_eff_colorshift": "Color shift",
|
||||
"edt_eff_colorstart": "Color start",
|
||||
"edt_eff_colorstarttime": "Time to hold end color",
|
||||
"edt_eff_colortwo": "Color two",
|
||||
@@ -846,7 +844,7 @@
|
||||
"edt_eff_reversedirection": "Reverse direction",
|
||||
"edt_eff_rotationtime": "Rotation time",
|
||||
"edt_eff_saturation": "Saturation",
|
||||
"edt_eff_set_post_color": "Set post color after alam",
|
||||
"edt_eff_set_post_color": "Set post color after alarm",
|
||||
"edt_eff_showseconds": "Show seconds",
|
||||
"edt_eff_sleeptime": "Sleep time",
|
||||
"edt_eff_smooth_custom": "Enable smoothing",
|
||||
@@ -974,6 +972,7 @@
|
||||
"general_country_us": "United States",
|
||||
"general_disabled": "disabled",
|
||||
"general_enabled": "enabled",
|
||||
"general_speech_bg": "Bulgarian",
|
||||
"general_speech_ca": "Catalan",
|
||||
"general_speech_cs": "Czech",
|
||||
"general_speech_da": "Danish",
|
||||
@@ -1101,7 +1100,6 @@
|
||||
"support_label_fbtext": "Share our Hyperion Facebook page and get a notice when new updates are released",
|
||||
"support_label_forumtext": "Showcases, discussions, help and more",
|
||||
"support_label_forumtitle": "Forum",
|
||||
"support_label_ggtext": "Circle us on Google +!",
|
||||
"support_label_ghtext": "Visit us on GitHub",
|
||||
"support_label_igtext": "Visit us on Instagram to watch the latest Hyperion pictures!",
|
||||
"support_label_intro": "Hyperion is a free, non-profit software. A small team is working on it and this is why we need your steady support.",
|
||||
@@ -1123,7 +1121,7 @@
|
||||
"update_no_updates_for_branch": "No updates for selected version channel.",
|
||||
"update_versreminder": "Your version: $1",
|
||||
"wiz_atmoorb_desc2": "Now choose which Orbs should be added. The position assigns the lamp to a specific position on your \"picture\". Disabled lamps won't be added. To identify single lamps press the button on the right.",
|
||||
"wiz_atmoorb_intro1": "This wizards configures Hyperion for AtmoOrbs. Features are the AtmoOrb auto detection, setting each light to a specific position on your picture or disable it and optimise the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
|
||||
"wiz_atmoorb_intro1": "This wizard configures Hyperion for AtmoOrbs. Features are the AtmoOrb auto detection, setting each light to a specific position on your picture or disable it and optimise the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
|
||||
"wiz_atmoorb_title": "AtmoOrb Wizard",
|
||||
"wiz_cc_adjustgamma": "Gamma: What you have to do is, adjust gamma levels of each channel until you have the same perceived amount of each channel. Hint: Neutral is 1.0! For example, if your Grey is a bit reddish it means that you have to increase red gamma to reduce the amount of red (the more gamma, the less amount of color).",
|
||||
"wiz_cc_adjustit": "Adjust your \"$1\", until your are fine with it. Take notice: The more you adjust away from the default value the color spectrum will be limited (Also for all colors in between). Depending on TV/LED color spectrum the results will vary.",
|
||||
@@ -1148,7 +1146,7 @@
|
||||
"wiz_cc_testintrowok": "Check out the following link to download test videos:",
|
||||
"wiz_cc_title": "Colour calibration wizard",
|
||||
"wiz_cololight_desc2": "Now choose which Cololights should be added. To identify single lights, press the button on the right.",
|
||||
"wiz_cololight_intro1": "This wizards configures Hyperion for the Cololight system. Features are the Cololight auto detection and tune the Hyperion settings automatically! In short: All you need are some clicks and you are done!<br />Note: In case of Cololight Strip, you might need to manually correct the LED count and layout.",
|
||||
"wiz_cololight_intro1": "This wizard configures Hyperion for the Cololight system. Features are the Cololight auto detection and tune the Hyperion settings automatically! In short: All you need are some clicks and you are done!<br />Note: In case of Cololight Strip, you might need to manually correct the LED count and layout.",
|
||||
"wiz_cololight_noprops": "Not able to get device properties - Define Hardware LED count manually",
|
||||
"wiz_cololight_title": "Cololight Wizard",
|
||||
"wiz_guideyou": "The $1 will guide you through the settings. Just press the button!",
|
||||
@@ -1162,7 +1160,7 @@
|
||||
"wiz_hue_e_desc1": "1. Hyperion searches automatically for a Hue-Bridge, in case it cannot find one you need to provide the hostname or IP-address and push the reload button. <br> 2. Provide a user id and the clientkey, if you do not have both, create new ones.",
|
||||
"wiz_hue_e_desc2": "3. Choose your entertainment group, which has all your lights inside for use with Hyperion.",
|
||||
"wiz_hue_e_desc3": "4. Choose in which position the respective lamp should be \"in the picture\". A preselection of the position was made based on the configured positions of the lights in the entertainment group. This is just a recommendation and can be customized as desired. You can therefore highlight them briefly by clicking on the right button to improve the selection.",
|
||||
"wiz_hue_e_intro1": "This wizards configures Hyperion for the well known Philips Hue Entertainment system. Features are: Hue Bridge auto detection, user and clientkey creation, entertainment group selection, setting group lights to a specific position on your picture and optimise the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
|
||||
"wiz_hue_e_intro1": "This wizard configures Hyperion for the well known Philips Hue Entertainment system. Features are: Hue Bridge auto detection, user and clientkey creation, entertainment group selection, setting group lights to a specific position on your picture and optimise the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
|
||||
"wiz_hue_e_noapisupport": "The Wizard has disabled entertainment API support and will continue in classic mode.",
|
||||
"wiz_hue_e_noapisupport_hint": "The option \"<b>Use Hue Entertainment API</b>\" was unchecked.",
|
||||
"wiz_hue_e_noegrpids": "No entertainment groups in this Hue bridge defined.",
|
||||
@@ -1173,7 +1171,7 @@
|
||||
"wiz_hue_failure_connection": "Timeout: Please press the bridge button within the period of 30 seconds",
|
||||
"wiz_hue_failure_ip": "No Bridge found, please provide a valid hostname or IP-address",
|
||||
"wiz_hue_failure_user": "User not found, create a new one with the button below or input a valid user id and press the \"reload\" symbol.",
|
||||
"wiz_hue_intro1": "This wizards configures Hyperion for the well known Philips Hue system. Features are Hue Bridge auto detection, user creation, set each hue light to a specific position on your picture or disable it and tune the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
|
||||
"wiz_hue_intro1": "This wizard configures Hyperion for the well known Philips Hue system. Features are Hue Bridge auto detection, user creation, set each hue light to a specific position on your picture or disable it and tune the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
|
||||
"wiz_hue_ip": "Hostname or IP",
|
||||
"wiz_hue_noids": "This Hue bridge has no bulbs/stripes, please pair them before with the Hue Apps",
|
||||
"wiz_hue_press_link": "Please press link button on the Hue Bridge.",
|
||||
@@ -1205,7 +1203,7 @@
|
||||
"wiz_cc_try_connect": "Connecting...",
|
||||
"wiz_wizavail": "Wizard available",
|
||||
"wiz_yeelight_desc2": "Now choose which lamps should be added. The position assigns the lamp to a specific position on your \"picture\". Disabled lamps won't be added. To identify single lamps press the button on the right.",
|
||||
"wiz_yeelight_intro1": "This wizards configures Hyperion for the Yeelight system. Features are the Yeelighs' auto detection, setting each light to a specific position on your picture or disable it and tune the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
|
||||
"wiz_yeelight_intro1": "This wizard configures Hyperion for the Yeelight system. Features are the Yeelights' auto detection, setting each light to a specific position on your picture or disable it and tune the Hyperion settings automatically! So in short: All you need are some clicks and you are done!",
|
||||
"wiz_yeelight_title": "Yeelight Wizard",
|
||||
"wiz_yeelight_unsupported": "Unsupported"
|
||||
}
|
||||
|
@@ -22,6 +22,8 @@
|
||||
"about_resources": "$1 librerías",
|
||||
"about_translations": "Traducciones",
|
||||
"about_version": "Versión",
|
||||
"conf_cec_events_heading_title": "Eventos CEC",
|
||||
"conf_cec_events_intro": "Ajustes relacionados con los diferentes eventos del protocolo CEC (Consumer Electronics Control) que Hyperion puede gestionar",
|
||||
"conf_colors_blackborder_intro": "Omite bordes negros dondequiera que estén. Cada modo usa otro algoritmo de detección que está ajustado para situaciones especiales. Sube el umbral si no percibes funcionamiento.",
|
||||
"conf_colors_color_intro": "Crea uno o más perfiles de calibración, ajusta cada color, brillo, linealización y más.",
|
||||
"conf_colors_smoothing_intro": "El suavizado aplana los cambios de color/brillo para reducir la distracción molesta.",
|
||||
@@ -82,6 +84,8 @@
|
||||
"conf_leds_layout_cl_bottomright": "Inferior Derecha (Esquina)",
|
||||
"conf_leds_layout_cl_cornergap": "Hueco de esquina",
|
||||
"conf_leds_layout_cl_edgegap": "Hueco de borde",
|
||||
"conf_leds_layout_cl_entertainment": "Área de Entretenimiento",
|
||||
"conf_leds_layout_cl_entertainment_center": "Centro del Área de Entretenimiento",
|
||||
"conf_leds_layout_cl_gaglength": "Longitud de hueco",
|
||||
"conf_leds_layout_cl_gappos": "Posición del hueco",
|
||||
"conf_leds_layout_cl_hleddepth": "Profundidad LED Horizontal",
|
||||
@@ -111,7 +115,13 @@
|
||||
"conf_leds_layout_cl_topright": "Superior Derecha (Esquina)",
|
||||
"conf_leds_layout_cl_vleddepth": "Profundidad LED vertical",
|
||||
"conf_leds_layout_frame": "Disposición Clásica (Marco LED)",
|
||||
"conf_leds_layout_gapbottom": "Hueco Inferior",
|
||||
"conf_leds_layout_gapleft": "Hueco izquierdo",
|
||||
"conf_leds_layout_gapright": "Hueco derecho",
|
||||
"conf_leds_layout_gaptop": "Hueco superior",
|
||||
"conf_leds_layout_generatedconf": "Configuración LED Generada/Actual",
|
||||
"conf_leds_layout_generation_error": "Trazado de LED no generado",
|
||||
"conf_leds_layout_generation_success": "Trazado de LED generado correctamente",
|
||||
"conf_leds_layout_intro": "Necesitas también un diseño led, que refleje tus posiciones led. La disposición clásica es el marco generalmente usado de la TV, pero también apoyamos la creación de matriz led (paredes led). La vista en esta disposición es SIEMPRE del FRENTE de tu TV.",
|
||||
"conf_leds_layout_ma_cabling": "Cableado",
|
||||
"conf_leds_layout_ma_direction": "Dirección",
|
||||
@@ -184,6 +194,10 @@
|
||||
"conf_network_tok_intro": "Aquí puedes crear y eliminar Tokens para la autenticación de la API. Los Tokens creados sólo se mostrarán una vez.",
|
||||
"conf_network_tok_lastuse": "Último uso",
|
||||
"conf_network_tok_title": "Gestión de Tokens",
|
||||
"conf_os_events_heading_title": "Eventos del sistema operativo",
|
||||
"conf_os_events_intro": "Ajustes relacionados con diferentes eventos del sistema operativo que Hyperion puede gestionar",
|
||||
"conf_sched_events_heading_title": "Eventos programados",
|
||||
"conf_sched_events_intro": "Ajustes relacionados con eventos programados, es decir, basados en el tiempo, que Hyperion gestionará",
|
||||
"conf_webconfig_label_intro": "Ajustes de configuración web. Editar sabiamente.",
|
||||
"dashboard_active_instance": "Instalación seleccionada",
|
||||
"dashboard_alert_message_confedit": "Se ha modificado la configuración de Hyperion. Para aplicarlo, reinicia Hyperion.",
|
||||
@@ -235,6 +249,9 @@
|
||||
"edt_append_pixel": "Píxel",
|
||||
"edt_append_s": "s",
|
||||
"edt_append_sdegree": "s/grado",
|
||||
"edt_conf_action_expl": "Acción a ser aplicada",
|
||||
"edt_conf_action_record_validation_error": "Un mismo evento sólo puede desencadenar una acción. Limpiar Acciones $1",
|
||||
"edt_conf_action_title": "Acción",
|
||||
"edt_conf_audio_device_expl": "Dispositivo de entrada de audio seleccionado",
|
||||
"edt_conf_audio_device_title": "Dispositivo de Audio",
|
||||
"edt_conf_audio_effect_enum_vumeter": "Medidor-UV",
|
||||
@@ -271,6 +288,17 @@
|
||||
"edt_conf_bb_unknownFrameCnt_title": "Fotogramas desconocidos",
|
||||
"edt_conf_bge_heading_title": "Efecto/color de fondo",
|
||||
"edt_conf_bobls_heading_title": "Servidor Boblight",
|
||||
"edt_conf_cec_actions_header_expl": "Definir qué acción debe llevarse a cabo en un acontecimiento CEC reconocido",
|
||||
"edt_conf_cec_actions_header_item_title": "Acción",
|
||||
"edt_conf_cec_actions_header_title": "Acciones",
|
||||
"edt_conf_cec_button_release_delay_ms_expl": "Tiempo de liberación del botón remoto",
|
||||
"edt_conf_cec_button_release_delay_ms_title": "Tiempo de liberación del botón",
|
||||
"edt_conf_cec_button_repeat_rate_ms_expl": "Tasa de repetición de botones remotos",
|
||||
"edt_conf_cec_button_repeat_rate_ms_title": "Tasa de repetición de botones",
|
||||
"edt_conf_cec_double_tap_timeout_ms_expl": "Retardo de pulsación de botón remoto antes de repetir",
|
||||
"edt_conf_cec_double_tap_timeout_ms_title": "Retardo del botón antes de repetir",
|
||||
"edt_conf_cec_event_expl": "Evento CEC que desencadenará una acción",
|
||||
"edt_conf_cec_event_title": "Evento CEC",
|
||||
"edt_conf_color_accuracyLevel_expl": "Nivel de precisión con el que se evalúan los colores dominantes. Un nivel más alto crea resultados más precisos, pero también requiere más potencia de procesamiento. Debe combinarse con un procesamiento de píxeles reducido.",
|
||||
"edt_conf_color_accuracyLevel_title": "Nivel de precisión",
|
||||
"edt_conf_color_backlightColored_expl": "Añade un poco de color a tu retroiluminación.",
|
||||
@@ -333,6 +361,13 @@
|
||||
"edt_conf_enum_PAL": "PAL",
|
||||
"edt_conf_enum_SECAM": "SECAM",
|
||||
"edt_conf_enum_VERTICAL": "Vertical",
|
||||
"edt_conf_enum_action_idle": "Inactivo",
|
||||
"edt_conf_enum_action_restart": "Reiniciar",
|
||||
"edt_conf_enum_action_resume": "Reanudar",
|
||||
"edt_conf_enum_action_resumeIdle": "Reanudar Inactividad",
|
||||
"edt_conf_enum_action_suspend": "Suspender",
|
||||
"edt_conf_enum_action_toggleIdle": "Alternar Inactividad",
|
||||
"edt_conf_enum_action_toggleSuspend": "Alternar Suspension",
|
||||
"edt_conf_enum_automatic": "Automático",
|
||||
"edt_conf_enum_bbclassic": "Clásico",
|
||||
"edt_conf_enum_bbdefault": "Predeterminado",
|
||||
@@ -341,6 +376,12 @@
|
||||
"edt_conf_enum_bgr": "BGR",
|
||||
"edt_conf_enum_bottom_up": "De abajo a arriba",
|
||||
"edt_conf_enum_brg": "BRG",
|
||||
"edt_conf_enum_cec_key_f1_blue": "Botón azul pulsado",
|
||||
"edt_conf_enum_cec_key_f2_red": "Botón rojo pulsado",
|
||||
"edt_conf_enum_cec_key_f3_green": "Botón verde pulsado",
|
||||
"edt_conf_enum_cec_key_f4_yellow": "Botón amarillo pulsado",
|
||||
"edt_conf_enum_cec_opcode_set stream path": "TV encendida",
|
||||
"edt_conf_enum_cec_opcode_standby": "TV apagada",
|
||||
"edt_conf_enum_color": "Color",
|
||||
"edt_conf_enum_custom": "Personalizado",
|
||||
"edt_conf_enum_decay": "Degradación",
|
||||
@@ -455,22 +496,28 @@
|
||||
"edt_conf_log_level_expl": "Dependiendo del nivel de registro verás menos o más mensajes en tu registro.",
|
||||
"edt_conf_log_level_title": "Nivel de registro",
|
||||
"edt_conf_net_apiAuth_expl": "Imponer a todas las aplicaciones que utilizan la API de Hyperion a autenticarse contra Hyperion (Excepción: \"Autenticación de la API local\"). Mayor seguridad, ya que se controla el acceso y se revoca en cualquier momento.",
|
||||
"edt_conf_net_apiAuth_title": "Autenticación de API",
|
||||
"edt_conf_net_heading_title": "Red",
|
||||
"edt_conf_net_internetAccessAPI_expl": "Permite el acceso a la API/interfaz web de Hyperion desde Internet, desactivado para mayor seguridad.",
|
||||
"edt_conf_net_internetAccessAPI_title": "Acceso a la API de Internet",
|
||||
"edt_conf_net_ipWhitelist_expl": "Puedes hacer una lista blanca de direcciones IP en vez de permitir que todas las conexiones de internet se conecten a la API/Webinterface de Hyperion.",
|
||||
"edt_conf_net_ipWhitelist_title": "IPs de la lista blanca",
|
||||
"edt_conf_net_ip_itemtitle": "IP",
|
||||
"edt_conf_net_localAdminAuth_expl": "Cuando está habilitado, el acceso de administración desde tu red local necesita una contraseña.",
|
||||
"edt_conf_net_localAdminAuth_title": "Autenticación de la API de administración local",
|
||||
"edt_conf_net_localApiAuth_expl": "Cuando está habilitado, las conexiones de tu red doméstica también necesitan autenticarse contra Hyperion.",
|
||||
"edt_conf_net_localApiAuth_title": "Autenticación de API local",
|
||||
"edt_conf_net_restirctedInternetAccessAPI_expl": "Puedes restringir el acceso a la API a través de Internet a determinadas IP.",
|
||||
"edt_conf_net_restirctedInternetAccessAPI_title": "Restringir a las IP",
|
||||
"edt_conf_os_events_lockEnable_expl": "Escuchar eventos de bloqueo/desbloqueo",
|
||||
"edt_conf_os_events_lockEnable_title": "Escuchar eventos de bloqueo",
|
||||
"edt_conf_os_events_suspendEnable_expl": "Escuchar eventos de suspension/resumen del sistema operativo",
|
||||
"edt_conf_os_events_suspendEnable_title": "Escuchar eventos de suspensión",
|
||||
"edt_conf_os_events_suspendOnLockEnable_expl": "Suspender cuando la pantalla está bloqueada, de lo contrario pasa al modo inactivo",
|
||||
"edt_conf_os_events_suspendOnLockEnable_title": "Suspender cuando esté bloqueado",
|
||||
"edt_conf_pbs_heading_title": "Servidor de Buffers de Protocolo",
|
||||
"edt_conf_pbs_timeout_expl": "Si no se reciben datos para el período dado, el componente se desactivará (suavemente).",
|
||||
"edt_conf_pbs_timeout_title": "Tiempo de espera",
|
||||
"edt_conf_sched_actions_header_expl": "Defina qué acción debe tener lugar en un momento determinado. La acción se programará diariamente.",
|
||||
"edt_conf_sched_actions_header_item_title": "Acción",
|
||||
"edt_conf_sched_actions_header_title": "Acciones",
|
||||
"edt_conf_smooth_continuousOutput_expl": "Actualizar los LED incluso si no hay cambio de imagen.",
|
||||
"edt_conf_smooth_continuousOutput_title": "Salida continua",
|
||||
"edt_conf_smooth_decay_expl": "La velocidad de degradación. 1 es lineal, los valores mayores tienen un efecto más fuerte.",
|
||||
@@ -488,6 +535,8 @@
|
||||
"edt_conf_smooth_updateDelay_title": "Retardo de actualización",
|
||||
"edt_conf_smooth_updateFrequency_expl": "La velocidad de salida a tu controlador led.",
|
||||
"edt_conf_smooth_updateFrequency_title": "Frecuencia de actualización",
|
||||
"edt_conf_time_event_expl": "Momento que desencadenará una acción",
|
||||
"edt_conf_time_event_title": "Tiempo",
|
||||
"edt_conf_v4l2_blueSignalThreshold_expl": "Oscurece los valores bajos de color azul (reconocidos como negros)",
|
||||
"edt_conf_v4l2_blueSignalThreshold_title": "Umbral de señal azul",
|
||||
"edt_conf_v4l2_cecDetection_expl": "Si está activado, la captura USB se desactivará temporalmente cuando el evento de espera de CEC se reciba desde el bus HDMI.",
|
||||
@@ -560,6 +609,8 @@
|
||||
"edt_conf_webc_port_title": "Puerto HTTP",
|
||||
"edt_conf_webc_sslport_expl": "Puerto del servidor web HTTPS",
|
||||
"edt_conf_webc_sslport_title": "Puerto HTTPS",
|
||||
"edt_dev_auth_key_title": "Token de Autorización",
|
||||
"edt_dev_auth_key_title_info": "Token de Autorización requerido para acceder al dispositivo",
|
||||
"edt_dev_enum_sub_min_cool_adjust": "Min. Ajuste fresco",
|
||||
"edt_dev_enum_sub_min_warm_adjust": "Min. Ajuste caliente",
|
||||
"edt_dev_enum_subtract_minimum": "Restar el mínimo",
|
||||
@@ -677,6 +728,7 @@
|
||||
"edt_dev_spec_transistionTime_title": "Tiempo de transición",
|
||||
"edt_dev_spec_uid_title": "UID",
|
||||
"edt_dev_spec_universe_title": "Universo",
|
||||
"edt_dev_spec_useAPIv2_title": "Usar API v2",
|
||||
"edt_dev_spec_useEntertainmentAPI_title": "Usar la API de entretenimiento de Hue",
|
||||
"edt_dev_spec_useOrbSmoothing_title": "Utilizar suavizado de orbe",
|
||||
"edt_dev_spec_useRgbwProtocol_title": "Utilizar el protocolo RGBW",
|
||||
@@ -748,6 +800,8 @@
|
||||
"edt_eff_ledlist": "Lista Led",
|
||||
"edt_eff_ledtest_header": "Prueba de Led",
|
||||
"edt_eff_ledtest_header_desc": "Salida giratoria: Rojo, Azul, Verde, Blanco, Negro",
|
||||
"edt_eff_ledtest_seq_header": "Test LED - Secuencia",
|
||||
"edt_eff_ledtest_seq_header_desc": "Encender los LED en secuencia",
|
||||
"edt_eff_length": "Longitud",
|
||||
"edt_eff_lightclock_header": "Reloj de luz",
|
||||
"edt_eff_lightclock_header_desc": "¡Un verdadero reloj como la luz! Ajustar los colores de las horas, los minutos, los segundos. También hay disponible un marcador opcional de 3/6/9/12 en punto. En caso de que el reloj esté equivocado, debes revisar el reloj de tu sistema.",
|
||||
@@ -916,7 +970,9 @@
|
||||
"general_speech_en": "Inglés",
|
||||
"general_speech_es": "Español",
|
||||
"general_speech_fr": "Francés",
|
||||
"general_speech_he": "Hebreo",
|
||||
"general_speech_hu": "Húngaro",
|
||||
"general_speech_id": "Indonesio",
|
||||
"general_speech_it": "Italiano",
|
||||
"general_speech_ja": "Japonés",
|
||||
"general_speech_nb": "Noruego (Bokmål)",
|
||||
@@ -927,6 +983,7 @@
|
||||
"general_speech_ru": "Ruso",
|
||||
"general_speech_sv": "Sueco",
|
||||
"general_speech_tr": "Turco",
|
||||
"general_speech_uk": "Ucraniano",
|
||||
"general_speech_vi": "Vietnamita",
|
||||
"general_speech_zh-CN": "Chino (simplificado)",
|
||||
"general_webui_title": "Hyperion - Configuración Web",
|
||||
@@ -974,6 +1031,8 @@
|
||||
"main_menu_dashboard_token": "Cuadro de mandos",
|
||||
"main_menu_effect_conf_token": "Efectos",
|
||||
"main_menu_effectsconfigurator_token": "Configurador de Efectos",
|
||||
"main_menu_event_services_token": "Servicios de Evento",
|
||||
"main_menu_events": "Servicios de Evento",
|
||||
"main_menu_general_conf_token": "General",
|
||||
"main_menu_grabber_conf_token": "Hardware de Captura",
|
||||
"main_menu_input_selection_token": "Selección de entrada",
|
||||
@@ -1034,7 +1093,6 @@
|
||||
"support_label_fbtext": "Comparte nuestra página de Hyperion en Facebook y obten un aviso cuando se publiquen nuevas actualizaciones",
|
||||
"support_label_forumtext": "Casos de ejemplo, discusiones, ayuda y mucho más",
|
||||
"support_label_forumtitle": "Foro",
|
||||
"support_label_ggtext": "¡Haznos un círculo en Google+!",
|
||||
"support_label_ghtext": "Visitanos en Github",
|
||||
"support_label_igtext": "¡Visítanos en Instagram para ver las últimas imágenes de Hyperion!",
|
||||
"support_label_intro": "Hyperion es un software libre sin fines de lucro. Un pequeño equipo está trabajando en ello y es por eso que necesitamos tu apoyo constante.",
|
||||
@@ -1086,6 +1144,7 @@
|
||||
"wiz_cololight_noprops": "Imposible obtener las propiedades del dispositivo - Define el conteo de LEDs de hardware manualmente",
|
||||
"wiz_cololight_title": "Asistente Cololight",
|
||||
"wiz_guideyou": "El $1 te guiará a través de los ajustes. Simplemente ¡presiona el botón!",
|
||||
"wiz_hue_blinkblue": "Deja que se ilumine",
|
||||
"wiz_hue_clientkey": "Llave de cliente:",
|
||||
"wiz_hue_create_user": "Crear Usuario",
|
||||
"wiz_hue_desc1": "1. Busca automáticamente un puente Hue, en caso de que no encuentre uno necesitas proporcionar la dirección IP y pulsar el botón de recarga a la derecha. Ahora necesitas una identificación de usuario, si no tienes una, crea una nueva.",
|
||||
@@ -1118,6 +1177,13 @@
|
||||
"wiz_identify_tip": "Identificar el dispositivo configurado iluminándolo",
|
||||
"wiz_ids_disabled": "Desactivado",
|
||||
"wiz_ids_entire": "Toda la imagen",
|
||||
"wiz_layout": "Generar Trazado",
|
||||
"wiz_layout_tip": "Generar un diseño para el dispositivo configurado",
|
||||
"wiz_nanoleaf_failure_auth_token": "Pulse el botón de encendido/apagado de Nanoleaf antes de 30 segundos.",
|
||||
"wiz_nanoleaf_failure_auth_token_t": "Tiempo de espera de generación de token de autorización de usuario",
|
||||
"wiz_nanoleaf_press_onoff_button": "Pulsa el botón de encendido/apagado de su dispositivo Nanoleaf durante 5-7 segundos",
|
||||
"wiz_nanoleaf_user_auth_intro": "El asistente ayuda a generar un token de autorización de usuario necesario para que Hyperion pueda acceder al dispositivo.",
|
||||
"wiz_nanoleaf_user_auth_title": "Asistente para generar tokens de autorización",
|
||||
"wiz_noLights": "¡No se encontró $1! Por favor, conecta las luces a la red o configúralas manualmente.",
|
||||
"wiz_pos": "Posición/Estado",
|
||||
"wiz_rgb_expl": "El punto de color cambia cada x segundos el color (rojo, verde), al mismo tiempo que tus leds cambian el color también. Responde las preguntas en la parte inferior para verificar/corregir tu orden de bytes.",
|
||||
|
@@ -191,6 +191,7 @@
|
||||
"conf_network_tok_diaTitle": "Ny nyckel skapad!",
|
||||
"conf_network_tok_grantMsg": "En app begär åtkomst till Hyperion API via en nyckel. Vill du tillåta detta? Vänligen kontrollera informationen!",
|
||||
"conf_network_tok_grantT": "App-nyckel begärd",
|
||||
"conf_network_tok_idhead": "ID",
|
||||
"conf_network_tok_intro": "Här kan du skapa eller ta bort nycklar för API-autentisering. Nyskapade nycklar visas en gång.",
|
||||
"conf_network_tok_lastuse": "Senast använd",
|
||||
"conf_network_tok_title": "Nyckelhantering",
|
||||
@@ -496,15 +497,12 @@
|
||||
"edt_conf_log_level_expl": "Beroende på nivå är färre eller fler meddelanden synliga.",
|
||||
"edt_conf_log_level_title": "Loggnivå",
|
||||
"edt_conf_net_apiAuth_expl": "Tvinga alla applikationer som använder Hyperion API att autentisera sig själva. Aktivera för högre säkerhet, eftersom varje ny ansökan nu måste bekräftas av dig en gång.",
|
||||
"edt_conf_net_apiAuth_title": "API-autentisering",
|
||||
"edt_conf_net_heading_title": "Nätverk",
|
||||
"edt_conf_net_internetAccessAPI_expl": "Tillåt åtkomst till Hyperion API/webbgränssnitt över Internet. Inaktivera åtkomst för ökad säkerhet.",
|
||||
"edt_conf_net_internetAccessAPI_title": "Internet API-åtkomst",
|
||||
"edt_conf_net_ipWhitelist_expl": "Istället för att tillåta åtkomst för alla anslutningar från internet kan du lägga till undantag för tillåtna IP-adresser här.",
|
||||
"edt_conf_net_ipWhitelist_title": "Tillåtna IP-adresser",
|
||||
"edt_conf_net_ip_itemtitle": "IP",
|
||||
"edt_conf_net_localAdminAuth_expl": "Om den är aktiverad måste administrationsåtkomst från hemnätverket autentiseras med ett lösenord.",
|
||||
"edt_conf_net_localAdminAuth_title": "Lokal administratörsautentisering",
|
||||
"edt_conf_net_localApiAuth_expl": "Om den är aktiverad måste anslutningar från hemnätverket autentiseras med en nyckel.",
|
||||
"edt_conf_net_localApiAuth_title": "Lokal API-autentisering",
|
||||
"edt_conf_net_restirctedInternetAccessAPI_expl": "Begränsa åtkomsten till API:t över internet till specifika IP-adresser",
|
||||
@@ -1096,7 +1094,6 @@
|
||||
"support_label_fbtext": "Dela innehåll på Facebook och håll dig själv och andra uppdaterade",
|
||||
"support_label_forumtext": "Diskussion och hjälp från samhället",
|
||||
"support_label_forumtitle": "Forum",
|
||||
"support_label_ggtext": "Placera oss i dina cirklar på Google+",
|
||||
"support_label_ghtext": "Besök oss på GitHub",
|
||||
"support_label_igtext": "Ta en titt på Instagram!",
|
||||
"support_label_intro": "Hyperion är ett gratis projekt med öppen källkod och ett litet team arbetar med vidareutvecklingen. Det är därför vi behöver DITT stöd för att fortsätta investera i bättre infrastruktur och vidareutveckling.",
|
||||
|
@@ -1,52 +0,0 @@
|
||||
$(document).ready( function() {
|
||||
|
||||
$("#create_user").on("click", function() {
|
||||
var connectionRetries = 15;
|
||||
var data = {"devicetype":"hyperion#"+Date.now()};
|
||||
var UserInterval = setInterval(function(){
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: 'http://'+$("#ip").val()+'/api',
|
||||
processData: false,
|
||||
timeout: 1000,
|
||||
contentType: 'application/json',
|
||||
data: JSON.stringify(data),
|
||||
success: function(r) {
|
||||
connectionRetries--;
|
||||
$("#connectionTime").html(connectionRetries);
|
||||
if(connectionRetries == 0) {
|
||||
abortConnection(UserInterval);
|
||||
}
|
||||
else
|
||||
{
|
||||
$("#abortConnection").hide();
|
||||
$('#pairmodal').modal('show');
|
||||
$("#ip_alert").hide();
|
||||
if (typeof r[0].error != 'undefined') {
|
||||
console.log("link not pressed");
|
||||
}
|
||||
if (typeof r[0].success != 'undefined') {
|
||||
$('#pairmodal').modal('hide');
|
||||
$('#user').val(r[0].success.username);
|
||||
|
||||
$( "#hue_lights" ).empty();
|
||||
get_hue_lights();
|
||||
clearInterval(UserInterval);
|
||||
}
|
||||
}
|
||||
},
|
||||
error: function(XMLHttpRequest, textStatus, errorThrown) {
|
||||
$("#ip_alert").show();
|
||||
clearInterval(UserInterval);
|
||||
}
|
||||
});
|
||||
},1000);
|
||||
});
|
||||
|
||||
function abortConnection(UserInterval){
|
||||
clearInterval(UserInterval);
|
||||
$("#abortConnection").show();
|
||||
$('#pairmodal').modal('hide');
|
||||
}
|
||||
|
||||
});
|
@@ -73,26 +73,30 @@ $(document).ready(function () {
|
||||
//End language selection
|
||||
|
||||
$(window.hyperion).on("cmd-authorize-tokenRequest cmd-authorize-getPendingTokenRequests", function (event) {
|
||||
var val = event.response.info;
|
||||
if (Array.isArray(event.response.info)) {
|
||||
if (event.response.info.length == 0) {
|
||||
return
|
||||
}
|
||||
val = event.response.info[0]
|
||||
if (val.comment == '')
|
||||
$('#modal_dialog').modal('hide');
|
||||
}
|
||||
|
||||
showInfoDialog("grantToken", $.i18n('conf_network_tok_grantT'), $.i18n('conf_network_tok_grantMsg') + '<br><span style="font-weight:bold">App: ' + val.comment + '</span><br><span style="font-weight:bold">Code: ' + val.id + '</span>')
|
||||
$("#tok_grant_acc").off().on('click', function () {
|
||||
tokenList.push(val)
|
||||
// forward event, in case we need to rebuild the list now
|
||||
$(window.hyperion).trigger({ type: "build-token-list" });
|
||||
requestHandleTokenRequest(val.id, true)
|
||||
});
|
||||
$("#tok_deny_acc").off().on('click', function () {
|
||||
requestHandleTokenRequest(val.id, false)
|
||||
});
|
||||
if (event.response && event.response.info !== undefined) {
|
||||
var val = event.response.info;
|
||||
|
||||
if (Array.isArray(event.response.info)) {
|
||||
if (event.response.info.length == 0) {
|
||||
return
|
||||
}
|
||||
val = event.response.info[0]
|
||||
if (val.comment == '')
|
||||
$('#modal_dialog').modal('hide');
|
||||
}
|
||||
|
||||
showInfoDialog("grantToken", $.i18n('conf_network_tok_grantT'), $.i18n('conf_network_tok_grantMsg') + '<br><span style="font-weight:bold">App: ' + val.comment + '</span><br><span style="font-weight:bold">Code: ' + val.id + '</span>')
|
||||
$("#tok_grant_acc").off().on('click', function () {
|
||||
tokenList.push(val)
|
||||
// forward event, in case we need to rebuild the list now
|
||||
$(window.hyperion).trigger({ type: "build-token-list" });
|
||||
requestHandleTokenRequest(val.id, true)
|
||||
});
|
||||
$("#tok_deny_acc").off().on('click', function () {
|
||||
requestHandleTokenRequest(val.id, false)
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$(window.hyperion).one("cmd-authorize-getTokenList", function (event) {
|
||||
@@ -186,21 +190,12 @@ $(document).ready(function () {
|
||||
}
|
||||
});
|
||||
|
||||
$(window.hyperion).on("cmd-authorize-adminRequired", function (event) {
|
||||
//Check if a admin login is required.
|
||||
//If yes: check if default pw is set. If no: go ahead to get server config and render page
|
||||
if (event.response.info.adminRequired === true)
|
||||
requestRequiresDefaultPasswortChange();
|
||||
else
|
||||
requestServerConfigSchema();
|
||||
});
|
||||
|
||||
$(window.hyperion).on("error", function (event) {
|
||||
//If we are getting an error "No Authorization" back with a set loginToken we will forward to new Login (Token is expired.
|
||||
//e.g.: hyperiond was started new in the meantime)
|
||||
if (event.reason == "No Authorization" && getStorage("loginToken")) {
|
||||
removeStorage("loginToken");
|
||||
requestRequiresAdminAuth();
|
||||
requestRequiresDefaultPasswortChange();
|
||||
}
|
||||
else if (event.reason == "Selected Hyperion instance isn't running") {
|
||||
//Switch to default instance
|
||||
@@ -211,7 +206,7 @@ $(document).ready(function () {
|
||||
});
|
||||
|
||||
$(window.hyperion).on("open", function (event) {
|
||||
requestRequiresAdminAuth();
|
||||
requestRequiresDefaultPasswortChange();
|
||||
});
|
||||
|
||||
$(window.hyperion).on("ready", function (event) {
|
||||
|
@@ -1053,28 +1053,28 @@ $(document).ready(function () {
|
||||
});
|
||||
|
||||
$("#leddevices").off().on("change", function () {
|
||||
var generalOptions = window.serverSchema.properties.device;
|
||||
const generalOptions = window.serverSchema.properties.device;
|
||||
|
||||
var ledType = $(this).val();
|
||||
var specificOptions = window.serverSchema.properties.alldevices[ledType];
|
||||
const ledType = $(this).val();
|
||||
const specificOptions = window.serverSchema.properties.alldevices[ledType];
|
||||
|
||||
conf_editor = createJsonEditor('editor_container_leddevice', {
|
||||
specificOptions: specificOptions,
|
||||
generalOptions: generalOptions,
|
||||
});
|
||||
|
||||
var values_general = {};
|
||||
var values_specific = {};
|
||||
var isCurrentDevice = (window.serverConfig.device.type == ledType);
|
||||
let values_general = {};
|
||||
let values_specific = {};
|
||||
const isCurrentDevice = (window.serverConfig.device.type == ledType);
|
||||
|
||||
for (var key in window.serverConfig.device) {
|
||||
for (const key in window.serverConfig.device) {
|
||||
if (key != "type" && key in generalOptions.properties) values_general[key] = window.serverConfig.device[key];
|
||||
};
|
||||
conf_editor.getEditor("root.generalOptions").setValue(values_general);
|
||||
|
||||
if (isCurrentDevice) {
|
||||
var specificOptions_val = conf_editor.getEditor("root.specificOptions").getValue();
|
||||
for (var key in specificOptions_val) {
|
||||
const specificOptions_val = conf_editor.getEditor("root.specificOptions").getValue();
|
||||
for (const key in specificOptions_val) {
|
||||
values_specific[key] = (key in window.serverConfig.device) ? window.serverConfig.device[key] : specificOptions_val[key];
|
||||
};
|
||||
conf_editor.getEditor("root.specificOptions").setValue(values_specific);
|
||||
@@ -1086,45 +1086,12 @@ $(document).ready(function () {
|
||||
conf_editor.validate().length || window.readOnlyMode ? $('#btn_submit_controller').prop('disabled', true) : $('#btn_submit_controller').prop('disabled', false);
|
||||
|
||||
// LED controller specific wizards
|
||||
$('#btn_wiz_holder').html("");
|
||||
$('#btn_led_device_wiz').off();
|
||||
|
||||
if (ledType == "philipshue") {
|
||||
var ledWizardType = ledType;
|
||||
var data = { type: ledWizardType };
|
||||
var hue_title = 'wiz_hue_title';
|
||||
changeWizard(data, hue_title, startWizardPhilipsHue);
|
||||
}
|
||||
else if (ledType == "nanoleaf") {
|
||||
var ledWizardType = ledType;
|
||||
var data = { type: ledWizardType };
|
||||
var nanoleaf_user_auth_title = 'wiz_nanoleaf_user_auth_title';
|
||||
changeWizard(data, nanoleaf_user_auth_title, startWizardNanoleafUserAuth);
|
||||
$('#btn_wiz_holder').hide();
|
||||
}
|
||||
else if (ledType == "atmoorb") {
|
||||
var ledWizardType = (this.checked) ? "atmoorb" : ledType;
|
||||
var data = { type: ledWizardType };
|
||||
var atmoorb_title = 'wiz_atmoorb_title';
|
||||
changeWizard(data, atmoorb_title, startWizardAtmoOrb);
|
||||
}
|
||||
else if (ledType == "yeelight") {
|
||||
var ledWizardType = (this.checked) ? "yeelight" : ledType;
|
||||
var data = { type: ledWizardType };
|
||||
var yeelight_title = 'wiz_yeelight_title';
|
||||
changeWizard(data, yeelight_title, startWizardYeelight);
|
||||
}
|
||||
|
||||
function changeWizard(data, hint, fn) {
|
||||
$('#btn_wiz_holder').html("")
|
||||
createHint("wizard", $.i18n(hint), "btn_wiz_holder", "btn_led_device_wiz");
|
||||
$('#btn_led_device_wiz').off().on('click', data, fn);
|
||||
}
|
||||
createLedDeviceWizards(ledType);
|
||||
|
||||
conf_editor.on('ready', function () {
|
||||
var hwLedCountDefault = 1;
|
||||
var colorOrderDefault = "rgb";
|
||||
var filter = {};
|
||||
let hwLedCountDefault = 1;
|
||||
let colorOrderDefault = "rgb";
|
||||
let filter = {};
|
||||
|
||||
$('#btn_layout_controller').hide();
|
||||
$('#btn_test_controller').hide();
|
||||
@@ -1172,58 +1139,55 @@ $(document).ready(function () {
|
||||
.catch(error => {
|
||||
showNotification('danger', "Device discovery for " + ledType + " failed with error:" + error);
|
||||
});
|
||||
|
||||
hwLedCountDefault = 1;
|
||||
colorOrderDefault = "rgb";
|
||||
break;
|
||||
|
||||
case "philipshue":
|
||||
case "philipshue": {
|
||||
disableAutoResolvedGeneralOptions();
|
||||
|
||||
var lights = conf_editor.getEditor("root.specificOptions.lightIds").getValue();
|
||||
const lights = conf_editor.getEditor("root.specificOptions.lightIds").getValue();
|
||||
hwLedCountDefault = lights.length;
|
||||
colorOrderDefault = "rgb";
|
||||
}
|
||||
break;
|
||||
|
||||
case "yeelight":
|
||||
case "yeelight": {
|
||||
disableAutoResolvedGeneralOptions();
|
||||
|
||||
var lights = conf_editor.getEditor("root.specificOptions.lights").getValue();
|
||||
const lights = conf_editor.getEditor("root.specificOptions.lights").getValue();
|
||||
hwLedCountDefault = lights.length;
|
||||
colorOrderDefault = "rgb";
|
||||
}
|
||||
break;
|
||||
|
||||
case "atmoorb":
|
||||
case "atmoorb": {
|
||||
disableAutoResolvedGeneralOptions();
|
||||
|
||||
var configruedOrbIds = conf_editor.getEditor("root.specificOptions.orbIds").getValue().trim();
|
||||
const configruedOrbIds = conf_editor.getEditor("root.specificOptions.orbIds").getValue().trim();
|
||||
if (configruedOrbIds.length !== 0) {
|
||||
hwLedCountDefault = configruedOrbIds.split(",").map(Number).length;
|
||||
} else {
|
||||
hwLedCountDefault = 0;
|
||||
}
|
||||
colorOrderDefault = "rgb";
|
||||
}
|
||||
break;
|
||||
|
||||
case "razer":
|
||||
case "razer": {
|
||||
disableAutoResolvedGeneralOptions();
|
||||
hwLedCountDefault = 1;
|
||||
colorOrderDefault = "bgr";
|
||||
|
||||
var subType = conf_editor.getEditor("root.specificOptions.subType").getValue();
|
||||
let params = { subType: subType };
|
||||
const subType = conf_editor.getEditor("root.specificOptions.subType").getValue();
|
||||
const params = { subType };
|
||||
getProperties_device(ledType, subType, params);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
}
|
||||
|
||||
if (ledType !== window.serverConfig.device.type) {
|
||||
var hwLedCount = conf_editor.getEditor("root.generalOptions.hardwareLedCount");
|
||||
let hwLedCount = conf_editor.getEditor("root.generalOptions.hardwareLedCount");
|
||||
if (hwLedCount) {
|
||||
hwLedCount.setValue(hwLedCountDefault);
|
||||
}
|
||||
var colorOrder = conf_editor.getEditor("root.generalOptions.colorOrder");
|
||||
let colorOrder = conf_editor.getEditor("root.generalOptions.colorOrder");
|
||||
if (colorOrder) {
|
||||
colorOrder.setValue(colorOrderDefault);
|
||||
}
|
||||
@@ -1232,8 +1196,8 @@ $(document).ready(function () {
|
||||
|
||||
conf_editor.on('change', function () {
|
||||
// //Check, if device can be identified/tested and/or saved
|
||||
var canIdentify = false;
|
||||
var canSave = false;
|
||||
let canIdentify = false;
|
||||
let canSave = false;
|
||||
|
||||
switch (ledType) {
|
||||
|
||||
@@ -1245,11 +1209,12 @@ $(document).ready(function () {
|
||||
case "udpartnet":
|
||||
case "udpddp":
|
||||
case "udph801":
|
||||
case "udpraw":
|
||||
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
case "udpraw": {
|
||||
const host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
if (host !== "") {
|
||||
canSave = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case "adalight":
|
||||
@@ -1257,50 +1222,63 @@ $(document).ready(function () {
|
||||
case "karate":
|
||||
case "dmx":
|
||||
case "sedu":
|
||||
case "tpm2":
|
||||
var rate = conf_editor.getEditor("root.specificOptions.rate").getValue();
|
||||
case "tpm2": {
|
||||
let currentDeviceType = window.serverConfig.device.type;
|
||||
if ($.inArray(currentDeviceType, devSerial) === -1) {
|
||||
canIdentify = true;
|
||||
} else {
|
||||
let output = conf_editor.getEditor("root.specificOptions.output").getValue();
|
||||
if (window.serverConfig.device.output !== output) {
|
||||
canIdentify = true;
|
||||
}
|
||||
}
|
||||
|
||||
const rate = conf_editor.getEditor("root.specificOptions.rate").getValue();
|
||||
if (rate > 0) {
|
||||
canSave = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case "philipshue":
|
||||
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
var username = conf_editor.getEditor("root.specificOptions.username").getValue();
|
||||
case "philipshue": {
|
||||
const host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
const username = conf_editor.getEditor("root.specificOptions.username").getValue();
|
||||
if (host !== "" && username != "") {
|
||||
var useEntertainmentAPI = conf_editor.getEditor("root.specificOptions.useEntertainmentAPI").getValue();
|
||||
var clientkey = conf_editor.getEditor("root.specificOptions.clientkey").getValue();
|
||||
const useEntertainmentAPI = conf_editor.getEditor("root.specificOptions.useEntertainmentAPI").getValue();
|
||||
const clientkey = conf_editor.getEditor("root.specificOptions.clientkey").getValue();
|
||||
if (!useEntertainmentAPI || clientkey !== "") {
|
||||
canSave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case "wled":
|
||||
case "cololight":
|
||||
var hostList = conf_editor.getEditor("root.specificOptions.hostList").getValue();
|
||||
case "cololight": {
|
||||
const hostList = conf_editor.getEditor("root.specificOptions.hostList").getValue();
|
||||
if (hostList !== "SELECT") {
|
||||
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
const host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
if (host !== "") {
|
||||
canIdentify = true;
|
||||
canSave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case "nanoleaf":
|
||||
var hostList = conf_editor.getEditor("root.specificOptions.hostList").getValue();
|
||||
case "nanoleaf": {
|
||||
const hostList = conf_editor.getEditor("root.specificOptions.hostList").getValue();
|
||||
if (hostList !== "SELECT") {
|
||||
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
var token = conf_editor.getEditor("root.specificOptions.token").getValue();
|
||||
const host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
const token = conf_editor.getEditor("root.specificOptions.token").getValue();
|
||||
if (host !== "" && token !== "") {
|
||||
canIdentify = true;
|
||||
canSave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
canIdentify = false;
|
||||
canSave = true;
|
||||
}
|
||||
|
||||
@@ -1428,30 +1406,27 @@ $(document).ready(function () {
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
conf_editor.watch('root.specificOptions.output', () => {
|
||||
var output = conf_editor.getEditor("root.specificOptions.output").getValue();
|
||||
const output = conf_editor.getEditor("root.specificOptions.output").getValue();
|
||||
if (output === "NONE" || output === "SELECT" || output === "") {
|
||||
|
||||
$('#btn_submit_controller').prop('disabled', true);
|
||||
$('#btn_test_controller').prop('disabled', true);
|
||||
$('#btn_test_controller').hide();
|
||||
|
||||
conf_editor.getEditor("root.generalOptions.hardwareLedCount").setValue(1);
|
||||
showAllDeviceInputOptions("output", false);
|
||||
}
|
||||
else {
|
||||
showAllDeviceInputOptions("output", true);
|
||||
let params = {};
|
||||
var canIdentify = false;
|
||||
switch (ledType) {
|
||||
case "adalight":
|
||||
canIdentify = true;
|
||||
break;
|
||||
case "atmo":
|
||||
case "karate":
|
||||
params = { serialPort: output };
|
||||
getProperties_device(ledType, output, params);
|
||||
break;
|
||||
case "adalight":
|
||||
case "dmx":
|
||||
case "sedu":
|
||||
case "tpm2":
|
||||
@@ -1470,8 +1445,8 @@ $(document).ready(function () {
|
||||
}
|
||||
|
||||
if ($.inArray(ledType, devSerial) != -1) {
|
||||
var rateList = conf_editor.getEditor("root.specificOptions.rateList").getValue();
|
||||
var showRate = false;
|
||||
const rateList = conf_editor.getEditor("root.specificOptions.rateList").getValue();
|
||||
let showRate = false;
|
||||
if (rateList == "CUSTOM") {
|
||||
showRate = true;
|
||||
}
|
||||
@@ -1479,13 +1454,6 @@ $(document).ready(function () {
|
||||
}
|
||||
|
||||
if (!conf_editor.validate().length) {
|
||||
if (canIdentify) {
|
||||
$("#btn_test_controller").show();
|
||||
$('#btn_test_controller').prop('disabled', false);
|
||||
} else {
|
||||
$('#btn_test_controller').hide();
|
||||
$('#btn_test_controller').prop('disabled', true);
|
||||
}
|
||||
if (!window.readOnlyMode) {
|
||||
$('#btn_submit_controller').prop('disabled', false);
|
||||
}
|
||||
@@ -1537,12 +1505,12 @@ $(document).ready(function () {
|
||||
});
|
||||
|
||||
conf_editor.watch('root.specificOptions.rateList', () => {
|
||||
var specOptPath = 'root.specificOptions.';
|
||||
var rateList = conf_editor.getEditor("root.specificOptions.rateList");
|
||||
if (rateList) {
|
||||
var val = rateList.getValue();
|
||||
var rate = conf_editor.getEditor("root.specificOptions.rate");
|
||||
const specOptPath = 'root.specificOptions.';
|
||||
const rateList = conf_editor.getEditor("root.specificOptions.rateList");
|
||||
let rate = conf_editor.getEditor("root.specificOptions.rate");
|
||||
|
||||
if (rateList) {
|
||||
const val = rateList.getValue();
|
||||
switch (val) {
|
||||
case 'CUSTOM':
|
||||
case '':
|
||||
@@ -2543,6 +2511,10 @@ function nanoleafGeneratelayout(panelLayout, panelOrderTopDown, panelOrderLeftRi
|
||||
18: { name: "LightLinesSingleZone", led: true, sideLengthX: 77, sideLengthY: 77 },
|
||||
19: { name: "ControllerCap", led: false, sideLengthX: 11, sideLengthY: 11 },
|
||||
20: { name: "PowerConnector", led: false, sideLengthX: 11, sideLengthY: 11 },
|
||||
29: { name: "4DLightstrip", led: true, sideLengthX: 50, sideLengthY: 50 },
|
||||
30: { name: "Skylight Panel", led: true, sideLengthX: 180, sideLengthY: 180 },
|
||||
31: { name: "SkylightControllerPrimary", led: true, sideLengthX: 180, sideLengthY: 180 },
|
||||
32: { name: "SkylightControllerPassive", led: true, sideLengthX: 180, sideLengthY: 180 },
|
||||
999: { name: "Unknown", led: true, sideLengthX: 100, sideLengthY: 100 }
|
||||
};
|
||||
|
||||
|
@@ -3,10 +3,13 @@ var createdCont = false;
|
||||
var isScroll = true;
|
||||
|
||||
performTranslation();
|
||||
requestLoggingStop();
|
||||
|
||||
$(document).ready(function () {
|
||||
|
||||
window.addEventListener('hashchange', function(event) {
|
||||
requestLoggingStop();
|
||||
});
|
||||
|
||||
requestLoggingStart();
|
||||
|
||||
$('#conf_cont').append(createOptPanel('fa-reorder', $.i18n("edt_conf_log_heading_title"), 'editor_container', 'btn_submit'));
|
||||
@@ -178,9 +181,9 @@ $(document).ready(function () {
|
||||
if (!window.loggingHandlerInstalled) {
|
||||
window.loggingHandlerInstalled = true;
|
||||
|
||||
$(window.hyperion).on("cmd-logging-update", function (event) {
|
||||
$(window.hyperion).on("cmd-logmsg-update", function (event) {
|
||||
|
||||
var messages = (event.response.result.messages);
|
||||
var messages = (event.response.data.messages);
|
||||
|
||||
if (messages.length != 0) {
|
||||
if (!createdCont) {
|
||||
|
@@ -213,13 +213,13 @@ $(document).ready(function () {
|
||||
for (var key in tokenList) {
|
||||
var lastUse = (tokenList[key].last_use) ? tokenList[key].last_use : "-";
|
||||
var btn = '<button id="tok' + tokenList[key].id + '" type="button" class="btn btn-danger">' + $.i18n('general_btn_delete') + '</button>';
|
||||
$('.tktbody').append(createTableRow([tokenList[key].comment, lastUse, btn], false, true));
|
||||
$('.tktbody').append(createTableRow([tokenList[key].id, tokenList[key].comment, lastUse, btn], false, true));
|
||||
$('#tok' + tokenList[key].id).off().on('click', handleDeleteToken);
|
||||
}
|
||||
}
|
||||
|
||||
createTable('tkthead', 'tktbody', 'tktable');
|
||||
$('.tkthead').html(createTableRow([$.i18n('conf_network_tok_cidhead'), $.i18n('conf_network_tok_lastuse'), $.i18n('general_btn_delete')], true, true));
|
||||
$('.tkthead').html(createTableRow([$.i18n('conf_network_tok_idhead'), $.i18n('conf_network_tok_cidhead'), $.i18n('conf_network_tok_lastuse'), $.i18n('general_btn_delete')], true, true));
|
||||
buildTokenList();
|
||||
|
||||
function handleDeleteToken(e) {
|
||||
|
@@ -177,6 +177,7 @@ function sendToHyperion(command, subcommand, msg)
|
||||
else
|
||||
msg = "";
|
||||
|
||||
window.wsTan = Math.floor(Math.random() * 1000)
|
||||
window.websocket.send('{"command":"'+command+'", "tan":'+window.wsTan+subcommand+msg+'}');
|
||||
}
|
||||
|
||||
@@ -187,7 +188,7 @@ function sendToHyperion(command, subcommand, msg)
|
||||
// data: The json data as Object
|
||||
// tan: The optional tan, default 1. If the tan is -1, we skip global response error handling
|
||||
// Returns data of response or false if timeout
|
||||
async function sendAsyncToHyperion (command, subcommand, data, tan = 1) {
|
||||
async function sendAsyncToHyperion (command, subcommand, data, tan = Math.floor(Math.random() * 1000) ) {
|
||||
let obj = { command, tan }
|
||||
if (subcommand) {Object.assign(obj, {subcommand})}
|
||||
if (data) { Object.assign(obj, data) }
|
||||
@@ -486,38 +487,38 @@ async function requestLedDeviceDiscovery(type, params)
|
||||
{
|
||||
let data = { ledDeviceType: type, params: params };
|
||||
|
||||
return sendAsyncToHyperion("leddevice", "discover", data, Math.floor(Math.random() * 1000) );
|
||||
return sendAsyncToHyperion("leddevice", "discover", data);
|
||||
}
|
||||
|
||||
async function requestLedDeviceProperties(type, params)
|
||||
{
|
||||
let data = { ledDeviceType: type, params: params };
|
||||
|
||||
return sendAsyncToHyperion("leddevice", "getProperties", data, Math.floor(Math.random() * 1000));
|
||||
return sendAsyncToHyperion("leddevice", "getProperties", data);
|
||||
}
|
||||
|
||||
function requestLedDeviceIdentification(type, params)
|
||||
{
|
||||
let data = { ledDeviceType: type, params: params };
|
||||
|
||||
return sendAsyncToHyperion("leddevice", "identify", data, Math.floor(Math.random() * 1000));
|
||||
return sendAsyncToHyperion("leddevice", "identify", data);
|
||||
}
|
||||
|
||||
async function requestLedDeviceAddAuthorization(type, params) {
|
||||
let data = { ledDeviceType: type, params: params };
|
||||
|
||||
return sendAsyncToHyperion("leddevice", "addAuthorization", data, Math.floor(Math.random() * 1000));
|
||||
return sendAsyncToHyperion("leddevice", "addAuthorization", data);
|
||||
}
|
||||
|
||||
async function requestInputSourcesDiscovery(type, params) {
|
||||
let data = { sourceType: type, params: params };
|
||||
|
||||
return sendAsyncToHyperion("inputsource", "discover", data, Math.floor(Math.random() * 1000));
|
||||
return sendAsyncToHyperion("inputsource", "discover", data);
|
||||
}
|
||||
|
||||
async function requestServiceDiscovery(type, params) {
|
||||
let data = { serviceType: type, params: params };
|
||||
|
||||
return sendAsyncToHyperion("service", "discover", data, Math.floor(Math.random() * 1000));
|
||||
return sendAsyncToHyperion("service", "discover", data);
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
var storedLang;
|
||||
var availLang = ['ca', 'cs', 'da', 'de', 'el', 'en', 'es', 'fr', 'he', 'hu', 'id', 'it', 'ja', 'nl', 'nb', 'pl', 'pt', 'ro', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh-CN'];
|
||||
var availLangText = ['Català', 'Čeština', 'Dansk', 'Deutsch', 'Ελληνική', 'English', 'Español', 'Français', 'עִברִית' ,'Magyar', 'Indonesia', 'Italiano', '日本語', 'Nederlands', 'Norsk Bokmål', 'Polski', 'Português', 'Română', 'русский', 'Svenska', 'Türkçe', 'Українська', 'Tiếng Việt', '汉语'];
|
||||
var availLang = ['bg', 'ca', 'cs', 'da', 'de', 'el', 'en', 'es', 'fr', 'he', 'hu', 'id', 'it', 'ja', 'nl', 'nb', 'pl', 'pt', 'ro', 'ru', 'sv', 'tr', 'uk', 'vi', 'zh-CN'];
|
||||
var availLangText = ['Български', 'Català', 'Čeština', 'Dansk', 'Deutsch', 'Ελληνική', 'English', 'Español', 'Français', 'עִברִית' ,'Magyar', 'Indonesia', 'Italiano', '日本語', 'Nederlands', 'Norsk Bokmål', 'Polski', 'Português', 'Română', 'русский', 'Svenska', 'Türkçe', 'Українська', 'Tiếng Việt', '汉语'];
|
||||
|
||||
//$.i18n.debug = true;
|
||||
|
||||
|
@@ -261,7 +261,7 @@ $(document).ready(function () {
|
||||
$("body").get(0).style.setProperty("--background-var", "none");
|
||||
}
|
||||
else {
|
||||
printLedsToCanvas(event.response.result.leds)
|
||||
printLedsToCanvas(event.response.data.leds)
|
||||
$("body").get(0).style.setProperty("--background-var", "url(" + ($('#leds_preview_canv')[0]).toDataURL("image/jpg") + ") no-repeat top left");
|
||||
}
|
||||
});
|
||||
@@ -275,7 +275,7 @@ $(document).ready(function () {
|
||||
}
|
||||
}
|
||||
else {
|
||||
var imageData = (event.response.result.image);
|
||||
var imageData = (event.response.data.image);
|
||||
|
||||
var image = new Image();
|
||||
image.onload = function () {
|
||||
|
@@ -319,9 +319,9 @@ function showInfoDialog(type, header, message) {
|
||||
});
|
||||
|
||||
$(document).on('click', '[data-dismiss-modal]', function () {
|
||||
var target = $(this).attr('data-dismiss-modal');
|
||||
$.find(target).modal('hide');
|
||||
});
|
||||
var target = $(this).data('dismiss-modal');
|
||||
$($.find(target)).modal('hide');
|
||||
});
|
||||
}
|
||||
|
||||
function createHintH(type, text, container) {
|
||||
@@ -1393,3 +1393,32 @@ function isValidHostnameOrIP(value) {
|
||||
return (isValidHostnameOrIP4(value) || isValidIPv6(value) || isValidServicename(value));
|
||||
}
|
||||
|
||||
const loadedScripts = [];
|
||||
|
||||
function isScriptLoaded(src) {
|
||||
return loadedScripts.indexOf(src) > -1;
|
||||
}
|
||||
|
||||
function loadScript(src, callback, ...params) {
|
||||
if (isScriptLoaded(src)) {
|
||||
debugMessage('Script ' + src + ' already loaded');
|
||||
if (callback && typeof callback === 'function') {
|
||||
callback( ...params);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const script = document.createElement('script');
|
||||
script.src = src;
|
||||
|
||||
script.onload = function () {
|
||||
debugMessage('Script ' + src + ' loaded successfully');
|
||||
loadedScripts.push(src);
|
||||
|
||||
if (callback && typeof callback === 'function') {
|
||||
callback(...params);
|
||||
}
|
||||
};
|
||||
|
||||
document.head.appendChild(script);
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
283
assets/webconfig/js/wizards/LedDevice_atmoorb.js
Normal file
283
assets/webconfig/js/wizards/LedDevice_atmoorb.js
Normal file
@@ -0,0 +1,283 @@
|
||||
//****************************
|
||||
// Wizard AtmoOrb
|
||||
//****************************
|
||||
|
||||
import { ledDeviceWizardUtils as utils } from './LedDevice_utils.js';
|
||||
|
||||
const atmoorbWizard = (() => {
|
||||
|
||||
const lights = [];
|
||||
let configuredLights = [];
|
||||
|
||||
function getIdInLights(id) {
|
||||
return lights.filter(
|
||||
function (lights) {
|
||||
return lights.id === id
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function begin() {
|
||||
|
||||
const configruedOrbIds = conf_editor.getEditor("root.specificOptions.orbIds").getValue().trim();
|
||||
if (configruedOrbIds.length !== 0) {
|
||||
configuredLights = configruedOrbIds.split(",").map(Number);
|
||||
}
|
||||
|
||||
const multiCastGroup = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
const multiCastPort = parseInt(conf_editor.getEditor("root.specificOptions.port").getValue());
|
||||
|
||||
discover(multiCastGroup, multiCastPort);
|
||||
|
||||
$('#btn_wiz_save').off().on("click", function () {
|
||||
let ledConfig = [];
|
||||
let finalLights = [];
|
||||
|
||||
//create atmoorb led config
|
||||
for (let key in lights) {
|
||||
if ($('#orb_' + key).val() !== "disabled") {
|
||||
// Set Name to layout-position, if empty
|
||||
if (lights[key].name === "") {
|
||||
lights[key].name = $.i18n('conf_leds_layout_cl_' + $('#orb_' + key).val());
|
||||
}
|
||||
|
||||
finalLights.push(lights[key].id);
|
||||
|
||||
let name = lights[key].id;
|
||||
if (lights[key].host !== "")
|
||||
name += ':' + lights[key].host;
|
||||
|
||||
const idx_content = utils.assignLightPos($('#orb_' + key).val(), name);
|
||||
ledConfig.push(JSON.parse(JSON.stringify(idx_content)));
|
||||
}
|
||||
}
|
||||
|
||||
//LED layout
|
||||
window.serverConfig.leds = ledConfig;
|
||||
|
||||
//LED device config
|
||||
//Start with a clean configuration
|
||||
let d = {};
|
||||
|
||||
d.type = 'atmoorb';
|
||||
d.hardwareLedCount = finalLights.length;
|
||||
d.colorOrder = conf_editor.getEditor("root.generalOptions.colorOrder").getValue();
|
||||
|
||||
d.orbIds = finalLights.toString();
|
||||
d.useOrbSmoothing = utils.eV("useOrbSmoothing");
|
||||
|
||||
d.host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
d.port = parseInt(conf_editor.getEditor("root.specificOptions.port").getValue());
|
||||
d.latchTime = parseInt(conf_editor.getEditor("root.specificOptions.latchTime").getValue());;
|
||||
|
||||
window.serverConfig.device = d;
|
||||
|
||||
requestWriteConfig(window.serverConfig, true);
|
||||
resetWizard();
|
||||
});
|
||||
|
||||
$('#btn_wiz_abort').off().on('click', resetWizard);
|
||||
}
|
||||
|
||||
async function discover(multiCastGroup, multiCastPort) {
|
||||
let params = {};
|
||||
if (multiCastGroup !== "") {
|
||||
params.multiCastGroup = multiCastGroup;
|
||||
}
|
||||
|
||||
if (multiCastPort !== 0) {
|
||||
params.multiCastPort = multiCastPort;
|
||||
}
|
||||
|
||||
// Get discovered lights
|
||||
const res = await requestLedDeviceDiscovery('atmoorb', params);
|
||||
if (res && !res.error) {
|
||||
const r = res.info;
|
||||
|
||||
// Process devices returned by discovery
|
||||
processDiscoveredDevices(r.devices);
|
||||
|
||||
// Add additional items from configuration
|
||||
for (const configuredLight of configuredLights) {
|
||||
processConfiguredLight(configuredLight);
|
||||
}
|
||||
|
||||
sortLightsById();
|
||||
assign_lights();
|
||||
}
|
||||
}
|
||||
|
||||
function processDiscoveredDevices(devices) {
|
||||
for (const device of devices) {
|
||||
if (device.id !== "" && getIdInLights(device.id).length === 0) {
|
||||
const light = {
|
||||
id: device.id,
|
||||
ip: device.ip,
|
||||
host: device.hostname
|
||||
};
|
||||
lights.push(light);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function processConfiguredLight(configuredLight) {
|
||||
if (configuredLight !== "" && !isNaN(configuredLight)) {
|
||||
if (getIdInLights(configuredLight).length === 0) {
|
||||
const light = {
|
||||
id: configuredLight,
|
||||
ip: "",
|
||||
host: ""
|
||||
};
|
||||
lights.push(light);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function attachIdentifyButtonEvent() {
|
||||
// Use event delegation to handle clicks on buttons with class "btn-identify"
|
||||
$('#wizp2_body').on('click', '.btn-identify', function () {
|
||||
const orbId = $(this).data('orb-id');
|
||||
identify(orbId);
|
||||
});
|
||||
}
|
||||
|
||||
function sortLightsById() {
|
||||
lights.sort((a, b) => (a.id > b.id) ? 1 : -1);
|
||||
}
|
||||
|
||||
function assign_lights() {
|
||||
// If records are left for configuration
|
||||
if (Object.keys(lights).length > 0) {
|
||||
$('#wh_topcontainer').toggle(false);
|
||||
$('#orb_ids_t, #btn_wiz_save').toggle(true);
|
||||
|
||||
const lightOptions = [
|
||||
"top", "topleft", "topright",
|
||||
"bottom", "bottomleft", "bottomright",
|
||||
"left", "lefttop", "leftmiddle", "leftbottom",
|
||||
"right", "righttop", "rightmiddle", "rightbottom",
|
||||
"entire",
|
||||
"lightPosTopLeft112", "lightPosTopLeftNewMid", "lightPosTopLeft121",
|
||||
"lightPosBottomLeft14", "lightPosBottomLeft12", "lightPosBottomLeft34", "lightPosBottomLeft11",
|
||||
"lightPosBottomLeft112", "lightPosBottomLeftNewMid", "lightPosBottomLeft121"
|
||||
];
|
||||
|
||||
lightOptions.unshift("disabled");
|
||||
|
||||
$('.lidsb').html("");
|
||||
let pos = "";
|
||||
|
||||
for (const lightid in lights) {
|
||||
const orbId = lights[lightid].id;
|
||||
const orbIp = lights[lightid].ip;
|
||||
let orbHostname = lights[lightid].host;
|
||||
|
||||
if (orbHostname === "")
|
||||
orbHostname = $.i18n('edt_dev_spec_lights_itemtitle');
|
||||
|
||||
let options = "";
|
||||
for (const opt in lightOptions) {
|
||||
const val = lightOptions[opt];
|
||||
const txt = (val !== 'entire' && val !== 'disabled') ? 'conf_leds_layout_cl_' : 'wiz_ids_';
|
||||
options += '<option value="' + val + '"';
|
||||
if (pos === val) options += ' selected="selected"';
|
||||
options += '>' + $.i18n(txt + val) + '</option>';
|
||||
}
|
||||
|
||||
let enabled = 'enabled';
|
||||
if (orbId < 1 || orbId > 255) {
|
||||
enabled = 'disabled';
|
||||
options = '<option value=disabled>' + $.i18n('wiz_atmoorb_unsupported') + '</option>';
|
||||
}
|
||||
|
||||
let lightAnnotation = "";
|
||||
if (orbIp !== "") {
|
||||
lightAnnotation = ': ' + orbIp + '<br>(' + orbHostname + ')';
|
||||
}
|
||||
|
||||
$('.lidsb').append(createTableRow([orbId + lightAnnotation, '<select id="orb_' + lightid + '" ' + enabled + ' class="orb_sel_watch form-control">'
|
||||
+ options
|
||||
+ '</select>', '<button class="btn btn-sm btn-primary btn-identify" ' + enabled + ' data-orb-id="' + orbId + '")>'
|
||||
+ $.i18n('wiz_identify_light', orbId) + '</button>']));
|
||||
}
|
||||
attachIdentifyButtonEvent();
|
||||
|
||||
$('.orb_sel_watch').on("change", function () {
|
||||
let cC = 0;
|
||||
for (const key in lights) {
|
||||
if ($('#orb_' + key).val() !== "disabled") {
|
||||
cC++;
|
||||
}
|
||||
}
|
||||
if (cC === 0 || window.readOnlyMode)
|
||||
$('#btn_wiz_save').prop("disabled", true);
|
||||
else
|
||||
$('#btn_wiz_save').prop("disabled", false);
|
||||
});
|
||||
$('.orb_sel_watch').trigger('change');
|
||||
}
|
||||
else {
|
||||
const noLightsTxt = '<p style="font-weight:bold;color:red;">' + $.i18n('wiz_noLights', 'AtmoOrbs') + '</p>';
|
||||
$('#wizp2_body').append(noLightsTxt);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
async function identify(orbId) {
|
||||
const disabled = $('#btn_wiz_save').is(':disabled');
|
||||
|
||||
// Take care that new record cannot be save during background process
|
||||
$('#btn_wiz_save').prop('disabled', true);
|
||||
|
||||
const params = { id: orbId };
|
||||
await requestLedDeviceIdentification("atmoorb", params);
|
||||
|
||||
if (!window.readOnlyMode) {
|
||||
$('#btn_wiz_save').prop('disabled', disabled);
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
start: function (e) {
|
||||
|
||||
//create html
|
||||
const atmoorb_title = 'wiz_atmoorb_title';
|
||||
const atmoorb_intro1 = 'wiz_atmoorb_intro1';
|
||||
|
||||
$('#wiz_header').html('<i class="fa fa-magic fa-fw"></i>' + $.i18n(atmoorb_title));
|
||||
$('#wizp1_body').html('<h4 style="font-weight:bold;text-transform:uppercase;">' + $.i18n(atmoorb_title) + '</h4><p>' + $.i18n(atmoorb_intro1) + '</p>');
|
||||
|
||||
$('#wizp1_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_cont"><i class="fa fa-fw fa-check"></i>'
|
||||
+ $.i18n('general_btn_continue') + '</button><button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-fw fa-close"></i>'
|
||||
+ $.i18n('general_btn_cancel') + '</button>');
|
||||
|
||||
$('#wizp2_body').html('<div id="wh_topcontainer"></div>');
|
||||
|
||||
$('#wh_topcontainer').append('<div class="form-group" id="usrcont" style="display:none"></div>');
|
||||
|
||||
$('#wizp2_body').append('<div id="orb_ids_t" style="display:none"><p style="font-weight:bold" id="orb_id_headline">' + $.i18n('wiz_atmoorb_desc2') + '</p></div>');
|
||||
|
||||
createTable("lidsh", "lidsb", "orb_ids_t");
|
||||
$('.lidsh').append(createTableRow([$.i18n('edt_dev_spec_lights_title'), $.i18n('wiz_pos'), $.i18n('wiz_identify')], true));
|
||||
$('#wizp2_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_save" style="display:none"><i class="fa fa-fw fa-save"></i>'
|
||||
+ $.i18n('general_btn_save') + '</button><buttowindow.serverConfig.device = d;n type="button" class="btn btn-danger" id="btn_wiz_abort"><i class="fa fa-fw fa-close"></i>'
|
||||
+ $.i18n('general_btn_cancel') + '</button>');
|
||||
|
||||
if (getStorage("darkMode") == "on")
|
||||
$('#wizard_logo').attr("src", 'img/hyperion/logo_negativ.png');
|
||||
|
||||
//open modal
|
||||
$("#wizard_modal").modal({ backdrop: "static", keyboard: false, show: true });
|
||||
|
||||
//listen for continue
|
||||
$('#btn_wiz_cont').off().on('click', function () {
|
||||
begin();
|
||||
$('#wizp1').toggle(false);
|
||||
$('#wizp2').toggle(true);
|
||||
});
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
export { atmoorbWizard };
|
94
assets/webconfig/js/wizards/LedDevice_nanoleaf.js
Normal file
94
assets/webconfig/js/wizards/LedDevice_nanoleaf.js
Normal file
@@ -0,0 +1,94 @@
|
||||
//****************************
|
||||
// Wizard Nanoleaf
|
||||
//****************************
|
||||
|
||||
const nanoleafWizard = (() => {
|
||||
|
||||
const retryInterval = 2;
|
||||
|
||||
async function createNanoleafUserAuthorization() {
|
||||
const host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
const params = { host };
|
||||
let retryTime = 30;
|
||||
|
||||
const UserInterval = setInterval(async function () {
|
||||
retryTime -= retryInterval;
|
||||
$("#connectionTime").html(retryTime);
|
||||
|
||||
if (retryTime <= 0) {
|
||||
handleTimeout();
|
||||
} else {
|
||||
const res = await requestLedDeviceAddAuthorization('nanoleaf', params);
|
||||
handleResponse(res);
|
||||
}
|
||||
}, retryInterval * 1000);
|
||||
|
||||
function handleTimeout() {
|
||||
clearInterval(UserInterval);
|
||||
showNotification(
|
||||
'warning',
|
||||
$.i18n('wiz_nanoleaf_failure_auth_token'),
|
||||
$.i18n('wiz_nanoleaf_failure_auth_token_t')
|
||||
);
|
||||
resetWizard(true);
|
||||
}
|
||||
|
||||
function handleResponse(res) {
|
||||
if (res && !res.error) {
|
||||
const response = res.info;
|
||||
if (jQuery.isEmptyObject(response)) {
|
||||
debugMessage(`${retryTime}: Power On/Off button not pressed or device not reachable`);
|
||||
} else {
|
||||
const token = response.auth_token;
|
||||
if (token !== 'undefined') {
|
||||
conf_editor.getEditor("root.specificOptions.token").setValue(token);
|
||||
}
|
||||
clearInterval(UserInterval);
|
||||
resetWizard(true);
|
||||
}
|
||||
} else {
|
||||
clearInterval(UserInterval);
|
||||
resetWizard(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
start: function () {
|
||||
const nanoleaf_user_auth_title = 'wiz_nanoleaf_user_auth_title';
|
||||
const nanoleaf_user_auth_intro = 'wiz_nanoleaf_user_auth_intro';
|
||||
|
||||
$('#wiz_header').html(
|
||||
`<i class="fa fa-magic fa-fw"></i>${$.i18n(nanoleaf_user_auth_title)}`
|
||||
);
|
||||
$('#wizp1_body').html(
|
||||
`<h4 style="font-weight:bold;text-transform:uppercase;">${$.i18n(nanoleaf_user_auth_title)}</h4><p>${$.i18n(nanoleaf_user_auth_intro)}</p>`
|
||||
);
|
||||
$('#wizp1_footer').html(
|
||||
`<button type="button" class="btn btn-primary" id="btn_wiz_cont"><i class="fa fa-fw fa-check"></i>${$.i18n('general_btn_continue')}</button><button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-fw fa-close"></i>${$.i18n('general_btn_cancel')}</button>`
|
||||
);
|
||||
$('#wizp3_body').html(
|
||||
`<span>${$.i18n('wiz_nanoleaf_press_onoff_button')}</span> <br /><br /><center><span id="connectionTime"></span><br /><i class="fa fa-cog fa-spin" style="font-size:100px"></i></center>`
|
||||
);
|
||||
|
||||
if (getStorage("darkMode") == "on") {
|
||||
$('#wizard_logo').attr("src", 'img/hyperion/logo_negativ.png');
|
||||
}
|
||||
|
||||
$("#wizard_modal").modal({
|
||||
backdrop: "static",
|
||||
keyboard: false,
|
||||
show: true
|
||||
});
|
||||
|
||||
$('#btn_wiz_cont').off().on('click', function () {
|
||||
createNanoleafUserAuthorization();
|
||||
$('#wizp1').toggle(false);
|
||||
$('#wizp3').toggle(true);
|
||||
});
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
export { nanoleafWizard };
|
||||
|
988
assets/webconfig/js/wizards/LedDevice_philipshue.js
Normal file
988
assets/webconfig/js/wizards/LedDevice_philipshue.js
Normal file
@@ -0,0 +1,988 @@
|
||||
//****************************
|
||||
// Wizard Philips Hue
|
||||
//****************************
|
||||
|
||||
import { ledDeviceWizardUtils as utils } from './LedDevice_utils.js';
|
||||
|
||||
const philipshueWizard = (() => {
|
||||
|
||||
// External properties, 2-dimensional arry of [ledType][key]
|
||||
let devicesProperties = {};
|
||||
|
||||
let hueIPs = [];
|
||||
let hueIPsinc = 0;
|
||||
let hueLights = [];
|
||||
let hueEntertainmentConfigs = [];
|
||||
let hueEntertainmentServices = [];
|
||||
let groupLights = [];
|
||||
let groupChannels = [];
|
||||
let groupLightsLocations = [];
|
||||
let isAPIv2Ready = true;
|
||||
let isEntertainmentReady = true;
|
||||
|
||||
function checkHueBridge(cb, hueUser) {
|
||||
const usr = (typeof hueUser != "undefined") ? hueUser : 'config';
|
||||
if (usr === 'config') {
|
||||
$('#wiz_hue_discovered').html("");
|
||||
}
|
||||
|
||||
if (hueIPs[hueIPsinc]) {
|
||||
const host = hueIPs[hueIPsinc].host;
|
||||
const port = hueIPs[hueIPsinc].port;
|
||||
|
||||
if (usr != '') {
|
||||
getProperties(cb, decodeURIComponent(host), port, usr);
|
||||
}
|
||||
else {
|
||||
cb(false, usr);
|
||||
}
|
||||
|
||||
if (isAPIv2Ready) {
|
||||
$('#port').val(443);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function checkBridgeResult(reply, usr) {
|
||||
if (reply) {
|
||||
//abort checking, first reachable result is used
|
||||
$('#wiz_hue_ipstate').html("");
|
||||
$('#host').val(hueIPs[hueIPsinc].host)
|
||||
$('#port').val(hueIPs[hueIPsinc].port)
|
||||
|
||||
$('#usrcont').toggle(true);
|
||||
|
||||
checkHueBridge(checkUserResult, $('#user').val());
|
||||
}
|
||||
else {
|
||||
$('#usrcont').toggle(false);
|
||||
$('#wiz_hue_ipstate').html($.i18n('wiz_hue_failure_ip'));
|
||||
}
|
||||
};
|
||||
|
||||
function checkUserResult(reply, username) {
|
||||
$('#usrcont').toggle(true);
|
||||
|
||||
let hue_create_user = 'wiz_hue_e_create_user';
|
||||
if (!isEntertainmentReady) {
|
||||
hue_create_user = 'wiz_hue_create_user';
|
||||
$('#hue_client_key_r').toggle(false);
|
||||
} else {
|
||||
$('#hue_client_key_r').toggle(true);
|
||||
}
|
||||
|
||||
$('#wiz_hue_create_user').text($.i18n(hue_create_user));
|
||||
$('#wiz_hue_create_user').toggle(true);
|
||||
|
||||
if (reply) {
|
||||
$('#user').val(username);
|
||||
|
||||
if (isEntertainmentReady && $('#clientkey').val() == "") {
|
||||
$('#wiz_hue_usrstate').html($.i18n('wiz_hue_e_clientkey_needed'));
|
||||
$('#wiz_hue_create_user').toggle(true);
|
||||
} else {
|
||||
$('#wiz_hue_usrstate').html("");
|
||||
$('#wiz_hue_create_user').toggle(false);
|
||||
|
||||
if (isEntertainmentReady) {
|
||||
$('#hue_id_headline').text($.i18n('wiz_hue_e_desc3'));
|
||||
$('#hue_grp_ids_t').toggle(true);
|
||||
|
||||
get_hue_groups(username);
|
||||
|
||||
} else {
|
||||
$('#hue_id_headline').text($.i18n('wiz_hue_desc2'));
|
||||
$('#hue_grp_ids_t').toggle(false);
|
||||
|
||||
get_hue_lights(username);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
//abort checking, first reachable result is used
|
||||
$('#wiz_hue_usrstate').html($.i18n('wiz_hue_failure_user'));
|
||||
$('#wiz_hue_create_user').toggle(true);
|
||||
}
|
||||
};
|
||||
|
||||
function useGroupId(id, username) {
|
||||
$('#groupId').val(hueEntertainmentConfigs[id].id);
|
||||
if (isAPIv2Ready) {
|
||||
const group = hueEntertainmentConfigs[id];
|
||||
|
||||
groupLights = [];
|
||||
for (const light of group.light_services) {
|
||||
groupLights.push(light.rid);
|
||||
}
|
||||
|
||||
groupChannels = [];
|
||||
for (const channel of group.channels) {
|
||||
groupChannels.push(channel);
|
||||
}
|
||||
|
||||
groupLightsLocations = [];
|
||||
for (const location of group.locations.service_locations) {
|
||||
groupLightsLocations.push(location);
|
||||
}
|
||||
} else {
|
||||
//Ensure ligthIDs are strings
|
||||
groupLights = hueEntertainmentConfigs[id].lights.map(num => {
|
||||
return String(num);
|
||||
});
|
||||
|
||||
const lightLocations = hueEntertainmentConfigs[id].locations;
|
||||
for (const locationID in lightLocations) {
|
||||
let lightLocation = {};
|
||||
|
||||
let position = {
|
||||
x: lightLocations[locationID][0],
|
||||
y: lightLocations[locationID][1],
|
||||
z: lightLocations[locationID][2]
|
||||
};
|
||||
lightLocation.position = position;
|
||||
|
||||
groupLightsLocations.push(lightLocation);
|
||||
}
|
||||
}
|
||||
|
||||
get_hue_lights(username);
|
||||
}
|
||||
|
||||
function assignLightEntertainmentPos(isFocusCenter, position, name, id) {
|
||||
|
||||
let x = position.x;
|
||||
let z = position.z;
|
||||
|
||||
if (isFocusCenter) {
|
||||
// Map lights as in centered range -0.5 to 0.5
|
||||
if (x < -0.5) {
|
||||
x = -0.5;
|
||||
} else if (x > 0.5) {
|
||||
x = 0.5;
|
||||
}
|
||||
if (z < -0.5) {
|
||||
z = -0.5;
|
||||
} else if (z > 0.5) {
|
||||
z = 0.5;
|
||||
}
|
||||
} else {
|
||||
// Map lights as in full range -1 to 1
|
||||
x /= 2;
|
||||
z /= 2;
|
||||
}
|
||||
|
||||
const h = x + 0.5;
|
||||
const v = -z + 0.5;
|
||||
|
||||
const hmin = h - 0.05;
|
||||
const hmax = h + 0.05;
|
||||
const vmin = v - 0.05;
|
||||
const vmax = v + 0.05;
|
||||
|
||||
let layoutObject = {
|
||||
hmin: hmin < 0 ? 0 : hmin,
|
||||
hmax: hmax > 1 ? 1 : hmax,
|
||||
vmin: vmin < 0 ? 0 : vmin,
|
||||
vmax: vmax > 1 ? 1 : vmax,
|
||||
name: name
|
||||
};
|
||||
|
||||
if (id !== undefined && id !== null) {
|
||||
layoutObject.name += "_" + id;
|
||||
}
|
||||
return layoutObject;
|
||||
}
|
||||
|
||||
function assignSegmentedLightPos(segment, position, name) {
|
||||
let layoutObjects = [];
|
||||
|
||||
let segTotalLength = 0;
|
||||
for (const key in segment) {
|
||||
|
||||
segTotalLength += segment[key].length;
|
||||
}
|
||||
|
||||
let min;
|
||||
let max;
|
||||
let horizontal = true;
|
||||
|
||||
let layoutObject = utils.assignLightPos(position, name);
|
||||
if (position === "left" || position === "right") {
|
||||
// vertical distribution
|
||||
min = layoutObject.vmin;
|
||||
max = layoutObject.vmax;
|
||||
horizontal = false;
|
||||
|
||||
} else {
|
||||
// horizontal distribution
|
||||
min = layoutObject.hmin;
|
||||
max = layoutObject.hmax;
|
||||
}
|
||||
|
||||
const step = (max - min) / segTotalLength;
|
||||
let start = min;
|
||||
|
||||
for (const key in segment) {
|
||||
min = start;
|
||||
max = round(start + segment[key].length * step);
|
||||
|
||||
if (horizontal) {
|
||||
layoutObject.hmin = min;
|
||||
layoutObject.hmax = max;
|
||||
} else {
|
||||
layoutObject.vmin = min;
|
||||
layoutObject.vmax = max;
|
||||
}
|
||||
layoutObject.name = name + "_" + key;
|
||||
layoutObjects.push(JSON.parse(JSON.stringify(layoutObject)));
|
||||
|
||||
start = max;
|
||||
}
|
||||
|
||||
return layoutObjects;
|
||||
}
|
||||
|
||||
function updateBridgeDetails(properties) {
|
||||
const ledDeviceProperties = properties.config;
|
||||
|
||||
if (!jQuery.isEmptyObject(ledDeviceProperties)) {
|
||||
isEntertainmentReady = properties.isEntertainmentReady;
|
||||
isAPIv2Ready = properties.isAPIv2Ready;
|
||||
|
||||
if (ledDeviceProperties.name && ledDeviceProperties.bridgeid && ledDeviceProperties.modelid) {
|
||||
$('#wiz_hue_discovered').html(
|
||||
"Bridge: " + ledDeviceProperties.name +
|
||||
", Modelid: " + ledDeviceProperties.modelid +
|
||||
", Firmware: " + ledDeviceProperties.swversion + "<br/>" +
|
||||
"API-Version: " + ledDeviceProperties.apiversion +
|
||||
", Entertainment: " + (isEntertainmentReady ? "✓" : "-") +
|
||||
", APIv2: " + (isAPIv2Ready ? "✓" : "-")
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function discover() {
|
||||
$('#wiz_hue_ipstate').html($.i18n('edt_dev_spec_devices_discovery_inprogress'));
|
||||
|
||||
// $('#wiz_hue_discovered').html("")
|
||||
const res = await requestLedDeviceDiscovery('philipshue');
|
||||
if (res && !res.error) {
|
||||
const r = res.info;
|
||||
|
||||
// Process devices returned by discovery
|
||||
if (r.devices.length == 0) {
|
||||
$('#wiz_hue_ipstate').html($.i18n('wiz_hue_failure_ip'));
|
||||
$('#wiz_hue_discovered').html("")
|
||||
}
|
||||
else {
|
||||
hueIPs = [];
|
||||
hueIPsinc = 0;
|
||||
|
||||
let discoveryMethod = "ssdp";
|
||||
if (res.info.discoveryMethod) {
|
||||
discoveryMethod = res.info.discoveryMethod;
|
||||
}
|
||||
|
||||
for (const device of r.devices) {
|
||||
if (device) {
|
||||
let host;
|
||||
let port;
|
||||
if (discoveryMethod === "ssdp") {
|
||||
if (device.hostname && device.domain) {
|
||||
host = device.hostname + "." + device.domain;
|
||||
port = device.port;
|
||||
} else {
|
||||
host = device.ip;
|
||||
port = device.port;
|
||||
}
|
||||
} else {
|
||||
host = device.service;
|
||||
port = device.port;
|
||||
}
|
||||
if (host) {
|
||||
|
||||
if (!hueIPs.some(item => item.host === host)) {
|
||||
hueIPs.push({ host: host, port: port });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$('#wiz_hue_ipstate').html("");
|
||||
$('#host').val(hueIPs[hueIPsinc].host)
|
||||
$('#port').val(hueIPs[hueIPsinc].port)
|
||||
|
||||
$('#hue_bridge_select').html("");
|
||||
|
||||
for (const key in hueIPs) {
|
||||
$('#hue_bridge_select').append(createSelOpt(key, hueIPs[key].host));
|
||||
}
|
||||
|
||||
$('.hue_bridge_sel_watch').on("click", function () {
|
||||
hueIPsinc = $(this).val();
|
||||
|
||||
const name = $("#hue_bridge_select option:selected").text();
|
||||
$('#host').val(name);
|
||||
$('#port').val(hueIPs[hueIPsinc].port)
|
||||
|
||||
const usr = $('#user').val();
|
||||
if (usr != "") {
|
||||
checkHueBridge(checkUserResult, usr);
|
||||
} else {
|
||||
checkHueBridge(checkBridgeResult);
|
||||
}
|
||||
});
|
||||
|
||||
$('.hue_bridge_sel_watch').click();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function getProperties(cb, hostAddress, port, username, resourceFilter) {
|
||||
let params = { host: hostAddress, username: username, filter: resourceFilter };
|
||||
if (port !== 'undefined') {
|
||||
params.port = parseInt(port);
|
||||
}
|
||||
|
||||
const ledType = 'philipshue';
|
||||
const key = hostAddress;
|
||||
|
||||
//Create ledType cache entry
|
||||
if (!devicesProperties[ledType]) {
|
||||
devicesProperties[ledType] = {};
|
||||
}
|
||||
|
||||
// Use device's properties, if properties in chache
|
||||
if (devicesProperties[ledType][key] && devicesProperties[ledType][key][username]) {
|
||||
updateBridgeDetails(devicesProperties[ledType][key]);
|
||||
cb(true, username);
|
||||
} else {
|
||||
const res = await requestLedDeviceProperties(ledType, params);
|
||||
if (res && !res.error) {
|
||||
const ledDeviceProperties = res.info.properties;
|
||||
if (!jQuery.isEmptyObject(ledDeviceProperties)) {
|
||||
|
||||
devicesProperties[ledType][key] = {};
|
||||
devicesProperties[ledType][key][username] = ledDeviceProperties;
|
||||
|
||||
isAPIv2Ready = res.info.isAPIv2Ready;
|
||||
devicesProperties[ledType][key].isAPIv2Ready = isAPIv2Ready;
|
||||
isEntertainmentReady = res.info.isEntertainmentReady;
|
||||
devicesProperties[ledType][key].isEntertainmentReady = isEntertainmentReady;
|
||||
|
||||
updateBridgeDetails(devicesProperties[ledType][key]);
|
||||
if (username === "config") {
|
||||
cb(true);
|
||||
} else {
|
||||
cb(true, username);
|
||||
}
|
||||
} else {
|
||||
cb(false, username);
|
||||
}
|
||||
} else {
|
||||
cb(false, username);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function identify(hostAddress, port, username, name, id, id_v1) {
|
||||
const disabled = $('#btn_wiz_save').is(':disabled');
|
||||
// Take care that new record cannot be save during background process
|
||||
$('#btn_wiz_save').prop('disabled', true);
|
||||
|
||||
let params = { host: decodeURIComponent(hostAddress), username: username, lightName: decodeURIComponent(name), lightId: id, lightId_v1: id_v1 };
|
||||
|
||||
if (port !== 'undefined') {
|
||||
params.port = parseInt(port);
|
||||
}
|
||||
|
||||
await requestLedDeviceIdentification('philipshue', params);
|
||||
|
||||
if (!window.readOnlyMode) {
|
||||
$('#btn_wiz_save').prop('disabled', disabled);
|
||||
}
|
||||
}
|
||||
|
||||
function begin() {
|
||||
const usr = utils.eV("username");
|
||||
if (usr != "") {
|
||||
$('#user').val(usr);
|
||||
}
|
||||
|
||||
const clkey = utils.eV("clientkey");
|
||||
if (clkey != "") {
|
||||
$('#clientkey').val(clkey);
|
||||
}
|
||||
|
||||
//check if host is empty/reachable/search for bridge
|
||||
if (utils.eV("host") == "") {
|
||||
hueIPs = [];
|
||||
hueIPsinc = 0;
|
||||
|
||||
discover();
|
||||
}
|
||||
else {
|
||||
const host = utils.eV("host");
|
||||
$('#host').val(host);
|
||||
|
||||
const port = utils.eV("port");
|
||||
if (port > 0) {
|
||||
$('#port').val(port);
|
||||
}
|
||||
else {
|
||||
$('#port').val('');
|
||||
}
|
||||
hueIPs.push({ host: host, port: port });
|
||||
|
||||
if (usr != "") {
|
||||
checkHueBridge(checkUserResult, usr);
|
||||
} else {
|
||||
checkHueBridge(checkBridgeResult);
|
||||
}
|
||||
}
|
||||
|
||||
$('#retry_bridge').off().on('click', function () {
|
||||
const host = $('#host').val();
|
||||
const port = parseInt($('#port').val());
|
||||
|
||||
if (host != "") {
|
||||
|
||||
const idx = hueIPs.findIndex(item => item.host === host && item.port === port);
|
||||
if (idx === -1) {
|
||||
hueIPs.push({ host: host, port: port });
|
||||
hueIPsinc = hueIPs.length - 1;
|
||||
} else {
|
||||
hueIPsinc = idx;
|
||||
}
|
||||
}
|
||||
else {
|
||||
discover();
|
||||
}
|
||||
|
||||
const usr = $('#user').val();
|
||||
if (usr != "") {
|
||||
checkHueBridge(checkUserResult, usr);
|
||||
} else {
|
||||
checkHueBridge(checkBridgeResult);
|
||||
}
|
||||
});
|
||||
|
||||
$('#retry_usr').off().on('click', function () {
|
||||
checkHueBridge(checkUserResult, $('#user').val());
|
||||
});
|
||||
|
||||
$('#wiz_hue_create_user').off().on('click', function () {
|
||||
createHueUser();
|
||||
});
|
||||
$('#btn_wiz_save').off().on("click", function () {
|
||||
let hueLedConfig = [];
|
||||
let finalLightIds = [];
|
||||
let channelNumber = 0;
|
||||
|
||||
//create hue led config
|
||||
for (const key in groupLights) {
|
||||
const lightId = groupLights[key];
|
||||
|
||||
if ($('#hue_' + lightId).val() != "disabled") {
|
||||
finalLightIds.push(lightId);
|
||||
|
||||
let lightName;
|
||||
if (isAPIv2Ready) {
|
||||
const light = hueLights.find(light => light.id === lightId);
|
||||
lightName = light.metadata.name;
|
||||
} else {
|
||||
lightName = hueLights[lightId].name;
|
||||
}
|
||||
|
||||
const position = $('#hue_' + lightId).val();
|
||||
const lightIdx = groupLights.indexOf(lightId);
|
||||
const lightLocation = groupLightsLocations[lightIdx];
|
||||
|
||||
let serviceID;
|
||||
if (isAPIv2Ready) {
|
||||
serviceID = lightLocation.service.rid;
|
||||
}
|
||||
|
||||
if (position.startsWith("entertainment")) {
|
||||
|
||||
// Layout per entertainment area definition at bridge
|
||||
let isFocusCenter = false;
|
||||
if (position === "entertainment_center") {
|
||||
isFocusCenter = true;
|
||||
}
|
||||
|
||||
if (isAPIv2Ready) {
|
||||
|
||||
groupChannels.forEach((channel) => {
|
||||
if (channel.members[0].service.rid === serviceID) {
|
||||
const layoutObject = assignLightEntertainmentPos(isFocusCenter, channel.position, lightName, channel.channel_id);
|
||||
hueLedConfig.push(JSON.parse(JSON.stringify(layoutObject)));
|
||||
++channelNumber;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
const layoutObject = assignLightEntertainmentPos(isFocusCenter, lightLocation.position, lightName);
|
||||
hueLedConfig.push(JSON.parse(JSON.stringify(layoutObject)));
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Layout per manual settings
|
||||
let maxSegments = 1;
|
||||
|
||||
if (isAPIv2Ready) {
|
||||
const service = hueEntertainmentServices.find(service => service.id === serviceID);
|
||||
maxSegments = service.segments.max_segments;
|
||||
}
|
||||
|
||||
if (maxSegments > 1) {
|
||||
const segment = service.segments.segments;
|
||||
const layoutObjects = assignSegmentedLightPos(segment, position, lightName);
|
||||
hueLedConfig.push(...layoutObjects);
|
||||
} else {
|
||||
const layoutObject = utils.assignLightPos(position, lightName);
|
||||
hueLedConfig.push(JSON.parse(JSON.stringify(layoutObject)));
|
||||
}
|
||||
channelNumber += maxSegments;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let sc = window.serverConfig;
|
||||
sc.leds = hueLedConfig;
|
||||
|
||||
//Adjust gamma, brightness and compensation
|
||||
let c = sc.color.channelAdjustment[0];
|
||||
c.gammaBlue = 1.0;
|
||||
c.gammaRed = 1.0;
|
||||
c.gammaGreen = 1.0;
|
||||
c.brightness = 100;
|
||||
c.brightnessCompensation = 0;
|
||||
|
||||
//device config
|
||||
|
||||
//Start with a clean configuration
|
||||
let d = {};
|
||||
d.host = $('#host').val();
|
||||
d.port = parseInt($('#port').val());
|
||||
d.username = $('#user').val();
|
||||
d.type = 'philipshue';
|
||||
d.colorOrder = 'rgb';
|
||||
d.lightIds = finalLightIds;
|
||||
d.transitiontime = parseInt(utils.eV("transitiontime", 1));
|
||||
d.restoreOriginalState = utils.eV("restoreOriginalState", false);
|
||||
d.switchOffOnBlack = utils.eV("switchOffOnBlack", false);
|
||||
|
||||
d.blackLevel = parseFloat(utils.eV("blackLevel", 0.009));
|
||||
d.onBlackTimeToPowerOff = parseInt(utils.eV("onBlackTimeToPowerOff", 600));
|
||||
d.onBlackTimeToPowerOn = parseInt(utils.eV("onBlackTimeToPowerOn", 300));
|
||||
d.brightnessFactor = parseFloat(utils.eV("brightnessFactor", 1));
|
||||
|
||||
d.clientkey = $('#clientkey').val();
|
||||
d.groupId = $('#groupId').val();
|
||||
d.blackLightsTimeout = parseInt(utils.eV("blackLightsTimeout", 5000));
|
||||
d.brightnessMin = parseFloat(utils.eV("brightnessMin", 0));
|
||||
d.brightnessMax = parseFloat(utils.eV("brightnessMax", 1));
|
||||
d.brightnessThreshold = parseFloat(utils.eV("brightnessThreshold", 0.0001));
|
||||
d.handshakeTimeoutMin = parseInt(utils.eV("handshakeTimeoutMin", 300));
|
||||
d.handshakeTimeoutMax = parseInt(utils.eV("handshakeTimeoutMax", 1000));
|
||||
d.verbose = utils.eV("verbose");
|
||||
|
||||
d.autoStart = conf_editor.getEditor("root.generalOptions.autoStart").getValue();
|
||||
d.enableAttempts = parseInt(conf_editor.getEditor("root.generalOptions.enableAttempts").getValue());
|
||||
d.enableAttemptsInterval = parseInt(conf_editor.getEditor("root.generalOptions.enableAttemptsInterval").getValue());
|
||||
|
||||
d.useEntertainmentAPI = isEntertainmentReady;
|
||||
d.useAPIv2 = isAPIv2Ready;
|
||||
|
||||
if (isEntertainmentReady) {
|
||||
d.hardwareLedCount = channelNumber;
|
||||
if (window.serverConfig.device.type !== d.type) {
|
||||
//smoothing on, if new device
|
||||
sc.smoothing = { enable: true };
|
||||
}
|
||||
} else {
|
||||
d.hardwareLedCount = finalLightIds.length;
|
||||
d.verbose = false;
|
||||
if (window.serverConfig.device.type !== d.type) {
|
||||
//smoothing off, if new device
|
||||
sc.smoothing = { enable: false };
|
||||
}
|
||||
}
|
||||
|
||||
window.serverConfig.device = d;
|
||||
|
||||
requestWriteConfig(sc, true);
|
||||
resetWizard();
|
||||
});
|
||||
|
||||
$('#btn_wiz_abort').off().on('click', resetWizard);
|
||||
}
|
||||
|
||||
function createHueUser() {
|
||||
const host = hueIPs[hueIPsinc].host;
|
||||
const port = hueIPs[hueIPsinc].port;
|
||||
|
||||
let params = { host: host };
|
||||
if (port !== 'undefined') {
|
||||
params.port = parseInt(port);
|
||||
}
|
||||
|
||||
let retryTime = 30;
|
||||
const retryInterval = 2;
|
||||
|
||||
const UserInterval = setInterval(function () {
|
||||
|
||||
$('#wizp1').toggle(false);
|
||||
$('#wizp2').toggle(false);
|
||||
$('#wizp3').toggle(true);
|
||||
|
||||
(async () => {
|
||||
|
||||
retryTime -= retryInterval;
|
||||
$("#connectionTime").html(retryTime);
|
||||
if (retryTime <= 0) {
|
||||
abortConnection(UserInterval);
|
||||
clearInterval(UserInterval);
|
||||
}
|
||||
else {
|
||||
const res = await requestLedDeviceAddAuthorization('philipshue', params);
|
||||
if (res && !res.error) {
|
||||
const response = res.info;
|
||||
|
||||
if (jQuery.isEmptyObject(response)) {
|
||||
debugMessage(retryTime + ": link button not pressed or device not reachable");
|
||||
} else {
|
||||
$('#wizp1').toggle(false);
|
||||
$('#wizp2').toggle(true);
|
||||
$('#wizp3').toggle(false);
|
||||
|
||||
const username = response.username;
|
||||
if (username != 'undefined') {
|
||||
$('#user').val(username);
|
||||
conf_editor.getEditor("root.specificOptions.username").setValue(username);
|
||||
conf_editor.getEditor("root.specificOptions.host").setValue(host);
|
||||
conf_editor.getEditor("root.specificOptions.port").setValue(port);
|
||||
}
|
||||
|
||||
if (isEntertainmentReady) {
|
||||
const clientkey = response.clientkey;
|
||||
if (clientkey != 'undefined') {
|
||||
$('#clientkey').val(clientkey);
|
||||
conf_editor.getEditor("root.specificOptions.clientkey").setValue(clientkey);
|
||||
}
|
||||
}
|
||||
checkHueBridge(checkUserResult, username);
|
||||
clearInterval(UserInterval);
|
||||
}
|
||||
} else {
|
||||
$('#wizp1').toggle(false);
|
||||
$('#wizp2').toggle(true);
|
||||
$('#wizp3').toggle(false);
|
||||
clearInterval(UserInterval);
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
||||
}, retryInterval * 1000);
|
||||
}
|
||||
|
||||
function get_hue_groups(username) {
|
||||
const host = hueIPs[hueIPsinc].host;
|
||||
|
||||
if (devicesProperties['philipshue'][host] && devicesProperties['philipshue'][host][username]) {
|
||||
const ledProperties = devicesProperties['philipshue'][host][username];
|
||||
|
||||
if (isAPIv2Ready) {
|
||||
if (!jQuery.isEmptyObject(ledProperties.data)) {
|
||||
if (Object.keys(ledProperties.data).length > 0) {
|
||||
hueEntertainmentConfigs = ledProperties.data.filter(config => {
|
||||
return config.type === "entertainment_configuration";
|
||||
});
|
||||
hueEntertainmentServices = ledProperties.data.filter(config => {
|
||||
return (config.type === "entertainment" && config.renderer === true);
|
||||
});
|
||||
}
|
||||
}
|
||||
} else if (!jQuery.isEmptyObject(ledProperties.groups)) {
|
||||
hueEntertainmentConfigs = [];
|
||||
let hueGroups = ledProperties.groups;
|
||||
for (const groupid in hueGroups) {
|
||||
if (hueGroups[groupid].type == 'Entertainment') {
|
||||
hueGroups[groupid].id = groupid;
|
||||
hueEntertainmentConfigs.push(hueGroups[groupid]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Object.keys(hueEntertainmentConfigs).length > 0) {
|
||||
|
||||
$('.lidsb').html("");
|
||||
$('#wh_topcontainer').toggle(false);
|
||||
$('#hue_grp_ids_t').toggle(true);
|
||||
|
||||
for (const groupid in hueEntertainmentConfigs) {
|
||||
$('.gidsb').append(createTableRow([groupid + ' (' + hueEntertainmentConfigs[groupid].name + ')',
|
||||
'<button class="btn btn-sm btn-primary btn-group" data-groupid="' + groupid + '" data-username="' + username + '")>'
|
||||
+ $.i18n('wiz_hue_e_use_group') + '</button>']));
|
||||
}
|
||||
attachGroupButtonEvent();
|
||||
|
||||
} else {
|
||||
noAPISupport('wiz_hue_e_noegrpids', username);
|
||||
}
|
||||
}
|
||||
}
|
||||
function attachIdentifyButtonEvent() {
|
||||
$('#wizp2_body').on('click', '.btn-identify', function () {
|
||||
const hostname = $(this).data('hostname');
|
||||
const port = $(this).data('port');
|
||||
const user = $(this).data('user');
|
||||
const lightName = $(this).data('light-name');
|
||||
const lightId = $(this).data('light-id');
|
||||
const lightId_v1 = $(this).data('light-id-v1');
|
||||
|
||||
identify(hostname, port, user, lightName, lightId, lightId_v1);
|
||||
});
|
||||
}
|
||||
function attachGroupButtonEvent() {
|
||||
$('#wizp2_body').on('click', '.btn-group', function () {
|
||||
const groupid = $(this).data('groupid');
|
||||
const username = $(this).data('username');
|
||||
|
||||
useGroupId(groupid, username);
|
||||
});
|
||||
}
|
||||
|
||||
function noAPISupport(txt, username) {
|
||||
showNotification('danger', $.i18n('wiz_hue_e_title'), $.i18n('wiz_hue_e_noapisupport_hint'));
|
||||
conf_editor.getEditor("root.specificOptions.useEntertainmentAPI").setValue(false);
|
||||
$("#root_specificOptions_useEntertainmentAPI").trigger("change");
|
||||
$('#btn_wiz_holder').append('<div class="bs-callout bs-callout-danger" style="margin-top:0px">' + $.i18n('wiz_hue_e_noapisupport_hint') + '</div>');
|
||||
$('#hue_grp_ids_t').toggle(false);
|
||||
const errorMessage = txt ? $.i18n(txt) : $.i18n('wiz_hue_e_nogrpids');
|
||||
$('<p style="font-weight:bold;color:red;">' + errorMessage + '<br />' + $.i18n('wiz_hue_e_noapisupport') + '</p>').insertBefore('#wizp2_body #hue_ids_t');
|
||||
$('#hue_id_headline').html($.i18n('wiz_hue_desc2'));
|
||||
|
||||
get_hue_lights(username);
|
||||
}
|
||||
|
||||
function get_hue_lights(username) {
|
||||
const host = hueIPs[hueIPsinc].host;
|
||||
|
||||
if (devicesProperties['philipshue'][host] && devicesProperties['philipshue'][host][username]) {
|
||||
const ledProperties = devicesProperties['philipshue'][host][username];
|
||||
|
||||
if (isAPIv2Ready) {
|
||||
if (!jQuery.isEmptyObject(ledProperties.data)) {
|
||||
if (Object.keys(ledProperties.data).length > 0) {
|
||||
hueLights = ledProperties.data.filter(config => {
|
||||
return config.type === "light";
|
||||
});
|
||||
}
|
||||
}
|
||||
} else if (!jQuery.isEmptyObject(ledProperties.lights)) {
|
||||
hueLights = ledProperties.lights;
|
||||
}
|
||||
|
||||
if (Object.keys(hueLights).length > 0) {
|
||||
if (!isEntertainmentReady) {
|
||||
$('#wh_topcontainer').toggle(false);
|
||||
}
|
||||
$('#hue_ids_t, #btn_wiz_save').toggle(true);
|
||||
|
||||
const lightOptions = [
|
||||
"top", "topleft", "topright",
|
||||
"bottom", "bottomleft", "bottomright",
|
||||
"left", "lefttop", "leftmiddle", "leftbottom",
|
||||
"right", "righttop", "rightmiddle", "rightbottom",
|
||||
"entire",
|
||||
"lightPosTopLeft112", "lightPosTopLeftNewMid", "lightPosTopLeft121",
|
||||
"lightPosBottomLeft14", "lightPosBottomLeft12", "lightPosBottomLeft34", "lightPosBottomLeft11",
|
||||
"lightPosBottomLeft112", "lightPosBottomLeftNewMid", "lightPosBottomLeft121"
|
||||
];
|
||||
|
||||
if (isEntertainmentReady) {
|
||||
lightOptions.unshift("entertainment_center");
|
||||
lightOptions.unshift("entertainment");
|
||||
} else {
|
||||
lightOptions.unshift("disabled");
|
||||
groupLights = Object.keys(hueLights);
|
||||
}
|
||||
|
||||
$('.lidsb').html("");
|
||||
|
||||
let pos = "";
|
||||
for (const id in groupLights) {
|
||||
const lightId = groupLights[id];
|
||||
let lightId_v1 = "/lights/" + lightId;
|
||||
|
||||
let lightName;
|
||||
if (isAPIv2Ready) {
|
||||
const light = hueLights.find(light => light.id === lightId);
|
||||
lightName = light.metadata.name;
|
||||
lightId_v1 = light.id_v1;
|
||||
} else {
|
||||
lightName = hueLights[lightId].name;
|
||||
}
|
||||
|
||||
if (isEntertainmentReady) {
|
||||
let lightLocation = {};
|
||||
lightLocation = groupLightsLocations[id];
|
||||
if (lightLocation) {
|
||||
if (isAPIv2Ready) {
|
||||
pos = 0;
|
||||
} else {
|
||||
const x = lightLocation.position.x;
|
||||
const y = lightLocation.position.y;
|
||||
const z = lightLocation.position.z;
|
||||
|
||||
let xval = (x < 0) ? "left" : "right";
|
||||
if (z != 1 && x >= -0.25 && x <= 0.25) xval = "";
|
||||
switch (z) {
|
||||
case 1: // top / Ceiling height
|
||||
pos = "top" + xval;
|
||||
break;
|
||||
case 0: // middle / TV height
|
||||
pos = (xval == "" && y >= 0.75) ? "bottom" : xval + "middle";
|
||||
break;
|
||||
case -1: // bottom / Ground height
|
||||
pos = xval + "bottom";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let options = "";
|
||||
for (const opt in lightOptions) {
|
||||
const val = lightOptions[opt];
|
||||
const txt = (val != 'entire' && val != 'disabled') ? 'conf_leds_layout_cl_' : 'wiz_ids_';
|
||||
options += '<option value="' + val + '"';
|
||||
if (pos == val) options += ' selected="selected"';
|
||||
options += '>' + $.i18n(txt + val) + '</option>';
|
||||
}
|
||||
|
||||
$('.lidsb').append(createTableRow([id + ' (' + lightName + ')',
|
||||
'<select id="hue_' + lightId + '" class="hue_sel_watch form-control">'
|
||||
+ options
|
||||
+ '</select>',
|
||||
'<button class="btn btn-sm btn-primary btn-identify" data-hostname="' + encodeURIComponent($(" #host").val()) + '" data-port="' + $('#port').val() + '" data-user="' + $("#user").val() + '" data-light-name="' + encodeURIComponent(lightName) + '" data-light-id="' + lightId + '" data-light-id-v1="' + lightId_v1 + '">'
|
||||
+ $.i18n('wiz_hue_blinkblue', id)
|
||||
+ '</button>']));
|
||||
}
|
||||
attachIdentifyButtonEvent();
|
||||
|
||||
if (!isEntertainmentReady) {
|
||||
$('.hue_sel_watch').on("change", function () {
|
||||
let cC = 0;
|
||||
for (const key in hueLights) {
|
||||
if ($('#hue_' + key).val() != "disabled") {
|
||||
cC++;
|
||||
}
|
||||
}
|
||||
|
||||
(cC == 0 || window.readOnlyMode) ? $('#btn_wiz_save').prop("disabled", true) : $('#btn_wiz_save').prop("disabled", false);
|
||||
});
|
||||
}
|
||||
$('.hue_sel_watch').trigger('change');
|
||||
}
|
||||
else {
|
||||
const txt = '<p style="font-weight:bold;color:red;">' + $.i18n('wiz_hue_noids') + '</p>';
|
||||
$('#wizp2_body').append(txt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function abortConnection(UserInterval) {
|
||||
clearInterval(UserInterval);
|
||||
$('#wizp1').toggle(false);
|
||||
$('#wizp2').toggle(true);
|
||||
$('#wizp3').toggle(false);
|
||||
$("#wiz_hue_usrstate").html($.i18n('wiz_hue_failure_connection'));
|
||||
}
|
||||
|
||||
return {
|
||||
start: function (e) {
|
||||
//create html
|
||||
const hue_title = 'wiz_hue_title';
|
||||
const hue_intro1 = 'wiz_hue_e_intro1';
|
||||
const hue_desc1 = 'wiz_hue_desc1';
|
||||
const hue_create_user = 'wiz_hue_create_user';
|
||||
|
||||
$('#wiz_header').html('<i class="fa fa-magic fa-fw"></i>' + $.i18n(hue_title));
|
||||
$('#wizp1_body').html('<h4 style="font-weight:bold;text-transform:uppercase;">' + $.i18n(hue_title) + '</h4><p>' + $.i18n(hue_intro1) + '</p>');
|
||||
$('#wizp1_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_cont"><i class="fa fa-fw fa-check"></i>' + $.i18n('general_btn_continue') + '</button><button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-fw fa-close"></i>' + $.i18n('general_btn_cancel') + '</button>');
|
||||
$('#wizp2_body').html('<div id="wh_topcontainer"></div>');
|
||||
|
||||
let topContainer_html = '<p class="text-left" style="font-weight:bold">' + $.i18n(hue_desc1) + '</p>' +
|
||||
'<div class="row">' +
|
||||
'<div class="col-md-2">' +
|
||||
' <p class="text-left">' + $.i18n('wiz_hue_ip') + '</p></div>' +
|
||||
' <div class="col-md-7"><div class="input-group">' +
|
||||
' <span class="input-group-addon" id="retry_bridge" style="cursor:pointer"><i class="fa fa-refresh"></i></span>' +
|
||||
' <select id="hue_bridge_select" class="hue_bridge_sel_watch form-control">' + '</select>' + '</div></div>' +
|
||||
' <div class="col-md-7"><div class="input-group">' +
|
||||
' <span class="input-group-addon"><i class="fa fa-arrow-right"></i></span>' +
|
||||
' <input type="text" class="input-group form-control" id="host" placeholder="' + $.i18n('wiz_hue_ip') + '"></div></div>';
|
||||
|
||||
if (storedAccess === 'expert') {
|
||||
topContainer_html += '<div class="col-md-3"><div class="input-group">' +
|
||||
'<span class="input-group-addon">:</span>' +
|
||||
'<input type="text" class="input-group form-control" id="port" placeholder="' + $.i18n('edt_conf_general_port_title') + '"></div></div>';
|
||||
}
|
||||
|
||||
topContainer_html += '</div><p><span style="font-weight:bold;color:red" id="wiz_hue_ipstate"></span><span style="font-weight:bold;" id="wiz_hue_discovered"></span></p>';
|
||||
topContainer_html += '<div class="form-group" id="usrcont" style="display:none"></div>';
|
||||
|
||||
$('#wh_topcontainer').append(topContainer_html);
|
||||
|
||||
$('#usrcont').append('<div class="row"><div class="col-md-2"><p class="text-left">' + $.i18n('wiz_hue_username') + '</p ></div>' +
|
||||
'<div class="col-md-7">' +
|
||||
'<div class="input-group">' +
|
||||
' <span class="input-group-addon" id="retry_usr" style="cursor:pointer"><i class="fa fa-refresh"></i></span>' +
|
||||
' <input type="text" class="input-group form-control" id="user">' +
|
||||
'</div></div></div><br>' +
|
||||
'</div><input type="hidden" id="groupId">'
|
||||
);
|
||||
|
||||
$('#usrcont').append('<div id="hue_client_key_r" class="row"><div class="col-md-2"><p class="text-left">' + $.i18n('wiz_hue_clientkey') +
|
||||
'</p></div><div class="col-md-7"><input class="form-control" id="clientkey" type="text"></div></div><br>');
|
||||
|
||||
$('#usrcont').append('<p><span style="font-weight:bold;color:red" id="wiz_hue_usrstate"></span></p>' +
|
||||
'<button type="button" class="btn btn-primary" style="display:none" id="wiz_hue_create_user"> <i class="fa fa-fw fa-plus"></i>' + $.i18n(hue_create_user) + '</button>');
|
||||
|
||||
$('#wizp2_body').append('<div id="hue_grp_ids_t" style="display:none"><p class="text-left" style="font-weight:bold">' + $.i18n('wiz_hue_e_desc2') + '</p></div>');
|
||||
createTable("gidsh", "gidsb", "hue_grp_ids_t");
|
||||
$('.gidsh').append(createTableRow([$.i18n('edt_dev_spec_groupId_title'), ""], true));
|
||||
|
||||
$('#wizp2_body').append('<div id="hue_ids_t" style="display:none"><p class="text-left" style="font-weight:bold" id="hue_id_headline">' + $.i18n('wiz_hue_e_desc3') + '</p></div>');
|
||||
|
||||
createTable("lidsh", "lidsb", "hue_ids_t");
|
||||
$('.lidsh').append(createTableRow([$.i18n('edt_dev_spec_lightid_title'), $.i18n('wiz_pos'), $.i18n('wiz_identify')], true));
|
||||
$('#wizp2_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_save" style="display:none"><i class="fa fa-fw fa-save"></i>' + $.i18n('general_btn_save') + '</button><button type="button" class="btn btn-danger" id="btn_wiz_abort"><i class="fa fa-fw fa-close"></i>' + $.i18n('general_btn_cancel') + '</button>');
|
||||
$('#wizp3_body').html('<span>' + $.i18n('wiz_hue_press_link') + '</span> <br /><br /><center><span id="connectionTime"></span><br /><i class="fa fa-cog fa-spin" style="font-size:100px"></i></center>');
|
||||
|
||||
if (getStorage("darkMode") == "on")
|
||||
$('#wizard_logo').attr("src", 'img/hyperion/logo_negativ.png');
|
||||
|
||||
//open modal
|
||||
$("#wizard_modal").modal({
|
||||
backdrop: "static",
|
||||
keyboard: false,
|
||||
show: true
|
||||
});
|
||||
|
||||
//listen for continue
|
||||
$('#btn_wiz_cont').off().on('click', function () {
|
||||
begin();
|
||||
$('#wizp1').toggle(false);
|
||||
$('#wizp2').toggle(true);
|
||||
});
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
export { philipshueWizard }
|
||||
|
60
assets/webconfig/js/wizards/LedDevice_utils.js
Normal file
60
assets/webconfig/js/wizards/LedDevice_utils.js
Normal file
@@ -0,0 +1,60 @@
|
||||
|
||||
const ledDeviceWizardUtils = (() => {
|
||||
|
||||
// Layout positions
|
||||
const positionMap = {
|
||||
"top": { hmin: 0.15, hmax: 0.85, vmin: 0, vmax: 0.2 },
|
||||
"topleft": { hmin: 0, hmax: 0.15, vmin: 0, vmax: 0.15 },
|
||||
"topright": { hmin: 0.85, hmax: 1.0, vmin: 0, vmax: 0.15 },
|
||||
"bottom": { hmin: 0.15, hmax: 0.85, vmin: 0.8, vmax: 1.0 },
|
||||
"bottomleft": { hmin: 0, hmax: 0.15, vmin: 0.85, vmax: 1.0 },
|
||||
"bottomright": { hmin: 0.85, hmax: 1.0, vmin: 0.85, vmax: 1.0 },
|
||||
"left": { hmin: 0, hmax: 0.15, vmin: 0.15, vmax: 0.85 },
|
||||
"lefttop": { hmin: 0, hmax: 0.15, vmin: 0, vmax: 0.5 },
|
||||
"leftmiddle": { hmin: 0, hmax: 0.15, vmin: 0.25, vmax: 0.75 },
|
||||
"leftbottom": { hmin: 0, hmax: 0.15, vmin: 0.5, vmax: 1.0 },
|
||||
"right": { hmin: 0.85, hmax: 1.0, vmin: 0.15, vmax: 0.85 },
|
||||
"righttop": { hmin: 0.85, hmax: 1.0, vmin: 0, vmax: 0.5 },
|
||||
"rightmiddle": { hmin: 0.85, hmax: 1.0, vmin: 0.25, vmax: 0.75 },
|
||||
"rightbottom": { hmin: 0.85, hmax: 1.0, vmin: 0.5, vmax: 1.0 },
|
||||
"lightPosBottomLeft14": { hmin: 0, hmax: 0.25, vmin: 0.85, vmax: 1.0 },
|
||||
"lightPosBottomLeft12": { hmin: 0.25, hmax: 0.5, vmin: 0.85, vmax: 1.0 },
|
||||
"lightPosBottomLeft34": { hmin: 0.5, hmax: 0.75, vmin: 0.85, vmax: 1.0 },
|
||||
"lightPosBottomLeft11": { hmin: 0.75, hmax: 1, vmin: 0.85, vmax: 1.0 },
|
||||
"lightPosBottomLeft112": { hmin: 0, hmax: 0.5, vmin: 0.85, vmax: 1.0 },
|
||||
"lightPosBottomLeft121": { hmin: 0.5, hmax: 1, vmin: 0.85, vmax: 1.0 },
|
||||
"lightPosBottomLeftNewMid": { hmin: 0.25, hmax: 0.75, vmin: 0.85, vmax: 1.0 },
|
||||
"lightPosTopLeft112": { hmin: 0, hmax: 0.5, vmin: 0, vmax: 0.15 },
|
||||
"lightPosTopLeft121": { hmin: 0.5, hmax: 1, vmin: 0, vmax: 0.15 },
|
||||
"lightPosTopLeftNewMid": { hmin: 0.25, hmax: 0.75, vmin: 0, vmax: 0.15 },
|
||||
"lightPosEntire": { hmin: 0.0, hmax: 1.0, vmin: 0.0, vmax: 1.0 }
|
||||
};
|
||||
|
||||
return {
|
||||
|
||||
//return editor Value
|
||||
eV: function (vn, defaultVal = "") {
|
||||
let editor = null;
|
||||
if (vn) {
|
||||
editor = conf_editor.getEditor("root.specificOptions." + vn);
|
||||
}
|
||||
|
||||
if (editor === null) {
|
||||
return defaultVal;
|
||||
} else if (defaultVal !== "" && !isNaN(defaultVal) && isNaN(editor.getValue())) {
|
||||
return defaultVal;
|
||||
} else {
|
||||
return editor.getValue();
|
||||
}
|
||||
},
|
||||
assignLightPos: function (pos, name) {
|
||||
// Retrieve the corresponding position object from the positionMap
|
||||
const i = positionMap[pos] || positionMap["lightPosEntire"];
|
||||
i.name = name;
|
||||
return i;
|
||||
}
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
export { ledDeviceWizardUtils };
|
300
assets/webconfig/js/wizards/LedDevice_yeelight.js
Normal file
300
assets/webconfig/js/wizards/LedDevice_yeelight.js
Normal file
@@ -0,0 +1,300 @@
|
||||
//****************************
|
||||
// Wizard Yeelight
|
||||
//****************************
|
||||
|
||||
import { ledDeviceWizardUtils as utils } from './LedDevice_utils.js';
|
||||
|
||||
const yeelightWizard = (() => {
|
||||
|
||||
const lights = [];
|
||||
let configuredLights = conf_editor.getEditor("root.specificOptions.lights").getValue();
|
||||
|
||||
function getHostInLights(hostname) {
|
||||
return lights.filter(
|
||||
function (lights) {
|
||||
return lights.host === hostname
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function begin() {
|
||||
discover();
|
||||
|
||||
$('#btn_wiz_save').off().on("click", function () {
|
||||
let ledConfig = [];
|
||||
let finalLights = [];
|
||||
|
||||
//create yeelight led config
|
||||
for (const key in lights) {
|
||||
if ($('#yee_' + key).val() !== "disabled") {
|
||||
|
||||
let name = lights[key].name;
|
||||
// Set Name to layout-position, if empty
|
||||
if (name === "") {
|
||||
name = lights[key].host;
|
||||
}
|
||||
|
||||
finalLights.push(lights[key]);
|
||||
|
||||
const idx_content = utils.assignLightPos($('#yee_' + key).val(), name);
|
||||
ledConfig.push(JSON.parse(JSON.stringify(idx_content)));
|
||||
}
|
||||
}
|
||||
|
||||
//LED layout
|
||||
window.serverConfig.leds = ledConfig;
|
||||
|
||||
//LED device config
|
||||
const currentDeviceType = window.serverConfig.device.type;
|
||||
|
||||
//Start with a clean configuration
|
||||
let d = {};
|
||||
|
||||
d.type = 'yeelight';
|
||||
d.hardwareLedCount = finalLights.length;
|
||||
d.colorOrder = conf_editor.getEditor("root.generalOptions.colorOrder").getValue();
|
||||
d.colorModel = parseInt(conf_editor.getEditor("root.specificOptions.colorModel").getValue());
|
||||
|
||||
d.transEffect = parseInt(conf_editor.getEditor("root.specificOptions.transEffect").getValue());
|
||||
d.transTime = parseInt(conf_editor.getEditor("root.specificOptions.transTime").getValue());
|
||||
d.extraTimeDarkness = parseInt(conf_editor.getEditor("root.specificOptions.extraTimeDarkness").getValue());
|
||||
|
||||
d.brightnessMin = parseInt(conf_editor.getEditor("root.specificOptions.brightnessMin").getValue());
|
||||
d.brightnessSwitchOffOnMinimum = JSON.parse(conf_editor.getEditor("root.specificOptions.brightnessSwitchOffOnMinimum").getValue());
|
||||
d.brightnessMax = parseInt(conf_editor.getEditor("root.specificOptions.brightnessMax").getValue());
|
||||
d.brightnessFactor = parseFloat(conf_editor.getEditor("root.specificOptions.brightnessFactor").getValue());
|
||||
|
||||
d.latchTime = parseInt(conf_editor.getEditor("root.specificOptions.latchTime").getValue());;
|
||||
d.debugLevel = parseInt(conf_editor.getEditor("root.specificOptions.debugLevel").getValue());
|
||||
|
||||
d.lights = finalLights;
|
||||
|
||||
window.serverConfig.device = d;
|
||||
|
||||
if (currentDeviceType !== d.type) {
|
||||
//smoothing off, if new device
|
||||
window.serverConfig.smoothing = { enable: false };
|
||||
}
|
||||
|
||||
requestWriteConfig(window.serverConfig, true);
|
||||
resetWizard();
|
||||
});
|
||||
|
||||
$('#btn_wiz_abort').off().on('click', resetWizard);
|
||||
}
|
||||
|
||||
async function discover() {
|
||||
// Get discovered lights
|
||||
const res = await requestLedDeviceDiscovery('yeelight');
|
||||
if (res && !res.error) {
|
||||
const r = res.info;
|
||||
|
||||
let discoveryMethod = "ssdp";
|
||||
if (res.info.discoveryMethod) {
|
||||
discoveryMethod = res.info.discoveryMethod;
|
||||
}
|
||||
|
||||
// Process devices returned by discovery
|
||||
for (const device of r.devices) {
|
||||
if (device.hostname !== "") {
|
||||
processDiscoverdDevice(device, discoveryMethod);
|
||||
}
|
||||
}
|
||||
|
||||
// Add additional items from configuration
|
||||
for (const configuredLight of configuredLights) {
|
||||
processConfiguredLight(configuredLight);
|
||||
}
|
||||
|
||||
assign_lights();
|
||||
}
|
||||
}
|
||||
|
||||
function processDiscoverdDevice(device, discoveryMethod) {
|
||||
if (getHostInLights(device.hostname).length > 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const light = {
|
||||
host: device.hostname
|
||||
};
|
||||
|
||||
if (discoveryMethod === "ssdp") {
|
||||
if (device.domain) {
|
||||
light.host += '.' + device.domain;
|
||||
}
|
||||
} else {
|
||||
light.host = device.service;
|
||||
light.name = device.name;
|
||||
}
|
||||
|
||||
light.port = device.port;
|
||||
|
||||
if (device.txt) {
|
||||
light.model = device.txt.md;
|
||||
light.port = 55443; // Yeelight default port
|
||||
} else {
|
||||
light.name = device.other.name;
|
||||
light.model = device.other.model;
|
||||
}
|
||||
|
||||
lights.push(light);
|
||||
}
|
||||
function processConfiguredLight(configuredLight) {
|
||||
const host = configuredLight.host;
|
||||
let port = configuredLight.port || 0;
|
||||
|
||||
if (host !== "" && getHostInLights(host).length === 0) {
|
||||
const light = {
|
||||
host: host,
|
||||
port: port,
|
||||
name: configuredLight.name,
|
||||
model: "color4"
|
||||
};
|
||||
|
||||
lights.push(light);
|
||||
}
|
||||
}
|
||||
|
||||
function attachIdentifyButtonEvent() {
|
||||
$('#wizp2_body').on('click', '.btn-identify', function () {
|
||||
const hostname = $(this).data('hostname');
|
||||
const port = $(this).data('port');
|
||||
identify(hostname, port);
|
||||
});
|
||||
}
|
||||
|
||||
function assign_lights() {
|
||||
// Model mappings, see https://www.home-assistant.io/integrations/yeelight/
|
||||
const models = ['color', 'color1', 'YLDP02YL', 'YLDP02YL', 'color2', 'YLDP06YL', 'color4', 'YLDP13YL', 'color6', 'YLDP13AYL', 'colorb', "YLDP005", 'colorc', "YLDP004-A", 'stripe', 'YLDD04YL', 'strip1', 'YLDD01YL', 'YLDD02YL', 'strip4', 'YLDD05YL', 'strip6', 'YLDD05YL'];
|
||||
|
||||
// If records are left for configuration
|
||||
if (Object.keys(lights).length > 0) {
|
||||
$('#wh_topcontainer').toggle(false);
|
||||
$('#yee_ids_t, #btn_wiz_save').toggle(true);
|
||||
|
||||
const lightOptions = [
|
||||
"top", "topleft", "topright",
|
||||
"bottom", "bottomleft", "bottomright",
|
||||
"left", "lefttop", "leftmiddle", "leftbottom",
|
||||
"right", "righttop", "rightmiddle", "rightbottom",
|
||||
"entire",
|
||||
"lightPosTopLeft112", "lightPosTopLeftNewMid", "lightPosTopLeft121",
|
||||
"lightPosBottomLeft14", "lightPosBottomLeft12", "lightPosBottomLeft34", "lightPosBottomLeft11",
|
||||
"lightPosBottomLeft112", "lightPosBottomLeftNewMid", "lightPosBottomLeft121"
|
||||
];
|
||||
|
||||
lightOptions.unshift("disabled");
|
||||
|
||||
$('.lidsb').html("");
|
||||
let pos = "";
|
||||
|
||||
for (const lightid in lights) {
|
||||
const lightHostname = lights[lightid].host;
|
||||
const lightPort = lights[lightid].port;
|
||||
let lightName = lights[lightid].name;
|
||||
|
||||
if (lightName === "")
|
||||
lightName = $.i18n('edt_dev_spec_lights_itemtitle') + '(' + lightHostname + ')';
|
||||
|
||||
let options = "";
|
||||
for (const opt in lightOptions) {
|
||||
const val = lightOptions[opt];
|
||||
const txt = (val !== 'entire' && val !== 'disabled') ? 'conf_leds_layout_cl_' : 'wiz_ids_';
|
||||
options += '<option value="' + val + '"';
|
||||
if (pos === val) options += ' selected="selected"';
|
||||
options += '>' + $.i18n(txt + val) + '</option>';
|
||||
}
|
||||
|
||||
let enabled = 'enabled';
|
||||
if (!models.includes(lights[lightid].model)) {
|
||||
enabled = 'disabled';
|
||||
options = '<option value=disabled>' + $.i18n('wiz_yeelight_unsupported') + '</option>';
|
||||
}
|
||||
|
||||
$('.lidsb').append(createTableRow([(parseInt(lightid, 10) + 1) + '. ' + lightName, '<select id="yee_' + lightid + '" ' + enabled + ' class="yee_sel_watch form-control">'
|
||||
+ options
|
||||
+ '</select>', '<button class="btn btn-sm btn-primary btn-identify" data-hostname="' + lightHostname + '" data-port="' + lightPort + '")>'
|
||||
+ $.i18n('wiz_identify') + '</button>']));
|
||||
}
|
||||
attachIdentifyButtonEvent();
|
||||
|
||||
$('.yee_sel_watch').on("change", function () {
|
||||
let cC = 0;
|
||||
for (const key in lights) {
|
||||
if ($('#yee_' + key).val() !== "disabled") {
|
||||
cC++;
|
||||
}
|
||||
}
|
||||
|
||||
if (cC === 0 || window.readOnlyMode)
|
||||
$('#btn_wiz_save').prop("disabled", true);
|
||||
else
|
||||
$('#btn_wiz_save').prop("disabled", false);
|
||||
});
|
||||
$('.yee_sel_watch').trigger('change');
|
||||
}
|
||||
else {
|
||||
const noLightsTxt = '<p style="font-weight:bold;color:red;">' + $.i18n('wiz_noLights', 'lights') + '</p>';
|
||||
$('#wizp2_body').append(noLightsTxt);
|
||||
}
|
||||
}
|
||||
|
||||
async function identify(host, port) {
|
||||
|
||||
const disabled = $('#btn_wiz_save').is(':disabled');
|
||||
|
||||
// Take care that new record cannot be save during background process
|
||||
$('#btn_wiz_save').prop('disabled', true);
|
||||
|
||||
const params = { host: host, port: port };
|
||||
await requestLedDeviceIdentification("yeelight", params);
|
||||
|
||||
if (!window.readOnlyMode) {
|
||||
$('#btn_wiz_save').prop('disabled', disabled);
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
start: function (e) {
|
||||
//create html
|
||||
const yeelight_title = 'wiz_yeelight_title';
|
||||
const yeelight_intro1 = 'wiz_yeelight_intro1';
|
||||
|
||||
$('#wiz_header').html('<i class="fa fa-magic fa-fw"></i>' + $.i18n(yeelight_title));
|
||||
$('#wizp1_body').html('<h4 style="font-weight:bold;text-transform:uppercase;">' + $.i18n(yeelight_title) + '</h4><p>' + $.i18n(yeelight_intro1) + '</p>');
|
||||
|
||||
$('#wizp1_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_cont"><i class="fa fa-fw fa-check"></i>'
|
||||
+ $.i18n('general_btn_continue') + '</button><button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-fw fa-close"></i>'
|
||||
+ $.i18n('general_btn_cancel') + '</button>');
|
||||
|
||||
$('#wizp2_body').html('<div id="wh_topcontainer"></div>');
|
||||
|
||||
$('#wh_topcontainer').append('<div class="form-group" id="usrcont" style="display:none"></div>');
|
||||
|
||||
$('#wizp2_body').append('<div id="yee_ids_t" style="display:none"><p style="font-weight:bold" id="yee_id_headline">' + $.i18n('wiz_yeelight_desc2') + '</p></div>');
|
||||
|
||||
createTable("lidsh", "lidsb", "yee_ids_t");
|
||||
$('.lidsh').append(createTableRow([$.i18n('edt_dev_spec_lights_title'), $.i18n('wiz_pos'), $.i18n('wiz_identify')], true));
|
||||
$('#wizp2_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_save" style="display:none"><i class="fa fa-fw fa-save"></i>'
|
||||
+ $.i18n('general_btn_save') + '</button><buttowindow.serverConfig.device = d;n type="button" class="btn btn-danger" id="btn_wiz_abort"><i class="fa fa-fw fa-close"></i>'
|
||||
+ $.i18n('general_btn_cancel') + '</button>');
|
||||
|
||||
if (getStorage("darkMode") == "on")
|
||||
$('#wizard_logo').attr("src", 'img/hyperion/logo_negativ.png');
|
||||
|
||||
//open modal
|
||||
$("#wizard_modal").modal({ backdrop: "static", keyboard: false, show: true });
|
||||
|
||||
//listen for continue
|
||||
$('#btn_wiz_cont').off().on('click', function () {
|
||||
begin();
|
||||
$('#wizp1').toggle(false);
|
||||
$('#wizp2').toggle(true);
|
||||
});
|
||||
}
|
||||
};
|
||||
}) ();
|
||||
|
||||
export { yeelightWizard };
|
||||
|
485
assets/webconfig/js/wizards/colorCalibrationKodiWizard.js
Normal file
485
assets/webconfig/js/wizards/colorCalibrationKodiWizard.js
Normal file
@@ -0,0 +1,485 @@
|
||||
//****************************
|
||||
// Wizard Color calibration via Kodi
|
||||
//****************************
|
||||
const colorCalibrationKodiWizard = (() => {
|
||||
|
||||
let ws;
|
||||
const defaultKodiPort = 9090;
|
||||
|
||||
let kodiAddress = document.location.hostname;
|
||||
let kodiPort = defaultKodiPort;
|
||||
|
||||
const kodiUrl = new URL("ws://" + kodiAddress);
|
||||
kodiUrl.port = kodiPort;
|
||||
kodiUrl.pathname = "/jsonrpc/websocket";
|
||||
|
||||
let wiz_editor;
|
||||
let colorLength;
|
||||
let cobj;
|
||||
let step = 0;
|
||||
let withKodi = false;
|
||||
let profile = 0;
|
||||
let websAddress;
|
||||
let imgAddress;
|
||||
let picnr = 0;
|
||||
let id = 1;
|
||||
const vidAddress = "https://sourceforge.net/projects/hyperion-project/files/resources/vid/";
|
||||
const availVideos = ["Sweet_Cocoon", "Caminandes_2_GranDillama", "Caminandes_3_Llamigos"];
|
||||
|
||||
if (getStorage("kodiAddress") != null) {
|
||||
|
||||
kodiAddress = getStorage("kodiAddress");
|
||||
kodiUrl.host = kodiAddress;
|
||||
}
|
||||
|
||||
if (getStorage("kodiPort") != null) {
|
||||
kodiPort = getStorage("kodiPort");
|
||||
kodiUrl.port = kodiPort;
|
||||
}
|
||||
|
||||
$(window).on('beforeunload', function () {
|
||||
closeWebSocket();
|
||||
});
|
||||
|
||||
function closeWebSocket() {
|
||||
// Check if the WebSocket is open
|
||||
if (ws && ws.readyState === WebSocket.OPEN) {
|
||||
ws.close();
|
||||
}
|
||||
}
|
||||
|
||||
function sendToKodi(type, content) {
|
||||
let command;
|
||||
|
||||
switch (type) {
|
||||
case "msg":
|
||||
command = { "jsonrpc": "2.0", "method": "GUI.ShowNotification", "params": { "title": $.i18n('wiz_cc_title'), "message": content, "image": "info", "displaytime": 5000 }, "id": id };
|
||||
break;
|
||||
case "stop":
|
||||
command = { "jsonrpc": "2.0", "method": "Player.Stop", "params": { "playerid": 2 }, "id": id };
|
||||
break;
|
||||
case "playP":
|
||||
content = imgAddress + content + '.png';
|
||||
command = { "jsonrpc": "2.0", "method": "Player.Open", "params": { "item": { "file": content } }, "id": id };
|
||||
break;
|
||||
case "playV":
|
||||
content = vidAddress + content;
|
||||
command = { "jsonrpc": "2.0", "method": "Player.Open", "params": { "item": { "file": content } }, "id": id };
|
||||
break;
|
||||
case "rotate":
|
||||
command = { "jsonrpc": "2.0", "method": "Player.Rotate", "params": { "playerid": 2 }, "id": id };
|
||||
break;
|
||||
default:
|
||||
console.error('Unknown Kodi command type: ', type);
|
||||
}
|
||||
|
||||
if (ws.readyState === WebSocket.OPEN) {
|
||||
ws.send(JSON.stringify(command));
|
||||
++id;
|
||||
} else {
|
||||
console.error('WebSocket connection is not open. Unable to send command.');
|
||||
}
|
||||
}
|
||||
|
||||
function performAction() {
|
||||
let h;
|
||||
|
||||
if (step == 1) {
|
||||
$('#wiz_cc_desc').html($.i18n('wiz_cc_chooseid'));
|
||||
updateEditor(["id"]);
|
||||
$('#btn_wiz_back').prop("disabled", true);
|
||||
}
|
||||
else
|
||||
$('#btn_wiz_back').prop("disabled", false);
|
||||
|
||||
if (step == 2) {
|
||||
updateEditor(["white"]);
|
||||
h = $.i18n('wiz_cc_adjustit', $.i18n('edt_conf_color_white_title'));
|
||||
if (withKodi) {
|
||||
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_white_title'));
|
||||
sendToKodi('playP', "white");
|
||||
}
|
||||
else
|
||||
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_white_title'));
|
||||
$('#wiz_cc_desc').html(h);
|
||||
}
|
||||
if (step == 3) {
|
||||
updateEditor(["gammaRed", "gammaGreen", "gammaBlue"]);
|
||||
h = '<p>' + $.i18n('wiz_cc_adjustgamma') + '</p>';
|
||||
if (withKodi) {
|
||||
sendToKodi('playP', "HGradient");
|
||||
h += '<button id="wiz_cc_btn_sp" class="btn btn-primary">' + $.i18n('wiz_cc_btn_switchpic') + '</button>';
|
||||
}
|
||||
else
|
||||
h += '<p>' + $.i18n('wiz_cc_lettvshowm', "grey_1, grey_2, grey_3, HGradient, VGradient") + '</p>';
|
||||
$('#wiz_cc_desc').html(h);
|
||||
$('#wiz_cc_btn_sp').off().on('click', function () {
|
||||
switchPicture(["VGradient", "grey_1", "grey_2", "grey_3", "HGradient"]);
|
||||
});
|
||||
}
|
||||
if (step == 4) {
|
||||
updateEditor(["red"]);
|
||||
h = $.i18n('wiz_cc_adjustit', $.i18n('edt_conf_color_red_title'));
|
||||
if (withKodi) {
|
||||
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_red_title'));
|
||||
sendToKodi('playP', "red");
|
||||
}
|
||||
else
|
||||
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_red_title'));
|
||||
$('#wiz_cc_desc').html(h);
|
||||
}
|
||||
if (step == 5) {
|
||||
updateEditor(["green"]);
|
||||
h = $.i18n('wiz_cc_adjustit', $.i18n('edt_conf_color_green_title'));
|
||||
if (withKodi) {
|
||||
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_green_title'));
|
||||
sendToKodi('playP', "green");
|
||||
}
|
||||
else
|
||||
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_green_title'));
|
||||
$('#wiz_cc_desc').html(h);
|
||||
}
|
||||
if (step == 6) {
|
||||
updateEditor(["blue"]);
|
||||
h = $.i18n('wiz_cc_adjustit', $.i18n('edt_conf_color_blue_title'));
|
||||
if (withKodi) {
|
||||
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_blue_title'));
|
||||
sendToKodi('playP', "blue");
|
||||
}
|
||||
else
|
||||
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_blue_title'));
|
||||
$('#wiz_cc_desc').html(h);
|
||||
}
|
||||
if (step == 7) {
|
||||
updateEditor(["cyan"]);
|
||||
h = $.i18n('wiz_cc_adjustit', $.i18n('edt_conf_color_cyan_title'));
|
||||
if (withKodi) {
|
||||
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_cyan_title'));
|
||||
sendToKodi('playP', "cyan");
|
||||
}
|
||||
else
|
||||
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_cyan_title'));
|
||||
$('#wiz_cc_desc').html(h);
|
||||
}
|
||||
if (step == 8) {
|
||||
updateEditor(["magenta"]);
|
||||
h = $.i18n('wiz_cc_adjustit', $.i18n('edt_conf_color_magenta_title'));
|
||||
if (withKodi) {
|
||||
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_magenta_title'));
|
||||
sendToKodi('playP', "magenta");
|
||||
}
|
||||
else
|
||||
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_magenta_title'));
|
||||
$('#wiz_cc_desc').html(h);
|
||||
}
|
||||
if (step == 9) {
|
||||
updateEditor(["yellow"]);
|
||||
h = $.i18n('wiz_cc_adjustit', $.i18n('edt_conf_color_yellow_title'));
|
||||
if (withKodi) {
|
||||
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_yellow_title'));
|
||||
sendToKodi('playP', "yellow");
|
||||
}
|
||||
else
|
||||
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_yellow_title'));
|
||||
$('#wiz_cc_desc').html(h);
|
||||
}
|
||||
if (step == 10) {
|
||||
updateEditor(["backlightThreshold", "backlightColored"]);
|
||||
h = $.i18n('wiz_cc_backlight');
|
||||
if (withKodi) {
|
||||
h += '<br/>' + $.i18n('wiz_cc_kodishould', $.i18n('edt_conf_color_black_title'));
|
||||
sendToKodi('playP', "black");
|
||||
}
|
||||
else
|
||||
h += '<br/>' + $.i18n('wiz_cc_lettvshow', $.i18n('edt_conf_color_black_title'));
|
||||
$('#wiz_cc_desc').html(h);
|
||||
}
|
||||
if (step == 11) {
|
||||
updateEditor([""], true);
|
||||
h = '<p>' + $.i18n('wiz_cc_testintro') + '</p>';
|
||||
if (withKodi) {
|
||||
h += '<p>' + $.i18n('wiz_cc_testintrok') + '</p>';
|
||||
sendToKodi('stop');
|
||||
availVideos.forEach(video => {
|
||||
const txt = video.replace(/_/g, " ");
|
||||
h += `<div><button id="${video}" class="btn btn-sm btn-primary videobtn"><i class="fa fa-fw fa-play"></i> ${txt}</button></div>`;
|
||||
});
|
||||
|
||||
h += '<div><button id="stop" class="btn btn-sm btn-danger videobtn" style="margin-bottom:15px"><i class="fa fa-fw fa-stop"></i> ' + $.i18n('wiz_cc_btn_stop') + '</button></div>';
|
||||
}
|
||||
else
|
||||
h += '<p>' + $.i18n('wiz_cc_testintrowok') + ' <a href="https://sourceforge.net/projects/hyperion-project/files/resources/vid/" target="_blank">' + $.i18n('wiz_cc_link') + '</a></p>';
|
||||
h += '<p>' + $.i18n('wiz_cc_summary') + '</p>';
|
||||
$('#wiz_cc_desc').html(h);
|
||||
|
||||
$('.videobtn').off().on('click', function (e) {
|
||||
if (e.target.id == "stop")
|
||||
sendToKodi("stop");
|
||||
else
|
||||
sendToKodi("playV", e.target.id + '.mp4');
|
||||
|
||||
$(this).prop("disabled", true);
|
||||
setTimeout(function () { $('.videobtn').prop("disabled", false) }, 10000);
|
||||
});
|
||||
|
||||
$('#btn_wiz_next').prop("disabled", true);
|
||||
$('#btn_wiz_save').toggle(true);
|
||||
window.readOnlyMode ? $('#btn_wiz_save').prop('disabled', true) : $('#btn_wiz_save').prop('disabled', false);
|
||||
}
|
||||
else {
|
||||
$('#btn_wiz_next').prop("disabled", false);
|
||||
$('#btn_wiz_save').toggle(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
function switchPicture(pictures) {
|
||||
if (typeof pictures[picnr] === 'undefined')
|
||||
picnr = 0;
|
||||
|
||||
sendToKodi('playP', pictures[picnr]);
|
||||
picnr++;
|
||||
}
|
||||
|
||||
|
||||
function initializeWebSocket(cb) {
|
||||
if ("WebSocket" in window) {
|
||||
|
||||
if (kodiUrl.port === '') {
|
||||
kodiUrl.port = defaultKodiPort;
|
||||
}
|
||||
|
||||
if (!ws || ws.readyState !== WebSocket.OPEN) {
|
||||
|
||||
// Establish WebSocket connection
|
||||
ws = new WebSocket(kodiUrl);
|
||||
|
||||
// WebSocket onopen event
|
||||
ws.onopen = function (event) {
|
||||
withKodi = true;
|
||||
cb("opened");
|
||||
};
|
||||
|
||||
// WebSocket onmessage event (handle incoming messages)
|
||||
ws.onmessage = function (event) {
|
||||
const response = JSON.parse(event.data);
|
||||
if (response.method === "System.OnQuit") {
|
||||
closeWebSocket();
|
||||
} else if (response.result != undefined) {
|
||||
if (response.result !== "OK") {
|
||||
cb("error");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// WebSocket onerror event
|
||||
ws.onerror = function (error) {
|
||||
cb("error");
|
||||
};
|
||||
|
||||
// WebSocket onclose event
|
||||
ws.onclose = function (event) {
|
||||
withKodi = false;
|
||||
if (event.code === 1006) {
|
||||
// Ignore error 1006 due to Kodi issue
|
||||
console.log("WebSocket closed with error code 1006. Ignoring due to Kodi bug.");
|
||||
}
|
||||
else {
|
||||
console.error("WebSocket closed with code:", event.code);
|
||||
}
|
||||
};
|
||||
} else {
|
||||
console.log("WebSocket connection is already open.");
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.log("Kodi Access: WebSocket NOT supported by this browser");
|
||||
cb("error");
|
||||
}
|
||||
}
|
||||
|
||||
function setupEventListeners() {
|
||||
$('#btn_wiz_cancel').off().on('click', function () {
|
||||
stop(true);
|
||||
});
|
||||
$('#wiz_cc_kodiip').off().on('change', function () {
|
||||
|
||||
kodiAddress = encodeURIComponent($(this).val().trim());
|
||||
|
||||
$('#kodi_status').html('');
|
||||
if (kodiAddress !== "") {
|
||||
|
||||
if (!isValidHostnameOrIP(kodiAddress)) {
|
||||
|
||||
$('#kodi_status').html('<p style="color:red;font-weight:bold;margin-top:5px">' + $.i18n('edt_msgcust_error_hostname_ip') + '</p>');
|
||||
withKodi = false;
|
||||
|
||||
} else {
|
||||
|
||||
if (isValidIPv6(kodiAddress)) {
|
||||
kodiUrl.hostname = "[" + kodiAddress + "]";
|
||||
} else {
|
||||
kodiUrl.hostname = kodiAddress;
|
||||
}
|
||||
|
||||
$('#kodi_status').html('<p style="font-weight:bold;margin-top:5px">' + $.i18n('wiz_cc_try_connect') + '</p>');
|
||||
$('#btn_wiz_cont').prop('disabled', true);
|
||||
|
||||
closeWebSocket();
|
||||
initializeWebSocket(function (cb) {
|
||||
|
||||
if (cb == "opened") {
|
||||
setStorage("kodiAddress", kodiAddress);
|
||||
setStorage("kodiPort", defaultKodiPort);
|
||||
|
||||
$('#kodi_status').html('<p style="color:green;font-weight:bold;margin-top:5px">' + $.i18n('wiz_cc_kodicon') + '</p>');
|
||||
$('#btn_wiz_cont').prop('disabled', false);
|
||||
|
||||
if (withKodi) {
|
||||
sendToKodi("msg", $.i18n('wiz_cc_kodimsg_start'));
|
||||
}
|
||||
}
|
||||
else {
|
||||
$('#kodi_status').html('<p style="color:red;font-weight:bold;margin-top:5px">' + $.i18n('wiz_cc_kodidiscon') + '</p><p>' + $.i18n('wiz_cc_kodidisconlink') + ' <a href="https://sourceforge.net/projects/hyperion-project/files/resources/Hyperion_calibration_pictures.zip/download" target="_blank">' + $.i18n('wiz_cc_link') + '</p>');
|
||||
withKodi = false;
|
||||
}
|
||||
|
||||
$('#btn_wiz_cont').prop('disabled', false);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//listen for continue
|
||||
$('#btn_wiz_cont').off().on('click', function () {
|
||||
begin();
|
||||
$('#wizp1').toggle(false);
|
||||
$('#wizp2').toggle(true);
|
||||
});
|
||||
}
|
||||
|
||||
function init() {
|
||||
colorLength = window.serverConfig.color.channelAdjustment;
|
||||
cobj = window.schema.color.properties.channelAdjustment.items.properties;
|
||||
websAddress = document.location.hostname + ':' + window.serverConfig.webConfig.port;
|
||||
imgAddress = 'http://' + websAddress + '/img/cc/';
|
||||
setStorage("wizardactive", true);
|
||||
}
|
||||
|
||||
function initProfiles() {
|
||||
//check profile count
|
||||
if (colorLength.length > 1) {
|
||||
$('#multi_cali').html('<p style="font-weight:bold;">' + $.i18n('wiz_cc_morethanone') + '</p><select id="wiz_select" class="form-control" style="width:200px;margin:auto"></select>');
|
||||
for (let i = 0; i < colorLength.length; i++)
|
||||
$('#wiz_select').append(createSelOpt(i, i + 1 + ' (' + colorLength[i].id + ')'));
|
||||
|
||||
$('#wiz_select').off().on('change', function () {
|
||||
profile = $(this).val();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function createEditor() {
|
||||
wiz_editor = createJsonEditor('editor_container_wiz', {
|
||||
color: window.schema.color
|
||||
}, true, true);
|
||||
|
||||
$('#editor_container_wiz h4').toggle(false);
|
||||
$('#editor_container_wiz .btn-group').toggle(false);
|
||||
$('#editor_container_wiz [data-schemapath="root.color.imageToLedMappingType"]').toggle(false);
|
||||
$('#editor_container_wiz [data-schemapath="root.color.reducedPixelSetFactorFactor"]').toggle(false);
|
||||
for (let i = 0; i < colorLength.length; i++)
|
||||
$('#editor_container_wiz [data-schemapath*="root.color.channelAdjustment.' + i + '."]').toggle(false);
|
||||
}
|
||||
function updateEditor(el, all) {
|
||||
for (let key in cobj) {
|
||||
if (all === true || el[0] == key || el[1] == key || el[2] == key)
|
||||
$('#editor_container_wiz [data-schemapath*=".' + profile + '.' + key + '"]').toggle(true);
|
||||
else
|
||||
$('#editor_container_wiz [data-schemapath*=".' + profile + '.' + key + '"]').toggle(false);
|
||||
}
|
||||
}
|
||||
|
||||
function stop(reload) {
|
||||
if (withKodi) {
|
||||
sendToKodi("stop");
|
||||
}
|
||||
closeWebSocket();
|
||||
resetWizard(reload);
|
||||
}
|
||||
|
||||
function begin() {
|
||||
step = 0;
|
||||
|
||||
$('#btn_wiz_next').off().on('click', function () {
|
||||
step++;
|
||||
performAction();
|
||||
});
|
||||
|
||||
$('#btn_wiz_back').off().on('click', function () {
|
||||
step--;
|
||||
performAction();
|
||||
});
|
||||
|
||||
$('#btn_wiz_abort').off().on('click', function () {
|
||||
stop(true);
|
||||
});
|
||||
|
||||
$('#btn_wiz_save').off().on('click', function () {
|
||||
requestWriteConfig(wiz_editor.getValue());
|
||||
stop(true);
|
||||
});
|
||||
|
||||
wiz_editor.on("change", function (e) {
|
||||
const val = wiz_editor.getEditor('root.color.channelAdjustment.' + profile + '').getValue();
|
||||
const temp = JSON.parse(JSON.stringify(val));
|
||||
delete temp.leds
|
||||
requestAdjustment(JSON.stringify(temp), "", true);
|
||||
});
|
||||
|
||||
step++
|
||||
performAction();
|
||||
}
|
||||
|
||||
return {
|
||||
start: function () {
|
||||
//create html
|
||||
$('#wiz_header').html('<i class="fa fa-magic fa-fw"></i>' + $.i18n('wiz_cc_title'));
|
||||
$('#wizp1_body').html('<h4 style="font-weight:bold;text-transform:uppercase;">' + $.i18n('wiz_cc_title') + '</h4>' +
|
||||
'<p>' + $.i18n('wiz_cc_intro1') + '</p>' +
|
||||
'<label>' + $.i18n('wiz_cc_kwebs') + '</label>' +
|
||||
'<input class="form-control" style="width:280px;margin:auto" id="wiz_cc_kodiip" type="text" placeholder="' + kodiAddress + '" value="' + kodiAddress + '" />' +
|
||||
'<span id="kodi_status"></span><span id="multi_cali"></span>'
|
||||
);
|
||||
$('#wizp1_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_cont" disabled="disabled">' + '<i class="fa fa-fw fa-check"></i>' + $.i18n('general_btn_continue') + '</button>' +
|
||||
'<button type="button" class="btn btn-danger" id="btn_wiz_cancel" data-dismiss="modal"><i class="fa fa-fw fa-close"></i>' + $.i18n('general_btn_cancel') + '</button>'
|
||||
);
|
||||
$('#wizp2_body').html('<div id="wiz_cc_desc" style="font-weight:bold"></div><div id="editor_container_wiz"></div>'
|
||||
);
|
||||
$('#wizp2_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_back">' + '<i class="fa fa-fw fa-chevron-left"></i>' + $.i18n('general_btn_back') + '</button>' +
|
||||
'<button type="button" class="btn btn-primary" id="btn_wiz_next">' + $.i18n('general_btn_next') + '<i style="margin-left:4px;"class="fa fa-fw fa-chevron-right"></i>' + '</button>' +
|
||||
'<button type="button" class="btn btn-warning" id="btn_wiz_save" style="display:none"><i class="fa fa-fw fa-save"></i>' + $.i18n('general_btn_save') + '</button>' +
|
||||
'<button type="button" class="btn btn-danger" id="btn_wiz_abort"><i class="fa fa-fw fa-close"></i>' + $.i18n('general_btn_cancel') + '</button>'
|
||||
);
|
||||
|
||||
if (getStorage("darkMode") == "on")
|
||||
$('#wizard_logo').prop("src", 'img/hyperion/logo_negativ.png');
|
||||
|
||||
//open modal
|
||||
$("#wizard_modal").modal({
|
||||
backdrop: "static",
|
||||
keyboard: false,
|
||||
show: true
|
||||
});
|
||||
|
||||
setupEventListeners();
|
||||
$('#wiz_cc_kodiip').trigger("change");
|
||||
init();
|
||||
initProfiles();
|
||||
createEditor();
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
export { colorCalibrationKodiWizard };
|
143
assets/webconfig/js/wizards/rgbByteOrderWizard.js
Normal file
143
assets/webconfig/js/wizards/rgbByteOrderWizard.js
Normal file
@@ -0,0 +1,143 @@
|
||||
//****************************
|
||||
// Wizard RGB byte order
|
||||
//****************************
|
||||
|
||||
const rgbByteOrderWizard = (() => {
|
||||
|
||||
let wIntveralId;
|
||||
let new_rgb_order;
|
||||
|
||||
function changeColor() {
|
||||
let color = $("#wiz_canv_color").css('background-color');
|
||||
|
||||
if (color == 'rgb(255, 0, 0)') {
|
||||
$("#wiz_canv_color").css('background-color', 'rgb(0, 255, 0)');
|
||||
requestSetColor('0', '255', '0');
|
||||
}
|
||||
else {
|
||||
$("#wiz_canv_color").css('background-color', 'rgb(255, 0, 0)');
|
||||
requestSetColor('255', '0', '0');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function stopWizardRGB(reload) {
|
||||
console.log("stopWizardRGB - reload: ", reload);
|
||||
clearInterval(wIntveralId);
|
||||
resetWizard(reload);
|
||||
}
|
||||
|
||||
function beginWizardRGB() {
|
||||
$("#wiz_switchtime_select").off().on('change', function () {
|
||||
clearInterval(wIntveralId);
|
||||
const time = $("#wiz_switchtime_select").val();
|
||||
wIntveralId = setInterval(function () { changeColor(); }, time * 1000);
|
||||
});
|
||||
|
||||
$('.wselect').on("change", function () {
|
||||
let rgb_order = window.serverConfig.device.colorOrder.split("");
|
||||
const redS = $("#wiz_r_select").val();
|
||||
const greenS = $("#wiz_g_select").val();
|
||||
const blueS = rgb_order.toString().replace(/,/g, "").replace(redS, "").replace(greenS, "");
|
||||
|
||||
for (const color of rgb_order) {
|
||||
if (redS == color)
|
||||
$('#wiz_g_select option[value=' + color + ']').prop('disabled', true);
|
||||
else
|
||||
$('#wiz_g_select option[value=' + color + ']').prop('disabled', false);
|
||||
if (greenS == color)
|
||||
$('#wiz_r_select option[value=' + color + ']').prop('disabled', true);
|
||||
else
|
||||
$('#wiz_r_select option[value=' + color + ']').prop('disabled', false);
|
||||
}
|
||||
|
||||
if (redS != 'null' && greenS != 'null') {
|
||||
$('#btn_wiz_save').prop('disabled', false);
|
||||
|
||||
for (let i = 0; i < rgb_order.length; i++) {
|
||||
if (rgb_order[i] == "r")
|
||||
rgb_order[i] = redS;
|
||||
else if (rgb_order[i] == "g")
|
||||
rgb_order[i] = greenS;
|
||||
else
|
||||
rgb_order[i] = blueS;
|
||||
}
|
||||
|
||||
rgb_order = rgb_order.toString().replace(/,/g, "");
|
||||
|
||||
if (redS == "r" && greenS == "g") {
|
||||
$('#btn_wiz_save').toggle(false);
|
||||
$('#btn_wiz_checkok').toggle(true);
|
||||
|
||||
window.readOnlyMode ? $('#btn_wiz_checkok').prop('disabled', true) : $('#btn_wiz_checkok').prop('disabled', false);
|
||||
}
|
||||
else {
|
||||
$('#btn_wiz_save').toggle(true);
|
||||
window.readOnlyMode ? $('#btn_wiz_save').prop('disabled', true) : $('#btn_wiz_save').prop('disabled', false);
|
||||
|
||||
$('#btn_wiz_checkok').toggle(false);
|
||||
}
|
||||
new_rgb_order = rgb_order;
|
||||
}
|
||||
else
|
||||
$('#btn_wiz_save').prop('disabled', true);
|
||||
});
|
||||
|
||||
$("#wiz_switchtime_select").append(createSelOpt('5', '5'), createSelOpt('10', '10'), createSelOpt('15', '15'), createSelOpt('30', '30'));
|
||||
$("#wiz_switchtime_select").trigger('change');
|
||||
|
||||
$("#wiz_r_select").append(createSelOpt("null", ""), createSelOpt('r', $.i18n('general_col_red')), createSelOpt('g', $.i18n('general_col_green')), createSelOpt('b', $.i18n('general_col_blue')));
|
||||
$("#wiz_g_select").html($("#wiz_r_select").html());
|
||||
$("#wiz_r_select").trigger('change');
|
||||
|
||||
requestSetColor('255', '0', '0');
|
||||
setTimeout(requestSetSource, 100, 'auto');
|
||||
setStorage("wizardactive", true);
|
||||
|
||||
$('#btn_wiz_abort').off().on('click', function () { stopWizardRGB(true); });
|
||||
|
||||
$('#btn_wiz_checkok').off().on('click', function () {
|
||||
showInfoDialog('success', "", $.i18n('infoDialog_wizrgb_text'));
|
||||
stopWizardRGB();
|
||||
});
|
||||
|
||||
$('#btn_wiz_save').off().on('click', function () {
|
||||
stopWizardRGB();
|
||||
window.serverConfig.device.colorOrder = new_rgb_order;
|
||||
requestWriteConfig({ "device": window.serverConfig.device });
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
start: function () {
|
||||
//create html
|
||||
$('#wiz_header').html('<i class="fa fa-magic fa-fw"></i>' + $.i18n('wiz_rgb_title'));
|
||||
$('#wizp1_body').html('<h4 style="font-weight:bold;text-transform:uppercase;">' + $.i18n('wiz_rgb_title') + '</h4><p>' + $.i18n('wiz_rgb_intro1') + '</p><p style="font-weight:bold;">' + $.i18n('wiz_rgb_intro2') + '</p>');
|
||||
$('#wizp1_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_cont"><i class="fa fa-fw fa-check"></i>' + $.i18n('general_btn_continue') + '</button><button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-fw fa-close"></i>' + $.i18n('general_btn_cancel') + '</button>');
|
||||
$('#wizp2_body').html('<p style="font-weight:bold">' + $.i18n('wiz_rgb_expl') + '</p>');
|
||||
$('#wizp2_body').append('<div class="form-group"><label>' + $.i18n('wiz_rgb_switchevery') + '</label><div class="input-group" style="width:100px"><select id="wiz_switchtime_select" class="form-control"></select><div class="input-group-addon">' + $.i18n('edt_append_s') + '</div></div></div>');
|
||||
$('#wizp2_body').append('<canvas id="wiz_canv_color" width="100" height="100" style="border-radius:60px;background-color:red; display:block; margin: 10px 0;border:4px solid grey;"></canvas><label>' + $.i18n('wiz_rgb_q') + '</label>');
|
||||
$('#wizp2_body').append('<table class="table borderless" style="width:200px"><tbody><tr><td class="ltd"><label>' + $.i18n('wiz_rgb_qrend') + '</label></td><td class="itd"><select id="wiz_r_select" class="form-control wselect"></select></td></tr><tr><td class="ltd"><label>' + $.i18n('wiz_rgb_qgend') + '</label></td><td class="itd"><select id="wiz_g_select" class="form-control wselect"></select></td></tr></tbody></table>');
|
||||
$('#wizp2_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_save"><i class="fa fa-fw fa-save"></i>' + $.i18n('general_btn_save') + '</button><button type="button" class="btn btn-primary" id="btn_wiz_checkok" style="display:none" data-dismiss="modal"><i class="fa fa-fw fa-check"></i>' + $.i18n('general_btn_ok') + '</button><button type="button" class="btn btn-danger" id="btn_wiz_abort"><i class="fa fa-fw fa-close"></i>' + $.i18n('general_btn_cancel') + '</button>');
|
||||
|
||||
if (getStorage("darkMode") == "on")
|
||||
$('#wizard_logo').attr("src", 'img/hyperion/logo_negativ.png');
|
||||
|
||||
//open modal
|
||||
$("#wizard_modal").modal({
|
||||
backdrop: "static",
|
||||
keyboard: false,
|
||||
show: true
|
||||
});
|
||||
|
||||
//listen for continue
|
||||
$('#btn_wiz_cont').off().on('click', function () {
|
||||
beginWizardRGB();
|
||||
$('#wizp1').toggle(false);
|
||||
$('#wizp2').toggle(true);
|
||||
});
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
export { rgbByteOrderWizard };
|
Reference in New Issue
Block a user