From 0b3cdcaa8650dccf3eabb5df0c14017095c13004 Mon Sep 17 00:00:00 2001 From: aderusha Date: Tue, 11 Feb 2020 15:44:24 -0500 Subject: [PATCH] HASP v0.39 --- Documentation/README.md | 10 +++ Home_Assistant/deployhasp.sh | 68 +++++++++++------- .../hasp_plate01_00_autofirmwareupdate.yaml | 2 +- .../hasp_plate01_00_backlightbysun.yaml | 2 +- Home_Assistant/hasppackages.tar.gz | Bin 11753 -> 12449 bytes Home_Assistant/migrate-hasp-107.sh | 32 +++++++++ Home_Assistant/packages/hasp_demo.yaml | 4 +- .../packages/hasp_plate01_lovelace.txt | 31 ++++++++ .../plate01/hasp_plate01_00_components.yaml | 16 ++--- .../plate01/hasp_plate01_p2_clock.yaml | 2 +- .../plate01/hasp_plate01_p2_weather.yaml | 8 +-- 11 files changed, 133 insertions(+), 42 deletions(-) create mode 100644 Home_Assistant/migrate-hasp-107.sh create mode 100644 Home_Assistant/packages/hasp_plate01_lovelace.txt diff --git a/Documentation/README.md b/Documentation/README.md index 9ef436a..4c9e0fb 100644 --- a/Documentation/README.md +++ b/Documentation/README.md @@ -38,6 +38,16 @@ Utilize the provided Home Assistant automations to control and interact with the Time to remove the training wheels and learn to send commands to and from the panel via MQTT. +---- + +## Frequently Asked Questions + +* **Can I install HASP outside of North America?** While the various power supply options for the HASP electronics should offer a solution which can handle line voltage in most countries, the physical installation of the device probably won't work outside of North America. There is no international standard for the size and shape of workboxes, so things like screw hole locations and overall mounting dimensions used for the HASP are unlikely to work in any workbox outside of North America. +* **Can I use HASP with \**? If your home automation system can send Nextion commands as MQTT payloads, then yes. Getting it all to work is going to take a lot of work, but it's possible. +* **Can I run HASP without a neutral wire?** Like most smart devices, a HASP installation will require a neutral wire available in the box you're mounting into. + +---- + ## HASwitchPlate Architecture The complete HA SwitchPlate build consists of 4 physical components: diff --git a/Home_Assistant/deployhasp.sh b/Home_Assistant/deployhasp.sh index 7f8303e..23a747f 100644 --- a/Home_Assistant/deployhasp.sh +++ b/Home_Assistant/deployhasp.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash ############################################################################### -# deployhasp.sh - Configure Home Assistnat for HASP integration, then download +# deployhasp.sh - Configure Home Assistant for HASP integration, then download # the latest HASP automation package and modify for the provided device name ############################################################################### @@ -68,7 +68,20 @@ then echo " packages: !include_dir_named packages" echo "===========================================================================" else - sed -i 's/^homeassistant:.*/homeassistant:\n packages: !include_dir_named packages/' configuration.yaml + if grep "^homeassistant:" configuration.yaml > /dev/null + then + sed -i 's/^homeassistant:.*/homeassistant:\n packages: !include_dir_named packages/' configuration.yaml + elif grep "^default_config:" configuration.yaml > /dev/null + then + sed -i 's/^default_config:.*/default_config:\nhomeassistant:\n packages: !include_dir_named packages/' configuration.yaml + else + echo "===========================================================================" + echo "WARNING: Could not add package declaration to 'configuration.yaml'." + echo " Please add the following statement to your configuration:" + echo "default_config:" + echo " packages: !include_dir_named packages" + echo "===========================================================================" + fi fi fi @@ -76,36 +89,33 @@ fi if ! grep "^recorder:" configuration.yaml > /dev/null then echo "recorder:" >> configuration.yaml + echo " include:" >> configuration.yaml + echo " domains:" >> configuration.yaml + echo " - automation" >> configuration.yaml + echo " - binary_sensor" >> configuration.yaml + echo " - input_boolean" >> configuration.yaml + echo " - input_number" >> configuration.yaml + echo " - input_select" >> configuration.yaml + echo " - input_datetime" >> configuration.yaml + echo " - input_text" >> configuration.yaml + echo " - weather" >> configuration.yaml fi # Warn if MQTT is not enabled if ! grep "^mqtt:" configuration.yaml > /dev/null then - echo "===========================================================================" - echo "WARNING: Required MQTT broker configuration not setup in configuration.yaml" - echo "HASP WILL NOT FUNCTION UNTIL THIS HAS BEEN CONFIGURED! The embedded option" - echo "offered my Home Assistant is buggy, so deploying Mosquitto is recommended." - echo "" - echo "Home Assistant MQTT configuration: https://www.home-assistant.io/docs/mqtt/broker/#run-your-own" - echo "Install Mosquitto: sudo apt-get install mosquitto mosquitto-clients" - echo "===========================================================================" -fi - -# Hass has a bug where packaged automations don't work unless you have at least one -# automation manually created outside of the packages. Attempt to test for that and -# create a dummy automation if an empty automations.yaml file is found. -if grep "^automation: \!include automations.yaml" configuration.yaml > /dev/null -then - if [ -f automations.yaml ] + if ! grep '"domain": "mqtt"' .storage/core.config_entries > /dev/null then - if [[ $(< automations.yaml) == "[]" ]] - then - echo "WARNING: empty automations.yaml found, creating DUMMY automation for package compatibility" - echo "- action: []" > automations.yaml - echo " id: DUMMY" >> automations.yaml - echo " alias: DUMMY Can Be Deleted After First Automation Has Been Added" >> automations.yaml - echo " trigger: []" >> automations.yaml - fi + echo "===========================================================================" + echo "WARNING: Required MQTT broker configuration not setup in configuration.yaml" + echo " or added under Configuration > Integrations." + echo "" + echo "HASP WILL NOT FUNCTION UNTIL THIS HAS BEEN CONFIGURED! The embedded option" + echo "offered my Home Assistant is buggy, so deploying Mosquitto is recommended." + echo "" + echo "Home Assistant MQTT configuration: https://www.home-assistant.io/docs/mqtt/broker/#run-your-own" + echo "Install Mosquitto: sudo apt-get install mosquitto mosquitto-clients" + echo "===========================================================================" fi fi @@ -123,6 +133,7 @@ then # rename text in contents of files sed -i -- 's/plate01/'"$hasp_device"'/g' $hasp_temp_dir/packages/plate01/hasp_plate01_*.yaml sed -i -- 's/plate01/'"$hasp_device"'/g' $hasp_temp_dir/hasp-examples/plate01/hasp_plate01_*.yaml + sed -i -- 's/plate01/'"$hasp_device"'/g' $hasp_temp_dir/packages/hasp_plate01_lovelace.txt # rename files and folder - thanks to @cloggedDrain for this loop! mkdir $hasp_temp_dir/packages/$hasp_device @@ -156,6 +167,8 @@ then fi done rm -rf $hasp_temp_dir/hasp-examples/plate01 + # rename the lovelace UI file + mv $hasp_temp_dir/packages/hasp_plate01_lovelace.txt $hasp_temp_dir/packages/hasp_${hasp_device}_lovelace.txt fi # Check to see if the target directories already exist @@ -193,3 +206,6 @@ fi echo "===========================================================================" echo "SUCCESS! Restart Home Assistant to enable HASP device $hasp_device" +echo "Check the file packages/hasp_${hasp_device}_lovelace.txt for a set of" +echo "basic Lovelace UI elements you can include in your configuration to manage" +echo "the new device." diff --git a/Home_Assistant/hasp-examples/plate01/hasp_plate01_00_autofirmwareupdate.yaml b/Home_Assistant/hasp-examples/plate01/hasp_plate01_00_autofirmwareupdate.yaml index 5a7ca7b..0f4cf9d 100644 --- a/Home_Assistant/hasp-examples/plate01/hasp_plate01_00_autofirmwareupdate.yaml +++ b/Home_Assistant/hasp-examples/plate01/hasp_plate01_00_autofirmwareupdate.yaml @@ -15,4 +15,4 @@ automation: - service: mqtt.publish data_template: topic: 'hasp/plate01/command/espupdate' - payload: '' + payload: '' \ No newline at end of file diff --git a/Home_Assistant/hasp-examples/plate01/hasp_plate01_00_backlightbysun.yaml b/Home_Assistant/hasp-examples/plate01/hasp_plate01_00_backlightbysun.yaml index 56214ca..d385bf7 100644 --- a/Home_Assistant/hasp-examples/plate01/hasp_plate01_00_backlightbysun.yaml +++ b/Home_Assistant/hasp-examples/plate01/hasp_plate01_00_backlightbysun.yaml @@ -8,7 +8,7 @@ automation: trigger: - platform: time_pattern # Matches every minute - seconds: 00 + seconds: 0 condition: - condition: template value_template: '{{ states.sun.sun.attributes.elevation <= 10 }}' diff --git a/Home_Assistant/hasppackages.tar.gz b/Home_Assistant/hasppackages.tar.gz index b3c0ba256b63182cfa0d9d515a8927b870f4cac3..7b94de78af37368a306f7130d54e1e0652f9aea1 100644 GIT binary patch delta 12375 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
    <>sHs=# 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 ORD6!5S+E^&u>S>3y)efB diff --git a/Home_Assistant/migrate-hasp-107.sh b/Home_Assistant/migrate-hasp-107.sh new file mode 100644 index 0000000..a3124da --- /dev/null +++ b/Home_Assistant/migrate-hasp-107.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +############################################################################### +# migrate-hasp-107.sh - Modify an existing Home Assistant configuration +# with HASP deployed to accomodate breaking changes in v107 +############################################################################### + +# Confirm that we're working in the .homeassistant folder by checking for configuration.yaml +if [ ! -f configuration.yaml ] +then + echo "WARNING: 'configuration.yaml' not found in current directory." + echo "Searching for Home Assistant 'configuration.yaml'..." + configfile=$(find / -name configuration.yaml 2>/dev/null) + count=$(echo "$configfile" | wc -l) + if [ $count == 1 ] + then + configdir=$(dirname "${configfile}") + cd $configdir + echo "INFO: configuration.yaml found under: $configdir" + else + echo "ERROR: Failed to locate the active 'configuration.yaml'" + echo " Please run this script from the homeassistant" + echo " configuration folder for your environment." + exit 1 + fi +fi + +# If the user has already deployed HASP devices... +if [ -d packages ] +then + # Search through existing packages to see if we have any "view:" statements to remove as they have been deprecated + find packages -name "hasp_*.yaml" -exec sed -i '/[[:blank:]]view\:/d' {} + +fi \ No newline at end of file diff --git a/Home_Assistant/packages/hasp_demo.yaml b/Home_Assistant/packages/hasp_demo.yaml index f38ffe4..c6c0522 100644 --- a/Home_Assistant/packages/hasp_demo.yaml +++ b/Home_Assistant/packages/hasp_demo.yaml @@ -3,7 +3,9 @@ # these and/or replace with your own devices weather: - - platform: met + - platform: nws + api_key: haspuser@haswitchplate.com + name: nws alarm_control_panel: - platform: manual diff --git a/Home_Assistant/packages/hasp_plate01_lovelace.txt b/Home_Assistant/packages/hasp_plate01_lovelace.txt new file mode 100644 index 0000000..2329b2b --- /dev/null +++ b/Home_Assistant/packages/hasp_plate01_lovelace.txt @@ -0,0 +1,31 @@ + - path: plate01 + title: plate01 + badges: + - entity: binary_sensor.plate01_connected + - entity: sensor.plate01_status + cards: + - type: entities + title: plate01 Page Selection + entities: + - input_number.hasp_plate01_activepage + - input_number.hasp_plate01_pagebutton1page + - input_text.hasp_plate01_pagebutton1label + - input_number.hasp_plate01_pagebutton2page + - input_text.hasp_plate01_pagebutton2label + - input_number.hasp_plate01_pagebutton3page + - input_text.hasp_plate01_pagebutton3label + - type: entities + title: plate01 Colors + entities: + - input_number.hasp_plate01_selectedforegroundcolor + - input_number.hasp_plate01_selectedbackgroundcolor + - input_number.hasp_plate01_unselectedforegroundcolor + - input_number.hasp_plate01_unselectedbackgroundcolor + - type: entities + title: plate01 automations + entities: + - automation.hasp_plate01_00_firsttimesetup + - type: entities + title: Light + entities: + - light.plate01_backlight \ No newline at end of file diff --git a/Home_Assistant/packages/plate01/hasp_plate01_00_components.yaml b/Home_Assistant/packages/plate01/hasp_plate01_00_components.yaml index c79b6f2..6e22142 100755 --- a/Home_Assistant/packages/plate01/hasp_plate01_00_components.yaml +++ b/Home_Assistant/packages/plate01/hasp_plate01_00_components.yaml @@ -67,52 +67,52 @@ input_text: input_number: hasp_plate01_pagebutton1page: name: plate01 Page 1 Page - icon: mdi:format-list-numbered + icon: mdi:numeric min: 0 max: 9 step: 1 hasp_plate01_pagebutton2page: name: plate01 Page 2 Page - icon: mdi:format-list-numbered + icon: mdi:numeric min: 0 max: 9 step: 1 hasp_plate01_pagebutton3page: name: plate01 Page 3 Page - icon: mdi:format-list-numbered + icon: mdi:numeric min: 0 max: 9 step: 1 hasp_plate01_activepage: name: plate01 Active Page - icon: mdi:format-list-numbered + icon: mdi:numeric min: 0 max: 9 step: 1 hasp_plate01_alarmcode1: name: plate01 AlarmCode1 - icon: mdi:format-list-numbered + icon: mdi:numeric min: -1 max: 9 step: 1 initial: -1 hasp_plate01_alarmcode2: name: plate01 AlarmCode2 - icon: mdi:format-list-numbered + icon: mdi:numeric min: -1 max: 9 step: 1 initial: -1 hasp_plate01_alarmcode3: name: plate01 AlarmCode3 - icon: mdi:format-list-numbered + icon: mdi:numeric min: -1 max: 9 step: 1 initial: -1 hasp_plate01_alarmcode4: name: plate01 AlarmCode4 - icon: mdi:format-list-numbered + icon: mdi:numeric min: -1 max: 9 step: 1 diff --git a/Home_Assistant/packages/plate01/hasp_plate01_p2_clock.yaml b/Home_Assistant/packages/plate01/hasp_plate01_p2_clock.yaml index 39bb7a9..04c2694 100755 --- a/Home_Assistant/packages/plate01/hasp_plate01_p2_clock.yaml +++ b/Home_Assistant/packages/plate01/hasp_plate01_p2_clock.yaml @@ -33,7 +33,7 @@ automation: trigger: platform: time_pattern # Matches every minute - seconds: 00 + seconds: 0 condition: - condition: state entity_id: 'binary_sensor.plate01_connected' diff --git a/Home_Assistant/packages/plate01/hasp_plate01_p2_weather.yaml b/Home_Assistant/packages/plate01/hasp_plate01_p2_weather.yaml index b1ecb48..16410f0 100755 --- a/Home_Assistant/packages/plate01/hasp_plate01_p2_weather.yaml +++ b/Home_Assistant/packages/plate01/hasp_plate01_p2_weather.yaml @@ -6,7 +6,7 @@ automation: - alias: hasp_plate01_p2_Weather trigger: - platform: state - entity_id: weather.met_no + entity_id: weather.nws - platform: state entity_id: 'binary_sensor.plate01_connected' - platform: homeassistant @@ -23,12 +23,12 @@ automation: - service: mqtt.publish data: topic: 'hasp/plate01/command/p[2].b[6].txt' - payload_template: '"{{state_attr("weather.met_no","temperature")|int}}°F"' + payload_template: '"{{state_attr("weather.nws","temperature")|int}}°F"' - service: mqtt.publish data: topic: 'hasp/plate01/command/p[2].b[7].font' - payload_template: '{% if states.weather.met_no.state|length <= 6 -%}3{% elif (states.weather.met_no.state|length > 6) and (states.weather.met_no.state|length <= 10) %}2{% elif (states.weather.met_no.state|length > 10) and (states.weather.met_no.state|length <= 15) %}1{% else %}0{%- endif %}' + payload_template: '{% if states.weather.nws.state|length <= 6 -%}3{% elif (states.weather.nws.state|length > 6) and (states.weather.nws.state|length <= 10) %}2{% elif (states.weather.nws.state|length > 10) and (states.weather.nws.state|length <= 15) %}1{% else %}0{%- endif %}' - service: mqtt.publish data: topic: 'hasp/plate01/command/p[2].b[7].txt' - payload_template: '"{{states.weather.met_no.state|wordwrap(20, wrapstring="\\r")|title}}"' \ No newline at end of file + payload_template: '"{{states.weather.nws.state|wordwrap(20, wrapstring="\\r")|title}}"' \ No newline at end of file