mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	Enable use of alternate hardware UARTs for logging (#427)
* Enable use of alternate hardware UARTs for logging Enable use of Serial1 on ESP8266 and Serial1/Serial2 on ESP32 for logging. This is frequently done on ESP8266 to allow use of Serial for UART TX+RX, while maintaining logging output on Serial1 which is TX-only via GPIO2. * ESPHOMELIB_UART -> UART_SELECTION_UART; HW_UART -> HARDWARE_UART * Add test3 to travis; remove test4 * Set DEBUG_ESP_PORT based on logger UART setting
This commit is contained in:
		
				
					committed by
					
						 Otto Winter
						Otto Winter
					
				
			
			
				
	
			
			
			
						parent
						
							463ad6f94b
						
					
				
				
					commit
					1b8d242505
				
			| @@ -22,6 +22,7 @@ matrix: | |||||||
|       script: |       script: | ||||||
|         - esphomeyaml tests/test1.yaml compile |         - esphomeyaml tests/test1.yaml compile | ||||||
|         - esphomeyaml tests/test2.yaml compile |         - esphomeyaml tests/test2.yaml compile | ||||||
|  |         - esphomeyaml tests/test3.yaml compile | ||||||
|     #- python: "3.5.3" |     #- python: "3.5.3" | ||||||
|     #  env: TARGET=Test3.5 |     #  env: TARGET=Test3.5 | ||||||
|     #  install: pip install -U https://github.com/platformio/platformio-core/archive/develop.zip && pip install -e . && pip install flake8==3.6.0 pylint==2.2.2 pillow |     #  install: pip install -U https://github.com/platformio/platformio-core/archive/develop.zip && pip install -e . && pip install flake8==3.6.0 pylint==2.2.2 pillow | ||||||
|   | |||||||
| @@ -5,11 +5,10 @@ import voluptuous as vol | |||||||
| from esphomeyaml.automation import ACTION_REGISTRY, LambdaAction | from esphomeyaml.automation import ACTION_REGISTRY, LambdaAction | ||||||
| import esphomeyaml.config_validation as cv | import esphomeyaml.config_validation as cv | ||||||
| from esphomeyaml.const import CONF_ARGS, CONF_BAUD_RATE, CONF_FORMAT, CONF_ID, CONF_LEVEL, \ | from esphomeyaml.const import CONF_ARGS, CONF_BAUD_RATE, CONF_FORMAT, CONF_ID, CONF_LEVEL, \ | ||||||
|     CONF_LOGS, CONF_TAG, CONF_TX_BUFFER_SIZE |     CONF_LOGS, CONF_TAG, CONF_TX_BUFFER_SIZE, CONF_HARDWARE_UART | ||||||
| from esphomeyaml.core import EsphomeyamlError, Lambda, CORE | from esphomeyaml.core import EsphomeyamlError, Lambda, CORE | ||||||
| from esphomeyaml.cpp_generator import Pvariable, RawExpression, add, process_lambda, statement | from esphomeyaml.cpp_generator import Pvariable, RawExpression, add, process_lambda, statement | ||||||
| from esphomeyaml.cpp_types import App, Component, esphomelib_ns, global_ns, void | from esphomeyaml.cpp_types import App, Component, esphomelib_ns, global_ns, void | ||||||
|  |  | ||||||
| from esphomeyaml.py_compat import text_type | from esphomeyaml.py_compat import text_type | ||||||
|  |  | ||||||
| LOG_LEVELS = { | LOG_LEVELS = { | ||||||
| @@ -33,10 +32,36 @@ LOG_LEVEL_TO_ESP_LOG = { | |||||||
|  |  | ||||||
| LOG_LEVEL_SEVERITY = ['NONE', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'VERBOSE', 'VERY_VERBOSE'] | LOG_LEVEL_SEVERITY = ['NONE', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'VERBOSE', 'VERY_VERBOSE'] | ||||||
|  |  | ||||||
|  | UART_SELECTION_ESP32 = ['UART0', 'UART1', 'UART2'] | ||||||
|  |  | ||||||
|  | UART_SELECTION_ESP8266 = ['UART0', 'UART0_SWAP', 'UART1'] | ||||||
|  |  | ||||||
|  | HARDWARE_UART_TO_UART_SELECTION = { | ||||||
|  |     'UART0': global_ns.UART_SELECTION_UART0, | ||||||
|  |     'UART0_SWAP': global_ns.UART_SELECTION_UART0_SWAP, | ||||||
|  |     'UART1': global_ns.UART_SELECTION_UART1, | ||||||
|  |     'UART2': global_ns.UART_SELECTION_UART2, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | HARDWARE_UART_TO_SERIAL = { | ||||||
|  |     'UART0': 'Serial', | ||||||
|  |     'UART0_SWAP': 'Serial', | ||||||
|  |     'UART1': 'Serial1', | ||||||
|  |     'UART2': 'Serial2', | ||||||
|  | } | ||||||
|  |  | ||||||
| # pylint: disable=invalid-name | # pylint: disable=invalid-name | ||||||
| is_log_level = cv.one_of(*LOG_LEVELS, upper=True) | is_log_level = cv.one_of(*LOG_LEVELS, upper=True) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def uart_selection(value): | ||||||
|  |     if CORE.is_esp32: | ||||||
|  |         return cv.one_of(*UART_SELECTION_ESP32, upper=True)(value) | ||||||
|  |     if CORE.is_esp8266: | ||||||
|  |         return cv.one_of(*UART_SELECTION_ESP8266, upper=True)(value) | ||||||
|  |     raise NotImplementedError | ||||||
|  |  | ||||||
|  |  | ||||||
| def validate_local_no_higher_than_global(value): | def validate_local_no_higher_than_global(value): | ||||||
|     global_level = value.get(CONF_LEVEL, 'DEBUG') |     global_level = value.get(CONF_LEVEL, 'DEBUG') | ||||||
|     for tag, level in value.get(CONF_LOGS, {}).items(): |     for tag, level in value.get(CONF_LOGS, {}).items(): | ||||||
| @@ -51,7 +76,8 @@ LogComponent = esphomelib_ns.class_('LogComponent', Component) | |||||||
| CONFIG_SCHEMA = vol.All(vol.Schema({ | CONFIG_SCHEMA = vol.All(vol.Schema({ | ||||||
|     cv.GenerateID(): cv.declare_variable_id(LogComponent), |     cv.GenerateID(): cv.declare_variable_id(LogComponent), | ||||||
|     vol.Optional(CONF_BAUD_RATE, default=115200): cv.positive_int, |     vol.Optional(CONF_BAUD_RATE, default=115200): cv.positive_int, | ||||||
|     vol.Optional(CONF_TX_BUFFER_SIZE): cv.validate_bytes, |     vol.Optional(CONF_TX_BUFFER_SIZE, default=512): cv.validate_bytes, | ||||||
|  |     vol.Optional(CONF_HARDWARE_UART, default='UART0'): uart_selection, | ||||||
|     vol.Optional(CONF_LEVEL): is_log_level, |     vol.Optional(CONF_LEVEL): is_log_level, | ||||||
|     vol.Optional(CONF_LOGS): vol.Schema({ |     vol.Optional(CONF_LOGS): vol.Schema({ | ||||||
|         cv.string: is_log_level, |         cv.string: is_log_level, | ||||||
| @@ -60,10 +86,10 @@ CONFIG_SCHEMA = vol.All(vol.Schema({ | |||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|     rhs = App.init_log(config.get(CONF_BAUD_RATE)) |     rhs = App.init_log(config.get(CONF_BAUD_RATE), | ||||||
|  |                        config.get(CONF_TX_BUFFER_SIZE), | ||||||
|  |                        HARDWARE_UART_TO_UART_SELECTION[config.get(CONF_HARDWARE_UART)]) | ||||||
|     log = Pvariable(config[CONF_ID], rhs) |     log = Pvariable(config[CONF_ID], rhs) | ||||||
|     if CONF_TX_BUFFER_SIZE in config: |  | ||||||
|         add(log.set_tx_buffer_size(config[CONF_TX_BUFFER_SIZE])) |  | ||||||
|     if CONF_LEVEL in config: |     if CONF_LEVEL in config: | ||||||
|         add(log.set_global_log_level(LOG_LEVELS[config[CONF_LEVEL]])) |         add(log.set_global_log_level(LOG_LEVELS[config[CONF_LEVEL]])) | ||||||
|     for tag, level in config.get(CONF_LOGS, {}).items(): |     for tag, level in config.get(CONF_LOGS, {}).items(): | ||||||
| @@ -79,7 +105,8 @@ def required_build_flags(config): | |||||||
|         is_at_least_verbose = this_severity >= verbose_severity |         is_at_least_verbose = this_severity >= verbose_severity | ||||||
|         has_serial_logging = config.get(CONF_BAUD_RATE) != 0 |         has_serial_logging = config.get(CONF_BAUD_RATE) != 0 | ||||||
|         if CORE.is_esp8266 and has_serial_logging and is_at_least_verbose: |         if CORE.is_esp8266 and has_serial_logging and is_at_least_verbose: | ||||||
|             flags.append(u"-DDEBUG_ESP_PORT=Serial") |             debug_serial_port = HARDWARE_UART_TO_SERIAL[config.get(CONF_HARDWARE_UART)] | ||||||
|  |             flags.append(u"-DDEBUG_ESP_PORT={}".format(debug_serial_port)) | ||||||
|             flags.append(u"-DLWIP_DEBUG") |             flags.append(u"-DLWIP_DEBUG") | ||||||
|             DEBUG_COMPONENTS = { |             DEBUG_COMPONENTS = { | ||||||
|                 'HTTP_CLIENT', |                 'HTTP_CLIENT', | ||||||
|   | |||||||
| @@ -264,6 +264,7 @@ CONF_DELAYED_OFF = 'delayed_off' | |||||||
| CONF_UUID = 'uuid' | CONF_UUID = 'uuid' | ||||||
| CONF_TYPE = 'type' | CONF_TYPE = 'type' | ||||||
| CONF_SPI_ID = 'spi_id' | CONF_SPI_ID = 'spi_id' | ||||||
|  | CONF_HARDWARE_UART = 'hardware_uart' | ||||||
| CONF_UART_ID = 'uart_id' | CONF_UART_ID = 'uart_id' | ||||||
| CONF_UID = 'uid' | CONF_UID = 'uid' | ||||||
| CONF_TX_PIN = 'tx_pin' | CONF_TX_PIN = 'tx_pin' | ||||||
|   | |||||||
							
								
								
									
										177
									
								
								tests/test3.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								tests/test3.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | |||||||
|  | esphomeyaml: | ||||||
|  |   name: $devicename | ||||||
|  |   platform: ESP8266 | ||||||
|  |   board: esp07 | ||||||
|  |   # Use this for testing while developing: | ||||||
|  |   # esphomelib_version: | ||||||
|  |   #   local: ~/path/to/esphomelib | ||||||
|  |   build_path: build/test3 | ||||||
|  |  | ||||||
|  | substitutions: | ||||||
|  |   devicename: test3 | ||||||
|  |  | ||||||
|  | api: | ||||||
|  |  | ||||||
|  | i2c: | ||||||
|  |   sda: 4 | ||||||
|  |   scl: 5 | ||||||
|  |   scan: False | ||||||
|  |  | ||||||
|  | spi: | ||||||
|  |   clk_pin: GPIO12 | ||||||
|  |   mosi_pin: GPIO13 | ||||||
|  |   miso_pin: GPIO14 | ||||||
|  |  | ||||||
|  | uart: | ||||||
|  |   tx_pin: GPIO1 | ||||||
|  |   rx_pin: GPIO3 | ||||||
|  |   baud_rate: 115200 | ||||||
|  |  | ||||||
|  | ota: | ||||||
|  |   safe_mode: True | ||||||
|  |   port: 3286 | ||||||
|  |  | ||||||
|  | logger: | ||||||
|  |   hardware_uart: UART1 | ||||||
|  |   level: DEBUG | ||||||
|  |  | ||||||
|  | web_server: | ||||||
|  |  | ||||||
|  | deep_sleep: | ||||||
|  |   run_duration: 20s | ||||||
|  |   sleep_duration: 50s | ||||||
|  |  | ||||||
|  | sensor: | ||||||
|  |   - platform: pmsx003 | ||||||
|  |     type: PMSX003 | ||||||
|  |     pm_1_0: | ||||||
|  |       name: "PM 1.0 Concentration" | ||||||
|  |     pm_2_5: | ||||||
|  |       name: "PM 2.5 Concentration" | ||||||
|  |     pm_10_0: | ||||||
|  |       name: "PM 10.0 Concentration" | ||||||
|  |   - platform: pmsx003 | ||||||
|  |     type: PMS5003T | ||||||
|  |     pm_2_5: | ||||||
|  |       name: "PM 2.5 Concentration" | ||||||
|  |     temperature: | ||||||
|  |       name: "PMS Temperature" | ||||||
|  |     humidity: | ||||||
|  |       name: "PMS Humidity" | ||||||
|  |   - platform: pmsx003 | ||||||
|  |     type: PMS5003ST | ||||||
|  |     pm_2_5: | ||||||
|  |       name: "PM 2.5 Concentration" | ||||||
|  |     temperature: | ||||||
|  |       name: "PMS Temperature" | ||||||
|  |     humidity: | ||||||
|  |       name: "PMS Humidity" | ||||||
|  |     formaldehyde: | ||||||
|  |       name: "PMS Formaldehyde Concentration" | ||||||
|  |   - platform: cse7766 | ||||||
|  |     voltage: | ||||||
|  |       name: "CSE7766 Voltage" | ||||||
|  |     current: | ||||||
|  |       name: "CSE7766 Current" | ||||||
|  |     power: | ||||||
|  |       name: "CSE776 Power" | ||||||
|  |   - platform: apds9960 | ||||||
|  |     type: proximity | ||||||
|  |     name: APDS9960 Proximity | ||||||
|  |   - platform: apds9960 | ||||||
|  |     type: clear | ||||||
|  |     name: APDS9960 Clear | ||||||
|  |   - platform: apds9960 | ||||||
|  |     type: red | ||||||
|  |     name: APDS9960 Red | ||||||
|  |   - platform: apds9960 | ||||||
|  |     type: green | ||||||
|  |     name: APDS9960 Green | ||||||
|  |   - platform: apds9960 | ||||||
|  |     type: blue | ||||||
|  |     name: APDS9960 Blue | ||||||
|  |   - platform: homeassistant | ||||||
|  |     entity_id: sensor.hello_world | ||||||
|  |     id: ha_hello_world | ||||||
|  |  | ||||||
|  | time: | ||||||
|  | - platform: homeassistant | ||||||
|  |  | ||||||
|  | apds9960: | ||||||
|  |   address: 0x20 | ||||||
|  |   update_interval: 60s | ||||||
|  |  | ||||||
|  | binary_sensor: | ||||||
|  |   - platform: apds9960 | ||||||
|  |     direction: up | ||||||
|  |     name: APDS9960 Up | ||||||
|  |   - platform: apds9960 | ||||||
|  |     direction: down | ||||||
|  |     name: APDS9960 Down | ||||||
|  |   - platform: apds9960 | ||||||
|  |     direction: left | ||||||
|  |     name: APDS9960 Left | ||||||
|  |   - platform: apds9960 | ||||||
|  |     direction: right | ||||||
|  |     name: APDS9960 Right | ||||||
|  |   - platform: homeassistant | ||||||
|  |     entity_id: binary_sensor.hello_world | ||||||
|  |     id: ha_hello_world_binary | ||||||
|  |  | ||||||
|  | remote_receiver: | ||||||
|  |   pin: GPIO12 | ||||||
|  |   dump: [] | ||||||
|  |  | ||||||
|  | status_led: | ||||||
|  |   pin: GPIO2 | ||||||
|  |  | ||||||
|  | text_sensor: | ||||||
|  |   - platform: version | ||||||
|  |     name: "Esphomelib Version" | ||||||
|  |     icon: mdi:icon | ||||||
|  |     id: version_sensor | ||||||
|  |     on_value: | ||||||
|  |       - lambda: !lambda |- | ||||||
|  |           ESP_LOGD("main", "The state is %s=%s", x.c_str(), id(version_sensor).state.c_str()); | ||||||
|  |       - script.execute: my_script | ||||||
|  |       - homeassistant.service: | ||||||
|  |           service: notify.html5 | ||||||
|  |           data: | ||||||
|  |             title: New Humidity | ||||||
|  |           data_template: | ||||||
|  |             message: The humidity is {{ my_variable }}%. | ||||||
|  |           variables: | ||||||
|  |             my_variable: |- | ||||||
|  |               return id(version_sensor).state; | ||||||
|  |   - platform: template | ||||||
|  |     name: "Template Text Sensor" | ||||||
|  |     lambda: |- | ||||||
|  |       return {"Hello World"}; | ||||||
|  |   - platform: homeassistant | ||||||
|  |     entity_id: sensor.hello_world2 | ||||||
|  |     id: ha_hello_world2 | ||||||
|  |  | ||||||
|  | script: | ||||||
|  |   - id: my_script | ||||||
|  |     then: | ||||||
|  |       - lambda: 'ESP_LOGD("main", "Hello World!");' | ||||||
|  |  | ||||||
|  | stepper: | ||||||
|  |   - platform: uln2003 | ||||||
|  |     id: my_stepper | ||||||
|  |     pin_a: GPIO12 | ||||||
|  |     pin_b: GPIO13 | ||||||
|  |     pin_c: GPIO14 | ||||||
|  |     pin_d: GPIO15 | ||||||
|  |     sleep_when_done: no | ||||||
|  |     step_mode: HALF_STEP | ||||||
|  |     max_speed: 250 steps/s | ||||||
|  |  | ||||||
|  |     # Optional: | ||||||
|  |     acceleration: inf | ||||||
|  |     deceleration: inf | ||||||
|  |  | ||||||
|  | interval: | ||||||
|  |   interval: 5s | ||||||
|  |   then: | ||||||
|  |     - logger.log: "Interval Run" | ||||||
		Reference in New Issue
	
	Block a user