commit 885dce92bc4acddeaece70398ae901b6c14f663a Author: Michael Housh Date: Sat Oct 19 21:04:51 2024 -0400 Initial commit diff --git a/.HA_VERSION b/.HA_VERSION new file mode 100644 index 0000000..65620ba --- /dev/null +++ b/.HA_VERSION @@ -0,0 +1 @@ +2024.10.3 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2cf8b80 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +.storage/* +custom_components/* +www/community/* +image/* + +*.log +*.log* +*.db +*.db* +*.pem +*.csv +sdkconfig.* + diff --git a/automations.yaml b/automations.yaml new file mode 100644 index 0000000..1f1d390 --- /dev/null +++ b/automations.yaml @@ -0,0 +1,451 @@ +- id: '1634559948824' + alias: Set low dehumidification dew point set point + description: Set low dehumidification dew point set point + trigger: + - platform: mqtt + topic: frankensystem/set_points/dehumidfy/low_dew_point + condition: [] + action: + - service: input_number.set_value + target: + entity_id: input_number.low_dehumidification_dew_point + data: + value: '{{ trigger.payload | float }}' + mode: single +- id: '1634560389704' + alias: Publish Low Dehumidification Dew Point + description: Publishes the low dehumidification set point to an MQTT topic + trigger: + - platform: state + entity_id: input_number.low_dehumidification_dew_point + condition: [] + action: + - service: mqtt.publish + data: + topic: frankensystem/set_points/dehumidify/low_dew_point + retain: true + payload: '{{ states(''input_number.low_dehumidification_dew_point'') | float + }}' + mode: single +- id: '1634561011408' + alias: Set high dehumidification dew point + description: Sets the high dehumidification dew point set point. + trigger: + - platform: mqtt + topic: frankensystem/set_points/dehumidify/high_dew_point + condition: [] + action: + - service: input_number.set_value + target: + entity_id: input_number.high_dehumidification_dew_point + data: + value: '{{ trigger.payload | float }}' + mode: single +- id: '1634561223655' + alias: Publish High Dew Point Set Point + description: Publishes the high dew point set point to MQTT + trigger: + - platform: state + entity_id: input_number.high_dehumidification_dew_point + condition: [] + action: + - service: mqtt.publish + data: + topic: frankensystem/set_points/dehumidify/high_dew_point + retain: true + payload: '{{ states(''input_number.high_dehumidification_dew_point'') | float + }}' + mode: single +- id: '1634559948834' + alias: Set low dehumidification relative humidity + description: Set low dehumidification relative humidity set point + trigger: + - platform: mqtt + topic: frankensystem/set_points/dehumidfy/low_relative_humidity + condition: [] + action: + - service: input_number.set_value + target: + entity_id: input_number.low_dehumidification_relative_humidity + data: + value: '{{ trigger.payload | float }}' + mode: single +- id: '1634560389714' + alias: Publish Low Dehumidification Relative Humidity + description: Publishes the low dehumidification set point to an MQTT topic + trigger: + - platform: state + entity_id: input_number.low_dehumidification_relative_humidity + condition: [] + action: + - service: mqtt.publish + data: + topic: frankensystem/set_points/dehumidify/low_relative_humidity + retain: true + payload: '{{ states(''input_number.low_dehumidification_relative_humidity'') + | float }}' + mode: single +- id: '1634561011428' + alias: Set high dehumidification relative humidity set point + description: Sets the high dehumidification relative humidity set point. + trigger: + - platform: mqtt + topic: frankensystem/set_points/dehumidify/high_relative_humidity + condition: [] + action: + - service: input_number.set_value + target: + entity_id: input_number.high_dehumidification_relative_humidity + data: + value: '{{ trigger.payload | float }}' + mode: single +- id: '1634561223665' + alias: Publish Dehumidification High Relative Humidity Set Point + description: Publishes the high relative humidity set point to MQTT + trigger: + - platform: state + entity_id: input_number.high_dehumidification_relative_humidity + condition: [] + action: + - service: mqtt.publish + data: + topic: frankensystem/set_points/dehumidify/high_dew_point + retain: true + payload: '{{ states(''input_number.high_dehumidification_relative_humidity'') + | float }}' + mode: single +- id: '1634569072478' + alias: Interlock Dehumidification Dew Point Turns Off Relative Humidity + description: Ensures that dehumidification mode is either set to relative humidity + or dew point mode. + trigger: + - platform: state + entity_id: input_boolean.enable_dew_point_dehumidification_mode + condition: + - condition: state + entity_id: input_boolean.enable_dew_point_dehumidification_mode + state: 'on' + action: + - service: input_boolean.turn_off + target: + entity_id: input_boolean.enable_relative_humidity_dehumidification_mode + mode: single +- id: '1634569532222' + alias: Interlock Dehumidification Relative Humidity Turns OFF Dew Point Mode + description: Ensures that the dehumidification mode is either dew point or relative + humidity + trigger: + - platform: state + entity_id: input_boolean.enable_relative_humidity_dehumidification_mode + condition: + - condition: state + entity_id: input_boolean.enable_relative_humidity_dehumidification_mode + state: 'on' + action: + - service: input_boolean.turn_off + target: + entity_id: input_boolean.enable_dew_point_dehumidification_mode + mode: single +- id: '1634570370065' + alias: Interlock Humidification Dew Point Enabled Turns OFF Relative Humidity + description: Ensures that humidification mode can only be in dew point or relative + humidity control mode. + trigger: + - platform: state + entity_id: input_boolean.enable_dew_point_humidification_mode + condition: + - condition: state + entity_id: input_boolean.enable_dew_point_humidification_mode + state: 'on' + action: + - service: input_boolean.turn_off + target: + entity_id: input_boolean.enable_relative_humidity_humidification_mode + mode: single +- id: '1634570480746' + alias: Interlock Relative Humidity Humidification Mode Turns OFF Dew Point Mode + description: Ensures that humidification mode can only be in relative humidity or + dew point control modes. + trigger: + - platform: state + entity_id: input_boolean.enable_relative_humidity_humidification_mode + condition: + - condition: state + entity_id: input_boolean.enable_relative_humidity_humidification_mode + state: 'on' + action: + - service: input_boolean.turn_off + target: + entity_id: input_boolean.enable_dew_point_humidification_mode + mode: single +- id: '1710435997779' + alias: Renew Let's Encrypt Certificates + description: Restarts the Let's Encrypt add-on in order to renew certificates on + a regular basis. + trigger: + - platform: time + at: 02:03:00 + condition: [] + action: + - service: hassio.addon_start + metadata: {} + data: + addon: core_letsencrypt + mode: single +- id: '1729261288287' + alias: Fan High Interlock + description: Turns off other fan speeds when fan high switch is turned on. + triggers: + - trigger: state + entity_id: + - switch.fan_high_2 + from: 'off' + to: 'on' + conditions: [] + actions: + - action: switch.turn_off + metadata: {} + data: {} + target: + entity_id: switch.fan_low_2 + - action: switch.turn_off + metadata: {} + data: {} + target: + entity_id: switch.fan_medium_low + - action: switch.turn_off + metadata: {} + data: {} + target: + entity_id: switch.fan_medium_high_2 + mode: single +- id: '1729261435039' + alias: Fan Medium High Interlock + description: Turns off other fan speeds when fan medium-high switch is turned on. + triggers: + - trigger: state + entity_id: + - switch.fan_medium_high_2 + from: 'off' + to: 'on' + conditions: [] + actions: + - action: switch.turn_off + metadata: {} + data: {} + target: + entity_id: switch.fan_low_2 + - action: switch.turn_off + metadata: {} + data: {} + target: + entity_id: switch.fan_medium_low + - action: switch.turn_off + metadata: {} + data: {} + target: + entity_id: switch.fan_high_2 + mode: single +- id: '1729261831943' + alias: Fan Medium Low Interlock + description: Turns off other fan speeds when fan medium-low switch is turned on. + triggers: + - trigger: state + entity_id: + - switch.fan_medium_low_2 + from: 'off' + to: 'on' + conditions: [] + actions: + - action: switch.turn_off + metadata: {} + data: {} + target: + entity_id: switch.fan_low_2 + - action: switch.turn_off + metadata: {} + data: {} + target: + entity_id: switch.fan_medium_high_2 + - action: switch.turn_off + metadata: {} + data: {} + target: + entity_id: switch.fan_high_2 + mode: single +- id: '1729261921904' + alias: Fan Low Interlock + description: Turns off other fan speeds when fan low switch is turned on. + triggers: + - trigger: state + entity_id: + - switch.fan_low_2 + from: 'off' + to: 'on' + conditions: [] + actions: + - action: switch.turn_off + metadata: {} + data: {} + target: + entity_id: switch.fan_medium_low + - action: switch.turn_off + metadata: {} + data: {} + target: + entity_id: switch.fan_medium_high_2 + - action: switch.turn_off + metadata: {} + data: {} + target: + entity_id: switch.fan_high_2 + mode: single +- id: '1729262656389' + alias: Ensure Fan Speed is ON + description: Ensures at least low fan speed is on if all other fan speeds are toggled + off. + triggers: + - trigger: state + entity_id: + - switch.fan_high_2 + from: 'on' + to: 'off' + for: + hours: 0 + minutes: 0 + seconds: 2 + - trigger: state + entity_id: + - switch.fan_medium_high_2 + from: 'on' + to: 'off' + for: + hours: 0 + minutes: 0 + seconds: 2 + - trigger: state + entity_id: + - switch.fan_medium_low_2 + from: 'on' + to: 'off' + for: + hours: 0 + minutes: 0 + seconds: 2 + - trigger: state + entity_id: + - switch.fan_low_2 + from: 'on' + to: 'off' + for: + hours: 0 + minutes: 0 + seconds: 2 + conditions: + - condition: and + conditions: + - condition: state + entity_id: switch.fan_low_2 + state: 'off' + for: + hours: 0 + minutes: 0 + seconds: 2 + - condition: state + entity_id: switch.fan_medium_low_2 + state: 'off' + for: + hours: 0 + minutes: 0 + seconds: 2 + - condition: state + entity_id: switch.fan_medium_high_2 + state: 'off' + for: + hours: 0 + minutes: 0 + seconds: 2 + - condition: state + entity_id: switch.fan_high_2 + state: 'off' + for: + hours: 0 + minutes: 0 + seconds: 2 + actions: + - action: switch.turn_on + metadata: {} + data: {} + target: + entity_id: switch.fan_low_2 + mode: single +- id: '1729291609123' + alias: Interlock Fan Speed Selection with Switch + description: Activates the appropriate switch when a fan speed is chosen by the + select menu. + triggers: + - trigger: state + entity_id: + - input_select.frankensystem_fan_speed + conditions: [] + actions: + - if: + - condition: state + entity_id: input_select.frankensystem_fan_speed + state: High + for: + hours: 0 + minutes: 0 + seconds: 0 + then: + - action: switch.turn_on + metadata: {} + data: {} + target: + entity_id: switch.fan_high_2 + else: + - if: + - condition: state + entity_id: input_select.frankensystem_fan_speed + state: Medium-High + for: + hours: 0 + minutes: 0 + seconds: 0 + then: + - action: switch.turn_on + metadata: {} + data: {} + target: + entity_id: switch.fan_medium_high_2 + else: + - if: + - condition: state + entity_id: input_select.frankensystem_fan_speed + state: Medium-Low + for: + hours: 0 + minutes: 0 + seconds: 0 + then: + - action: switch.turn_on + metadata: {} + data: {} + target: + entity_id: switch.fan_medium_low_2 + else: + - if: + - condition: state + entity_id: input_select.frankensystem_fan_speed + state: Low + for: + hours: 0 + minutes: 0 + seconds: 0 + then: + - action: switch.turn_on + metadata: {} + data: {} + target: + entity_id: switch.fan_low_2 + mode: single diff --git a/blueprints/automation/homeassistant/motion_light.yaml b/blueprints/automation/homeassistant/motion_light.yaml new file mode 100644 index 0000000..54a4a4f --- /dev/null +++ b/blueprints/automation/homeassistant/motion_light.yaml @@ -0,0 +1,54 @@ +blueprint: + name: Motion-activated Light + description: Turn on a light when motion is detected. + domain: automation + source_url: https://github.com/home-assistant/core/blob/dev/homeassistant/components/automation/blueprints/motion_light.yaml + input: + motion_entity: + name: Motion Sensor + selector: + entity: + domain: binary_sensor + device_class: motion + light_target: + name: Light + selector: + target: + entity: + domain: light + no_motion_wait: + name: Wait time + description: Time to leave the light on after last motion is detected. + default: 120 + selector: + number: + min: 0 + max: 3600 + unit_of_measurement: seconds + +# If motion is detected within the delay, +# we restart the script. +mode: restart +max_exceeded: silent + +trigger: + platform: state + entity_id: !input motion_entity + from: "off" + to: "on" + +action: + - alias: "Turn on the light" + service: light.turn_on + target: !input light_target + - alias: "Wait until there is no motion from device" + wait_for_trigger: + platform: state + entity_id: !input motion_entity + from: "on" + to: "off" + - alias: "Wait the number of seconds that has been set" + delay: !input no_motion_wait + - alias: "Turn off the light" + service: light.turn_off + target: !input light_target diff --git a/blueprints/automation/homeassistant/notify_leaving_zone.yaml b/blueprints/automation/homeassistant/notify_leaving_zone.yaml new file mode 100644 index 0000000..71abf8f --- /dev/null +++ b/blueprints/automation/homeassistant/notify_leaving_zone.yaml @@ -0,0 +1,44 @@ +blueprint: + name: Zone Notification + description: Send a notification to a device when a person leaves a specific zone. + domain: automation + source_url: https://github.com/home-assistant/core/blob/dev/homeassistant/components/automation/blueprints/notify_leaving_zone.yaml + input: + person_entity: + name: Person + selector: + entity: + domain: person + zone_entity: + name: Zone + selector: + entity: + domain: zone + notify_device: + name: Device to notify + description: Device needs to run the official Home Assistant app to receive notifications. + selector: + device: + integration: mobile_app + +trigger: + platform: state + entity_id: !input person_entity + +variables: + zone_entity: !input zone_entity + # This is the state of the person when it's in this zone. + zone_state: "{{ states[zone_entity].name }}" + person_entity: !input person_entity + person_name: "{{ states[person_entity].name }}" + +condition: + condition: template + value_template: "{{ trigger.from_state.state == zone_state and trigger.to_state.state != zone_state }}" + +action: + - alias: "Notify that a person has left the zone" + domain: mobile_app + type: notify + device_id: !input notify_device + message: "{{ person_name }} has left {{ zone_state }}" diff --git a/blueprints/script/homeassistant/confirmable_notification.yaml b/blueprints/script/homeassistant/confirmable_notification.yaml new file mode 100644 index 0000000..d52e5a6 --- /dev/null +++ b/blueprints/script/homeassistant/confirmable_notification.yaml @@ -0,0 +1,84 @@ +blueprint: + name: Confirmable Notification + description: >- + A script that sends an actionable notification with a confirmation before + running the specified action. + domain: script + source_url: https://github.com/home-assistant/core/blob/master/homeassistant/components/script/blueprints/confirmable_notification.yaml + input: + notify_device: + name: Device to notify + description: Device needs to run the official Home Assistant app to receive notifications. + selector: + device: + integration: mobile_app + title: + name: "Title" + description: "The title of the button shown in the notification." + default: "" + selector: + text: + message: + name: "Message" + description: "The message body" + selector: + text: + confirm_text: + name: "Confirmation Text" + description: "Text to show on the confirmation button" + default: "Confirm" + selector: + text: + confirm_action: + name: "Confirmation Action" + description: "Action to run when notification is confirmed" + default: [] + selector: + action: + dismiss_text: + name: "Dismiss Text" + description: "Text to show on the dismiss button" + default: "Dismiss" + selector: + text: + dismiss_action: + name: "Dismiss Action" + description: "Action to run when notification is dismissed" + default: [] + selector: + action: + +mode: restart + +sequence: + - alias: "Set up variables" + variables: + action_confirm: "{{ 'CONFIRM_' ~ context.id }}" + action_dismiss: "{{ 'DISMISS_' ~ context.id }}" + - alias: "Send notification" + domain: mobile_app + type: notify + device_id: !input notify_device + title: !input title + message: !input message + data: + actions: + - action: "{{ action_confirm }}" + title: !input confirm_text + - action: "{{ action_dismiss }}" + title: !input dismiss_text + - alias: "Awaiting response" + wait_for_trigger: + - platform: event + event_type: mobile_app_notification_action + event_data: + action: "{{ action_confirm }}" + - platform: event + event_type: mobile_app_notification_action + event_data: + action: "{{ action_dismiss }}" + - choose: + - conditions: "{{ wait.trigger.event.data.action == action_confirm }}" + sequence: !input confirm_action + - conditions: "{{ wait.trigger.event.data.action == action_dismiss }}" + sequence: !input dismiss_action diff --git a/configuration.yaml b/configuration.yaml new file mode 100644 index 0000000..741e6e4 --- /dev/null +++ b/configuration.yaml @@ -0,0 +1,26 @@ +homeassistant: + packages: !include_dir_named packages/ + +# Configure a default setup of Home Assistant (frontend, api, etc) +default_config: + +# Text to speech +tts: + - platform: google_translate + +group: !include groups.yaml +automation: !include automations.yaml +script: !include scripts.yaml +scene: !include scenes.yaml +#sensor: !include sensors.yaml +#switch: !include switches.yaml +#influxdb: !include influxdb.yaml +template: !include templates.yaml + +# Example configuration.yaml entry for the HTTP component +http: + server_port: 443 + ssl_certificate: /ssl/fullchain.pem + ssl_key: /ssl/privkey.pem + + diff --git a/custom_templates/frankensystem.jinja b/custom_templates/frankensystem.jinja new file mode 100644 index 0000000..742f869 --- /dev/null +++ b/custom_templates/frankensystem.jinja @@ -0,0 +1,38 @@ +{% macro frankensystem_fan_is_on() %} + {% if state_attr('climate.thermostat', 'fan_mode') == 'on' or state_attr('climate.thermostat', 'hvac_action') != 'idle' %} + {{ true }} + {% else %} + {{ false }} + {% endif %} +{% endmacro %} + +{% macro get_frankensystem_fan_percent() %} +{% set fan_speed = 0 %} + +{% if frankensystem_fan_is_on() %} + {% if is_state('switch.fan_high', 'on') %} + {% set fan_speed = 100 %} + {% elif is_state('switch.fan_medium_high', 'on') %} + {% set fan_speed = 75 %} + {% elif is_state('switch.fan_medium_low', 'on') %} + {% set fan_speed = 50 %} + {% elif is_state('switch.fan_low', 'on') %} + {% set fan_speed = 25 %} + {% endif %} +{% endif %} + +{{ fan_speed }} + +{% endmacro %} + +{% macro get_active_fan_switch_id() %} + {% if is_state('switch.fan_high', 'on') %} + {{ "switch.fan_high" }} + {% elif is_state('switch.fan_medium_high', 'on') %} + {{ "switch.fan_medium_high" }} + {% elif is_state('switch.fan_medium_low', 'on') %} + {{ "switch.fan_medium_low" }} + {% elif is_state('switch.fan_low', 'on') %} + {{ "switch.fan_low" }} + {% endif %} +{% endmacro %} \ No newline at end of file diff --git a/esphome/.gitignore b/esphome/.gitignore new file mode 100644 index 0000000..0bbf89c --- /dev/null +++ b/esphome/.gitignore @@ -0,0 +1,10 @@ +# Gitignore settings for ESPHome +# This is an example and may include too much for your use-case. +# You can modify this file to suit your needs. +/.esphome/ +**/.pioenvs/ +**/.piolibdeps/ +**/lib/ +**/src/ +**/platformio.ini +/secrets.yaml diff --git a/esphome/damper-relay-1.yaml b/esphome/damper-relay-1.yaml new file mode 100644 index 0000000..e9c5c73 --- /dev/null +++ b/esphome/damper-relay-1.yaml @@ -0,0 +1,94 @@ +# change accordingly +substitutions: + # Device information + devicename: damper-relay-controller-1 + upper_devicename: FrankenSystem Damper Relay Controller + # Board / Pin Substitutions + platform: ESP32 + board: nodemcu-32s + # Relays + relay1_pin: GPIO18 + relay2_pin: GPIO05 + relay3_pin: GPIO19 + relay4_pin: GPIO17 + relay5_pin: GPIO04 + relay6_pin: GPIO16 + relay7_pin: GPIO15 + relay8_pin: GPIO02 + + +esphome: + name: $devicename + #platform: $platform + #board: $board + +esp32: + board: $board + framework: + type: arduino + version: recommended + +# Enable logging +logger: +# level: VERY_VERBOSE + +# Enable Home Assistant API +api: + +ota: + platform: esphome + password: "c269bfc3d2544cbeef35ed32dcc937fb" + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + + # Enable fallback hotspot (captive portal) in case wifi connection fails + ap: + ssid: "damper-relay-1 Fallback Hotspot" + password: "ppGYrjrlUbw7" + +#captive_portal: + +# Enable MQTT Broker communications. +mqtt: + broker: !secret mqtt_broker + username: !secret mqtt_username + password: !secret mqtt_password + topic_prefix: frankensystem + discovery: true + +switch: + # 8 Channel Relay - 2 + - platform: gpio + pin: $relay5_pin + name: "Coil Damper - 1" + + - platform: gpio + pin: $relay3_pin + name: "Coil Damper - 2" + + - platform: gpio + pin: $relay1_pin + name: "Coil Damper - 3" + + - platform: gpio + pin: $relay2_pin + name: "Bypass Damper - 1" + + - platform: gpio + pin: $relay4_pin + name: "Bypass Damper - 2" + + - platform: gpio + pin: $relay6_pin + name: "Spare - 1" + + - platform: gpio + pin: $relay7_pin + name: "Spare - 2" + + - platform: gpio + pin: $relay8_pin + name: "Spare - 3" + diff --git a/esphome/sensor-1.yaml b/esphome/sensor-1.yaml new file mode 100644 index 0000000..b8b0b58 --- /dev/null +++ b/esphome/sensor-1.yaml @@ -0,0 +1,67 @@ +esphome: + name: sensor-1 + platform: ESP8266 + board: nodemcuv2 + +# Enable logging +logger: + +# Enable Home Assistant API +api: + +ota: + platform: esphome + password: "bd2cc7a3c3bce9d1d088a52a3e730d4a" + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + + # Enable fallback hotspot (captive portal) in case wifi connection fails + ap: + ssid: "Sensor-1 Fallback Hotspot" + password: "S3h9aKPjGBH4" + +# Enable MQTT Broker communications +mqtt: + broker: !secret mqtt_broker + username: !secret mqtt_username + password: !secret mqtt_password + topic_prefix: frankensystem + discovery: true + +captive_portal: + +sensor: + + - platform: dht + pin: D1 + temperature: + name: "Post Coil Temperature" + humidity: + name: "Post Coil Humidity" + update_interval: 5s + + - platform: dht + pin: D2 + temperature: + name: "Return Temperature" + humidity: + name: "Return Humidity" + update_interval: 5s + + - platform: dht + pin: D3 + temperature: + name: "Mixed Air Temperature" + humidity: + name: "Mixed Air Humidity" + update_interval: 5s + + - platform: dht + pin: D0 + temperature: + name: "Supply Temperature" + humidity: + name: "Supply Humidity" + update_interval: 5s \ No newline at end of file diff --git a/esphome/system-relays.yaml b/esphome/system-relays.yaml new file mode 100644 index 0000000..3fc2fa0 --- /dev/null +++ b/esphome/system-relays.yaml @@ -0,0 +1,100 @@ +# change accordingly +substitutions: + # Device information + devicename: system-relays + upper_devicename: FrankenSystem System Relay Controller + # Board / Pin Substitutions + platform: ESP32 + board: nodemcu-32s + # Relays + relay1_pin: GPIO19 + relay2_pin: GPIO18 + relay3_pin: GPIO05 + relay4_pin: GPIO17 + relay5_pin: GPIO16 + relay6_pin: GPIO04 + relay7_pin: GPIO02 + relay8_pin: GPIO15 + +esphome: + name: $devicename + #platform: $platform + #board: $board + +esp32: + board: $board + framework: + type: arduino + version: recommended + +# Enable logging +logger: + level: VERY_VERBOSE + +# Enable Home Assistant API +api: + +ota: + platform: esphome + password: "c269bfc3d2544cbeef35ed32dcc937fb" + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + fast_connect: True + power_save_mode: NONE + + # Enable fallback hotspot (captive portal) in case wifi connection fails + #ap: + # ssid: "system-relays Fallback Hotspot" + # password: "ppGYrjrlUbw7" + +#captive_portal: + +# Enable MQTT Broker communications. +mqtt: + broker: !secret mqtt_broker + username: !secret mqtt_username + password: !secret mqtt_password + topic_prefix: frankensystem + discovery: true + +network: + enable_ipv6: True + +switch: + # 8 Channel Relay - 2 + - platform: gpio + pin: $relay4_pin + name: "Fan Low" + + - platform: gpio + pin: $relay5_pin + name: "Fan Medium Low" + + - platform: gpio + pin: $relay8_pin + name: "Fan Medium High" + + - platform: gpio + pin: $relay7_pin + name: "Fan High" + + - platform: gpio + pin: + number: $relay3_pin + inverted: true + name: "Dehumidification" + + - platform: gpio + pin: $relay1_pin + name: "Humidification" + + - platform: gpio + pin: $relay2_pin + name: "Reheat" + + - platform: gpio + pin: $relay6_pin + name: "Cooling" + diff --git a/grafana.yaml b/grafana.yaml new file mode 100644 index 0000000..e69de29 diff --git a/groups.yaml b/groups.yaml new file mode 100644 index 0000000..e69de29 diff --git a/influxdb.yaml b/influxdb.yaml new file mode 100644 index 0000000..4ad6cc3 --- /dev/null +++ b/influxdb.yaml @@ -0,0 +1,25 @@ +api_version: 2 +ssl: true +host: influxdb.frankensystem.dev +port: 443 +token: !secret influxdb_token +organization: 15d41366ef057eb5 +bucket: homeassistant +tags: + source: HA +tags_attributes: + - friendly_name +default_measurement: units +exclude: + entities: + - zone.home + domains: + - persistent_notification + - person +include: + domains: + - sensor + - binary_sensor + - sun + entities: + - weather.home \ No newline at end of file diff --git a/packages/damper_relays.yaml b/packages/damper_relays.yaml new file mode 100644 index 0000000..5924abd --- /dev/null +++ b/packages/damper_relays.yaml @@ -0,0 +1,72 @@ +# Damper Relays Configuratoin +# +# These are customizations that are associated with the FrankenSystem damper relays. +# +# + +switch: +# Custom switch templates. These are so that dampers show an inverted state +# in HomeAssistant, so they can be converted / shown as an open or closed valve. + - platform: template + switches: + coil_damper_1_inverted: + friendly_name: Coil Damper - 1 + unique_id: "damper_relays.coil_damper_1_inverted" + value_template: "{{ is_state('switch.coil_damper_1_2', 'off') }}" + turn_on: + action: switch.turn_off + target: + entity_id: switch.coil_damper_1_2 + turn_off: + action: switch.turn_on + target: + entity_id: switch.coil_damper_1_2 + coil_damper_2_inverted: + friendly_name: Coil Damper - 2 + unique_id: "damper_relays.coil_damper_2_inverted" + value_template: "{{ is_state('switch.coil_damper_2_2', 'off') }}" + turn_on: + action: switch.turn_off + target: + entity_id: switch.coil_damper_2_2 + turn_off: + action: switch.turn_on + target: + entity_id: switch.coil_damper_2_2 + coil_damper_3_inverted: + friendly_name: Coil Damper - 3 + unique_id: "damper_relays.coil_damper_3_inverted" + value_template: "{{ is_state('switch.coil_damper_3_2', 'off') }}" + turn_on: + action: switch.turn_off + target: + entity_id: switch.coil_damper_3_2 + turn_off: + action: switch.turn_on + target: + entity_id: switch.coil_damper_3_2 + bypass_damper_1_inverted: + friendly_name: Bypass Damper - 1 + unique_id: "damper_relays.bypass_damper_1_inverted" + value_template: "{{ is_state('switch.bypass_damper_1_2', 'off') }}" + turn_on: + action: switch.turn_off + target: + entity_id: switch.bypass_damper_1_2 + turn_off: + action: switch.turn_on + target: + entity_id: switch.bypass_damper_1_2 + bypass_damper_2_inverted: + friendly_name: Bypass Damper - 2 + unique_id: "damper_relays.bypass_damper_2_inverted" + value_template: "{{ is_state('switch.bypass_damper_2_2', 'off') }}" + turn_on: + action: switch.turn_off + target: + entity_id: switch.bypass_damper_2_2 + turn_off: + action: switch.turn_on + target: + entity_id: switch.bypass_damper_2_2 + diff --git a/scenes.yaml b/scenes.yaml new file mode 100644 index 0000000..e69de29 diff --git a/scripts.yaml b/scripts.yaml new file mode 100644 index 0000000..d2dbf00 --- /dev/null +++ b/scripts.yaml @@ -0,0 +1,20 @@ +set_frankensystem_fan_speed: + alias: Set FrankenSystem Fan Speed + sequence: + - action: notify.notify + metadata: {} + data: + message: '{{ this.speed }} was choosen.' + fields: + speed: + selector: + select: + options: + - High + - Medium-High + - Medium-Low + - Low + name: Speed + description: Fan Speed + required: true + description: Set the fan speed on the FrankenSysten diff --git a/secrets.yaml b/secrets.yaml new file mode 100644 index 0000000..1f1db6c --- /dev/null +++ b/secrets.yaml @@ -0,0 +1,6 @@ + +# Use this file to store secrets like usernames and passwords. +# Learn more at https://www.home-assistant.io/docs/configuration/secrets/ +wifi_ssid: HHE-Dev +wifi_password: Mjh063079 +influxdb_token: R5d7mTR40Ne19qbSQui9lOf4mp7jW1BktS62PxSZgUUNQloRx2EBKlm6zCqCoTxz1ku6S9MppkA5CbDbnYWpGQ== diff --git a/sensors.yaml b/sensors.yaml new file mode 100644 index 0000000..57dbac8 --- /dev/null +++ b/sensors.yaml @@ -0,0 +1,72 @@ +# Custom MQTT Sensor values. +- platform: mqtt + name: Mixed Air Dew Point + state_topic: "frankensystem/sensor/mixed_air_dew_point/state" + unit_of_measurement: "°F" + value_template: "{{ value_json.temperature }}" + payload_available: "online" + payload_not_available: "offline" + unique_id: "mixed_air_dew_point" + +- platform: mqtt + name: Mixed Air Enthalpy + state_topic: "frankensystem/sensor/mixed_air_enthalpy/state" + value_template: "{{ value_json.temperature }}" + #unit_of_measurement: "°F" + payload_available: "online" + payload_not_available: "offline" + unique_id: "mixed_air_enthalpy" + +- platform: mqtt + name: Post Coil Dew Point + state_topic: "frankensystem/sensor/post_coil_dew_point/state" + unit_of_measurement: "°F" + value_template: "{{ value_json.temperature }}" + payload_available: "online" + payload_not_available: "offline" + unique_id: "post_coil_dew_point" + +- platform: mqtt + name: Post Coil Enthalpy + state_topic: "frankensystem/sensor/post_coil_enthalpy/state" + value_template: "{{ value_json.temperature }}" + #unit_of_measurement: "°F" + payload_available: "online" + payload_not_available: "offline" + unique_id: "post_coil_enthalpy" + +- platform: mqtt + name: Return Dew Point + state_topic: "frankensystem/sensor/return_dew_point/state" + value_template: "{{ value_json.temperature }}" + unit_of_measurement: "°F" + payload_available: "online" + payload_not_available: "offline" + unique_id: "return_dew_point" + +- platform: mqtt + name: Return Enthalpy + state_topic: "frankensystem/sensor/return_enthalpy/state" + #unit_of_measurement: "°F" + #value_template: "{{ value_json.temperature }}"" + payload_available: "online" + payload_not_available: "offline" + unique_id: "return_enthalpy" + +- platform: mqtt + name: Supply Dew Point + state_topic: "frankensystem/sensor/supply_dew_point/state" + unit_of_measurement: "°F" + value_template: "{{ value_json.temperature }}" + payload_available: "online" + payload_not_available: "offline" + unique_id: "supply_dew_point" + +- platform: mqtt + name: Supply Enthalpy + state_topic: "frankensystem/sensor/supply_enthalpy/state" + #unit_of_measurement: "°F" + value_template: "{{ value_json.temperature }}" + payload_available: "online" + payload_not_available: "offline" + unique_id: "supply_enthalpy" diff --git a/templates.yaml b/templates.yaml new file mode 100644 index 0000000..f6cafcc --- /dev/null +++ b/templates.yaml @@ -0,0 +1,16 @@ +# Templates + +#- number: +# - name: current_fan_speed +# unique_id: current_fan_speed_template +# state: {{ get_frankensystem_fan_percent() }} +# set_value: +# - service: number.set_value +# target: +# entity_id: number.automower # FIX ME +# data: +# value: {{ get_frankensystem_fan_percent() }} +# step: 25 +# min: 0 +# max: 100 +# icon: mdi:fan