mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	Add update available notice
This commit is contained in:
		| @@ -1,14 +1,14 @@ | ||||
| import voluptuous as vol | ||||
|  | ||||
| from esphomeyaml.components import binary_sensor, switch | ||||
| from esphomeyaml.components import switch | ||||
| import esphomeyaml.config_validation as cv | ||||
| from esphomeyaml.const import CONF_BINARY_SENSORS, CONF_ID, CONF_LAMBDA, CONF_SWITCHES | ||||
| from esphomeyaml.const import CONF_ID, CONF_LAMBDA, CONF_SWITCHES | ||||
| from esphomeyaml.cpp_generator import process_lambda, variable | ||||
| from esphomeyaml.cpp_types import std_vector | ||||
|  | ||||
| CustomSwitchConstructor = switch.switch_ns.class_('CustomSwitchConstructor') | ||||
|  | ||||
| PLATFORM_SCHEMA = binary_sensor.PLATFORM_SCHEMA.extend({ | ||||
| PLATFORM_SCHEMA = switch.PLATFORM_SCHEMA.extend({ | ||||
|     cv.GenerateID(): cv.declare_variable_id(CustomSwitchConstructor), | ||||
|     vol.Required(CONF_LAMBDA): cv.lambda_, | ||||
|     vol.Required(CONF_SWITCHES): | ||||
| @@ -29,8 +29,8 @@ def to_code(config): | ||||
|         switch.register_switch(custom.get_switch(i), sens) | ||||
|  | ||||
|  | ||||
| BUILD_FLAGS = '-DUSE_CUSTOM_BINARY_SENSOR' | ||||
| BUILD_FLAGS = '-DUSE_CUSTOM_SWITCH' | ||||
|  | ||||
|  | ||||
| def to_hass_config(data, config): | ||||
|     return [binary_sensor.core_to_hass_config(data, sens) for sens in config[CONF_BINARY_SENSORS]] | ||||
|     return [switch.core_to_hass_config(data, swi) for swi in config[CONF_SWITCHES]] | ||||
|   | ||||
| @@ -590,10 +590,12 @@ def one_of(*values, **kwargs): | ||||
|     upper = kwargs.get('upper', False) | ||||
|     string_ = kwargs.get('string', False) or lower or upper | ||||
|     to_int = kwargs.get('int', False) | ||||
|     space = kwargs.get('space', ' ') | ||||
|  | ||||
|     def validator(value): | ||||
|         if string_: | ||||
|             value = string(value) | ||||
|             value = value.replace(' ', space) | ||||
|         if to_int: | ||||
|             value = int_(value) | ||||
|         if lower: | ||||
|   | ||||
| @@ -378,6 +378,12 @@ CONF_SWITCHES = 'switches' | ||||
| CONF_TEXT_SENSORS = 'text_sensors' | ||||
| CONF_INCLUDES = 'includes' | ||||
| CONF_LIBRARIES = 'libraries' | ||||
| CONF_PIN_A = 'pin_a' | ||||
| CONF_PIN_B = 'pin_b' | ||||
| CONF_PIN_C = 'pin_c' | ||||
| CONF_PIN_D = 'pin_d' | ||||
| CONF_SLEEP_WHEN_DONE = 'sleep_when_done' | ||||
| CONF_STEP_MODE = 'step_mode' | ||||
|  | ||||
| ALLOWED_NAME_CHARS = u'abcdefghijklmnopqrstuvwxyz0123456789_' | ||||
| ARDUINO_VERSION_ESP32_DEV = 'https://github.com/platformio/platform-espressif32.git#feature/stage' | ||||
|   | ||||
| @@ -269,6 +269,12 @@ class DashboardEntry(object): | ||||
|             return None | ||||
|         return self.storage.board | ||||
|  | ||||
|     @property | ||||
|     def update_available(self): | ||||
|         if self.storage is None: | ||||
|             return True | ||||
|         return self.storage.esphomeyaml_version != const.__version__ | ||||
|  | ||||
|  | ||||
| class MainRequestHandler(BaseHandler): | ||||
|     def get(self): | ||||
|   | ||||
| @@ -204,3 +204,11 @@ ul.stepper:not(.horizontal) .step.active::before, ul.stepper:not(.horizontal) .s | ||||
|   border-radius: 3px; | ||||
|   height: 100% | ||||
| } | ||||
|  | ||||
| .update-available i { | ||||
|   vertical-align: bottom; | ||||
|   font-size: 20px !important; | ||||
|   color: #3F51B5 !important; | ||||
|   margin-right: -4.5px; | ||||
|   margin-left: -5.5px; | ||||
| } | ||||
|   | ||||
| @@ -23,6 +23,13 @@ const colorReplace = (input) => { | ||||
|   return input; | ||||
| }; | ||||
|  | ||||
| const removeUpdateAvailable = (filename) => { | ||||
|   const p = document.querySelector(`.update-available[data-node="${filename}"]`); | ||||
|   if (p === undefined) | ||||
|     return; | ||||
|   p.remove(); | ||||
| }; | ||||
|  | ||||
| let configuration = ""; | ||||
| let wsProtocol = "ws:"; | ||||
| if (window.location.protocol === "https:") { | ||||
| @@ -202,6 +209,7 @@ document.querySelectorAll(".action-upload").forEach((upload) => { | ||||
|       } else if (data.event === "exit") { | ||||
|         if (data.code === 0) { | ||||
|           M.toast({html: "Program exited successfully."}); | ||||
|           removeUpdateAvailable(configuration); | ||||
|         } else { | ||||
|           M.toast({html: `Program failed with code ${data.code}`}); | ||||
|         } | ||||
| @@ -481,7 +489,6 @@ const editorElem = editModalElem.querySelector("#editor"); | ||||
| const editor = ace.edit(editorElem); | ||||
| editor.setTheme("ace/theme/dreamweaver"); | ||||
| editor.session.setMode("ace/mode/yaml"); | ||||
| editor.session.setValue("Hello World!"); | ||||
| editor.session.setOption('useSoftTabs', true); | ||||
| editor.session.setOption('tabSize', 2); | ||||
|  | ||||
|   | ||||
| @@ -4,17 +4,17 @@ | ||||
|   <meta charset="UTF-8"> | ||||
|   <title>esphomeyaml Dashboard</title> | ||||
|   <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> | ||||
|   <link rel="stylesheet" href="/static/materialize.min.css"> | ||||
|   <link rel="stylesheet" href="/static/materialize-stepper.min.css"> | ||||
|   <link rel="stylesheet" href="/static/esphomeyaml.css"> | ||||
|   <link rel="shortcut icon" href="/static/favicon.ico"> | ||||
|   <link rel="stylesheet" href="/static/materialize.min.css?v=1"> | ||||
|   <link rel="stylesheet" href="/static/materialize-stepper.min.css?v=1"> | ||||
|   <link rel="stylesheet" href="/static/esphomeyaml.css?v=1"> | ||||
|   <link rel="shortcut icon" href="/static/favicon.ico?v=1"> | ||||
|  | ||||
|   <script src="/static/jquery.min.js"></script> | ||||
|   <script src="/static/jquery-ui.min.js"></script> | ||||
|   <script src="/static/materialize.min.js"></script> | ||||
|   <script src="/static/jquery.validate.min.js"></script> | ||||
|   <script src="/static/jquery.min.js?v=1"></script> | ||||
|   <script src="/static/jquery-ui.min.js?v=1"></script> | ||||
|   <script src="/static/materialize.min.js?v=1"></script> | ||||
|   <script src="/static/jquery.validate.min.js?v=1"></script> | ||||
|  | ||||
|   <script src="/static/materialize-stepper.min.js"></script> | ||||
|   <script src="/static/materialize-stepper.min.js?v=1"></script> | ||||
|   <meta name="viewport" content="width=device-width, initial-scale=1.0"/> | ||||
| </head> | ||||
| <body> | ||||
| @@ -61,8 +61,15 @@ | ||||
|             <p> | ||||
|               <span class="status-indicator unknown" data-node="{{ entry.filename }}"> | ||||
|                 <span class="status-indicator-icon"></span> | ||||
|                 <span class="status-indicator-text"></span></span>. Full path: <code class="inlinecode">{{ escape(entry.full_path) }}</code> | ||||
|                 <span class="status-indicator-text"></span></span>. | ||||
|               Full path: <code class="inlinecode">{{ escape(entry.full_path) }}</code> | ||||
|             </p> | ||||
|             {% if entry.update_available %} | ||||
|               <p class="update-available" data-node="{{ entry.filename }}"> | ||||
|                 <i class="material-icons">system_update</i> | ||||
|                 Update Available! | ||||
|               </p> | ||||
|             {% end %} | ||||
|           </div> | ||||
|           <div class="card-action"> | ||||
|             <a href="#" class="action-upload" data-node="{{ entry.filename }}">Upload</a> | ||||
| @@ -500,8 +507,8 @@ | ||||
|   </div> | ||||
| </footer> | ||||
|  | ||||
| <script src="/static/ace.js" type="text/javascript" charset="utf-8"></script> | ||||
| <script src="/static/esphomeyaml.js" type="text/javascript"></script> | ||||
| <script src="/static/ace.js?v=1" type="text/javascript" charset="utf-8"></script> | ||||
| <script src="/static/esphomeyaml.js?v=1" type="text/javascript"></script> | ||||
|  | ||||
| {% if len(entries) == 0 %} | ||||
| <script> | ||||
|   | ||||
| @@ -2,6 +2,7 @@ import codecs | ||||
| import json | ||||
| import os | ||||
|  | ||||
| from esphomeyaml import const | ||||
| from esphomeyaml.core import CORE | ||||
| from esphomeyaml.helpers import mkdir_p | ||||
|  | ||||
| @@ -20,8 +21,8 @@ def ext_storage_path(base_path, config_filename):  # type: (str, str) -> str | ||||
|  | ||||
| # pylint: disable=too-many-instance-attributes | ||||
| class StorageJSON(object): | ||||
|     def __init__(self, storage_version, name, esphomelib_version, src_version, | ||||
|                  arduino_version, address, esp_platform, board, build_path, | ||||
|     def __init__(self, storage_version, name, esphomelib_version, esphomeyaml_version, | ||||
|                  src_version, arduino_version, address, esp_platform, board, build_path, | ||||
|                  firmware_bin_path): | ||||
|         # Version of the storage JSON schema | ||||
|         assert storage_version is None or isinstance(storage_version, int) | ||||
| @@ -31,6 +32,8 @@ class StorageJSON(object): | ||||
|         # The esphomelib version in use | ||||
|         assert esphomelib_version is None or isinstance(esphomelib_version, dict) | ||||
|         self.esphomelib_version = esphomelib_version  # type: Dict[str, str] | ||||
|         # The esphomeyaml version this was compiled with | ||||
|         self.esphomeyaml_version = esphomeyaml_version  # type: str | ||||
|         # The version of the file in src/main.cpp - Used to migrate the file | ||||
|         assert src_version is None or isinstance(src_version, int) | ||||
|         self.src_version = src_version  # type: int | ||||
| @@ -53,6 +56,7 @@ class StorageJSON(object): | ||||
|             'storage_version': self.storage_version, | ||||
|             'name': self.name, | ||||
|             'esphomelib_version': self.esphomelib_version, | ||||
|             'esphomeyaml_version': self.esphomeyaml_version, | ||||
|             'src_version': self.src_version, | ||||
|             'arduino_version': self.arduino_version, | ||||
|             'address': self.address, | ||||
| @@ -76,6 +80,7 @@ class StorageJSON(object): | ||||
|             storage_version=1, | ||||
|             name=esph.name, | ||||
|             esphomelib_version=esph.esphomelib_version, | ||||
|             esphomeyaml_version=const.__version__, | ||||
|             src_version=1, | ||||
|             arduino_version=esph.arduino_version, | ||||
|             address=esph.address, | ||||
| @@ -92,6 +97,7 @@ class StorageJSON(object): | ||||
|             storage_version=1, | ||||
|             name=name, | ||||
|             esphomelib_version=None, | ||||
|             esphomeyaml_version=const.__version__, | ||||
|             src_version=1, | ||||
|             arduino_version=None, | ||||
|             address=address, | ||||
| @@ -109,6 +115,7 @@ class StorageJSON(object): | ||||
|         storage_version = storage['storage_version'] | ||||
|         name = storage.get('name') | ||||
|         esphomelib_version = storage.get('esphomelib_version') | ||||
|         esphomeyaml_version = storage.get('esphomeyaml_version') | ||||
|         src_version = storage.get('src_version') | ||||
|         arduino_version = storage.get('arduino_version') | ||||
|         address = storage.get('address') | ||||
| @@ -116,8 +123,9 @@ class StorageJSON(object): | ||||
|         board = storage.get('board') | ||||
|         build_path = storage.get('build_path') | ||||
|         firmware_bin_path = storage.get('firmware_bin_path') | ||||
|         return StorageJSON(storage_version, name, esphomelib_version, src_version, arduino_version, | ||||
|                            address, esp_platform, board, build_path, firmware_bin_path) | ||||
|         return StorageJSON(storage_version, name, esphomelib_version, esphomeyaml_version, | ||||
|                            src_version, arduino_version, address, esp_platform, board, build_path, | ||||
|                            firmware_bin_path) | ||||
|  | ||||
|     @staticmethod | ||||
|     def load(path):  # type: (str) -> Optional[StorageJSON] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user