diff --git a/README.md b/README.md index 0ae22a1..31f3e4a 100644 --- a/README.md +++ b/README.md @@ -7,3 +7,11 @@ Notes and information about my [home-automation.io](https://www.home-automation. Unless otherwise stated the contents of this repository are licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](LICENSE.txt). ![cc-by-nc-sa](cc-by-nc-sa.png) + +# Additional Credits + +Large portions of this repo and config were adapted from the following sources. + +- [https://github.com/renemarc/home-assistant-config/](https://github.com/renemarc/home-assistant-config/) +- [https://github.com/stanvx/Home-Assistant-Configuration](https://github.com/stanvx/Home-Assistant-Configuration) +- [https://www.awesome-ha.com/](https://www.awesome-ha.com/) diff --git a/arduino/Weather_Shield_Basic/Weather_Shield_Basic.ino b/arduino/Weather_Shield_Basic/Weather_Shield_Basic.ino index 6fef8e0..4ddd1c0 100644 --- a/arduino/Weather_Shield_Basic/Weather_Shield_Basic.ino +++ b/arduino/Weather_Shield_Basic/Weather_Shield_Basic.ino @@ -1,16 +1,18 @@ /* - Weather Shield Example - By: Nathan Seidle - SparkFun Electronics - Date: June 10th, 2016 - License: This code is public domain but you buy me a beer if you use this and we meet someday (Beerware license). + Weather Shield Example + By: Nathan Seidle + SparkFun Electronics + Date: June 10th, 2016 + License: This code is public domain but you buy me a beer if you use this and we meet someday (Beerware license). - This example prints the current humidity, air pressure, temperature and light levels. + This example prints the current humidity, air pressure, temperature and light levels. - The weather shield is capable of a lot. Be sure to checkout the other more advanced examples for creating - your own weather station. + The weather shield is capable of a lot. Be sure to checkout the other more advanced examples for creating + your own weather station. - */ +*/ + +#include #include //I2C needed for sensors #include "SparkFunMPL3115A2.h" //Pressure sensor - Search "SparkFun MPL3115" and install from Library Manager @@ -35,7 +37,6 @@ long lastSecond; //The millis counter to see when a second rolls by void setup() { Serial.begin(9600); - Serial.println("Weather Shield Example"); pinMode(STAT_BLUE, OUTPUT); //Status LED Blue pinMode(STAT_GREEN, OUTPUT); //Status LED Green @@ -54,17 +55,17 @@ void setup() lastSecond = millis(); - Serial.println("Weather Shield online!"); + digitalWrite(STAT_GREEN, HIGH); //Signal online / active status } void loop() { - //Print readings every second - if (millis() - lastSecond >= 1000) + //Print readings every 10 seconds + if (millis() - lastSecond >= 10000) { digitalWrite(STAT_BLUE, HIGH); //Blink stat LED - lastSecond += 1000; + lastSecond += 10000; //Check Humidity Sensor float humidity = myHumidity.readHumidity(); @@ -74,7 +75,7 @@ void loop() Serial.println("I2C communication to sensors is not working. Check solder connections."); //Try re-initializing the I2C comm and the sensors - myPressure.begin(); + myPressure.begin(); myPressure.setModeBarometer(); myPressure.setOversampleRate(7); myPressure.enableEventFlags(); @@ -82,38 +83,36 @@ void loop() } else { - Serial.print("Humidity = "); - Serial.print(humidity); - Serial.print("%,"); + DynamicJsonDocument jsonBuffer(1024); + + jsonBuffer["humidity_percent"] = humidity; // % + float temp_h = myHumidity.readTemperature(); - Serial.print(" temp_h = "); - Serial.print(temp_h, 2); - Serial.print("C,"); + jsonBuffer["temp_c"] = temp_h; // C //Check Pressure Sensor float pressure = myPressure.readPressure(); - Serial.print(" Pressure = "); - Serial.print(pressure); - Serial.print("Pa,"); + jsonBuffer["pressure_pa"] = pressure; // Pa //Check tempf from pressure sensor float tempf = myPressure.readTempF(); - Serial.print(" temp_p = "); - Serial.print(tempf, 2); - Serial.print("F,"); + jsonBuffer["temp_f"] = tempf; // F + //Heat Index + float hi = heatIndex(tempf, humidity); + jsonBuffer["hi_f"] = hi; // F + jsonBuffer["hi_c"] = convertFtoC(hi); // C + //Check light sensor float light_lvl = get_light_level(); - Serial.print(" light_lvl = "); - Serial.print(light_lvl); - Serial.print("V,"); + jsonBuffer["light_lvl_v"] = light_lvl; // V //Check batt level float batt_lvl = get_battery_level(); - Serial.print(" VinPin = "); - Serial.print(batt_lvl); - Serial.print("V"); + jsonBuffer["batt_lvl_v"] = batt_lvl; // V + // Print json sensor data + serializeJson(jsonBuffer, Serial); Serial.println(); } @@ -156,3 +155,32 @@ float get_battery_level() return (rawVoltage); } + +float convertFtoC(float f) { + return (f - 32) * 0.55555; +} + +float heatIndex(float temperature, float percentHumidity) +{ + float hi = 0.5 * (temperature + 61.0 + ((temperature - 68.0) * 1.2) + (percentHumidity * 0.094)); + + if (hi > 79) { + hi = -42.379 + + 2.04901523 * temperature + + 10.14333127 * percentHumidity + + -0.22475541 * temperature * percentHumidity + + -0.00683783 * pow(temperature, 2) + + -0.05481717 * pow(percentHumidity, 2) + + 0.00122874 * pow(temperature, 2) * percentHumidity + + 0.00085282 * temperature * pow(percentHumidity, 2) + + -0.00000199 * pow(temperature, 2) * pow(percentHumidity, 2); + + if ((percentHumidity < 13) && (temperature >= 80.0) && (temperature <= 112.0)) + hi -= ((13.0 - percentHumidity) * 0.25) * sqrt((17.0 - abs(temperature - 95.0)) * 0.05882); + + else if ((percentHumidity > 85.0) && (temperature >= 80.0) && (temperature <= 87.0)) + hi += ((percentHumidity - 85.0) * 0.1) * ((87.0 - temperature) * 0.2); + } + + return hi; +} diff --git a/cameras/README.md b/cameras/README.md new file mode 100644 index 0000000..0eb8735 --- /dev/null +++ b/cameras/README.md @@ -0,0 +1,3 @@ +# Cameras + +Various configs for different cameras deployed on the network. diff --git a/cameras/unifi_video.yaml b/cameras/unifi_video.yaml new file mode 100644 index 0000000..baedc2a --- /dev/null +++ b/cameras/unifi_video.yaml @@ -0,0 +1,6 @@ +- platform: uvc + nvr: !secret unifi_video_nvr + port: !secret unifi_video_port + key: !secret unifi_video_api_key + password: !secret unifi_video_camera_password + ssl: true diff --git a/configuration.yaml b/configuration.yaml index 0e9e35e..c3bf0e4 100644 --- a/configuration.yaml +++ b/configuration.yaml @@ -1,228 +1,203 @@ -# Enables Default Home Assistant Components -default_config: - -# Enables Person Component -person: - -# Enables System Health -system_health: - -# Cameras -# @link https://home-assistant.io/components/camera/ -#camera: !include_dir_merge_list cameras/ - - -# Enable the configuration UI -# @link https://home-assistant.io/components/config/ -config: - - -# Counters -# @link https://www.home-assistant.io/components/counter/ -#counter: !include misc/counters.yaml - - -# Enable the UI customizer -# @link https://github.com/andrey-git/home-assistant-customizer -# customizer: -# custom_ui: local - - -# Device trackers -# @link https://home-assistant.io/components/device_tracker/ -#device_tracker: !include misc/device_trackers.yaml - - -# Discover some devices automatically -# @link https://home-assistant.io/components/discovery/ -discovery: - ignore: - - google_cast - - -# Displays -# @see /custom_components/display/ -# @link https://github.com/daemondazz/homeassistant-displays -#display: !include misc/displays.yaml - - -# Enable the official UI -# @link https://home-assistant.io/components/frontend/ -frontend: - # javascript_version: latest -# extra_html_url: -# - /local/custom_ui/state-card-custom-ui.html -# - /local/custom_ui/state-card-hline.html -# - /local/custom_ui/state-card-value_only.html -# extra_html_url_es5: -# - /local/custom_ui/state-card-custom-ui-es5.html -# - /local/custom_ui/state-card-hline.html -# - /local/custom_ui/state-card-value_only.html -# themes: !include_dir_named themes/ - - -# Combine entities into groups and organize UI -# @link https://home-assistant.io/components/group/ -#group: !include_dir_merge_named groups/ - - -# Enable support for tracking state changes over time -# @link https://home-assistant.io/components/history/ -history: - - -# Setup basic Home Assistant information -homeassistant: - name: !secret zone_home_name - latitude: !secret zone_home_latitude - longitude: !secret zone_home_longitude - elevation: !secret zone_home_elevation - unit_system: imperial # metric - time_zone: !secret homeassistant_time_zone - #customize_glob: !include customize_glob.yaml - #customize: !include customize.yaml - whitelist_external_dirs: - - !secret homeassistant_whitelist_config - - -# Enable the web server -# `cors_allowed_origins` includes the domain:port for AppDaemon. -# @link https://home-assistant.io/components/http/ -http: - api_password: !secret http_password - base_url: !secret http_base_url - - -# Input booleans -# @link https://home-assistant.io/components/input_boolean/ -#input_boolean: !include misc/input_booleans.yaml - - -# Lists of selectable values -# @link https://home-assistant.io/components/input_select/ -#input_select: !include misc/input_selects.yaml - - -# LIFX -# @link https://www.home-assistant.io/components/lifx/ -#lifx: !include misc/lifx.yaml - - - -# Lights -# @link https://home-assistant.io/components/light/ -#light: !include_dir_merge_list lights/ - - -# View all events in a logbook -# @link https://home-assistant.io/components/logbook/ -logbook: - - -# Log some details -# @link https://home-assistant.io/components/logger/ -logger: - default: warning -# logs: -# aiohttp.server: critical # EBOX newer component bug. -# custom_components.display: critical # When tablet is offline. -# custom_components.light.lightpack: critical # When Lightpack is offline. -# homeassistant.components.device_tracker.unifi: fatal # When Unifi Controller is temporarily unreachable. -# homeassistant.components.media_player.plex: fatal # When Plex is offline. -# homeassistant.components.switch.tplink: error # When switch is unplugged. -# pyunifi.controller: error # When Unifi Controller is temporarily unreachable. - - -# Media players -# @link https://home-assistant.io/components/media_player/ -#media_player: !include misc/media_players.yaml - - -# MQTT Integration -# @link https://home-assistant.io/components/mqtt/ -#mqtt: -# broker: !secret mqtt_broker -# port: !secret mqtt_port -# username: !secret mqtt_username -# password: !secret mqtt_password -# birth_message: -# topic: 'hass/status' -# payload: 'online' -# will_message: -# topic: 'hass/status' -# payload: 'offline' - - -# Notification services -# @link https://home-assistant.io/components/notify/ -#notify: !include_dir_merge_list notifications/ - - -# Database recorder -# Limit the number of tracked entities and length of history. -# @link https://home-assistant.io/components/recorder/ -#recorder: !include misc/recorder.yaml -recorder: - db_url: !secret recorder_db_url - purge_keep_days: 90 - purge_interval: 1 - - -# Scenes -# @link https://home-assistant.io/components/scene/ -#scene: !include misc/scenes.yaml - - -# Scripts -# @link https://home-assistant.io/components/script/ -#script: !include_dir_named scripts/ - - -# Sensors -# @link https://home-assistant.io/components/sensor/ -#sensor: !include_dir_merge_list sensors/ - - -# Shell commands -# @link https://home-assistant.io/components/shell_command/ -#shell_command: !include misc/shell_commands.yaml - - -# Track the sun -# @link https://home-assistant.io/components/sun/ -sun: - - -# Switches -# @link https://home-assistant.io/components/switch/ -#switch: !include_dir_merge_list switches/ - - -# Check for available updates -# Note: This component will send some information about your system to -# the developers to assist with development of Home Assistant. -# Optionally allow Home Assistant developers to focus on popular components. -# @link https://home-assistant.io/blog/2016/10/25/explaining-the-updater/ -# @link https://home-assistant.io/components/updater/ -updater: - include_used_components: true - - -# Variables -# @see /custom_components/variable.py -# @link https://github.com/rogro82/hass-variables -#variable: !include misc/variables.yaml - - -# Zones -# @link https://home-assistant.io/components/zone/ -#zone: !include misc/zones.yaml - - -# ZWave integration -# @link https://home-assistant.io/docs/z-wave/adding/ -# @link https://home-assistant.io/docs/z-wave/ -# @link https://home-assistant.io/components/zwave/ -#zwave: -# usb_path: /dev/ttyACM0 -# network_key: !secret zwave_network_key +# Setup basic Home Assistant information +homeassistant: + name: !secret zone_home_name + latitude: !secret zone_home_latitude + longitude: !secret zone_home_longitude + elevation: !secret zone_home_elevation + unit_system: imperial # metric + time_zone: !secret homeassistant_time_zone + customize_domain: {} + customize_glob: {} + whitelist_external_dirs: + - !secret homeassistant_whitelist_config + + +# Database recorder +recorder: + db_url: !secret recorder_db_url + purge_keep_days: 90 + purge_interval: 1 + + +# Log some details +logger: + default: warning + logs: + homeassistant.components.device_tracker.unifi: fatal # When Unifi Controller is temporarily unreachable. + pyunifi.controller: error # When Unifi Controller is temporarily unreachable. + + +# Check for available updates +# Note: This component will send some information about your system to +# the developers to assist with development of Home Assistant. +# Optionally allow Home Assistant developers to focus on popular components. +# https://home-assistant.io/blog/2016/10/25/explaining-the-updater/ +# https://home-assistant.io/components/updater/ +updater: + include_used_components: true + + +# MQTT Integration +# https://home-assistant.io/components/mqtt/ +#mqtt: +# broker: !secret mqtt_broker +# port: !secret mqtt_port +# username: !secret mqtt_username +# password: !secret mqtt_password +# birth_message: +# topic: 'hass/status' +# payload: 'online' +# will_message: +# topic: 'hass/status' +# payload: 'offline' + + +# ZWave integration +# https://home-assistant.io/docs/z-wave/adding/ +# https://home-assistant.io/docs/z-wave/ +# https://home-assistant.io/components/zwave/ +#zwave: +# usb_path: /dev/ttyACM0 +# network_key: !secret zwave_network_key + + +# Enable the web server +# `cors_allowed_origins` includes the domain:port for AppDaemon. +# https://home-assistant.io/components/http/ +http: + api_password: !secret http_password + base_url: !secret http_base_url + + +# Enable the official UI +# https://home-assistant.io/components/frontend/ +frontend: + # javascript_version: latest +# extra_html_url: +# - /local/custom_ui/state-card-custom-ui.html +# - /local/custom_ui/state-card-hline.html +# - /local/custom_ui/state-card-value_only.html +# extra_html_url_es5: +# - /local/custom_ui/state-card-custom-ui-es5.html +# - /local/custom_ui/state-card-hline.html +# - /local/custom_ui/state-card-value_only.html +# themes: !include_dir_named themes/ + + +# Enable the UI customizer +# https://github.com/andrey-git/home-assistant-customizer +#customizer: +# custom_ui: local + + +# Notification services +# https://home-assistant.io/components/notify/ +#notify: !include_dir_merge_list notifications/ + + +# Enables Default Home Assistant Components +default_config: + + +# Enables Person Component +person: + + +# Combine entities into groups and organize UI +# https://home-assistant.io/components/group/ +#group: !include_dir_merge_named groups/ + + +# Zones +# https://home-assistant.io/components/zone/ +#zone: !include misc/zones.yaml + + +# Variables +# @see /custom_components/variable.py +# https://github.com/rogro82/hass-variables +#variable: !include misc/variables.yaml + + +# Counters +# https://www.home-assistant.io/components/counter/ +#counter: !include misc/counters.yaml + + +# Input booleans +# https://home-assistant.io/components/input_boolean/ +#input_boolean: !include misc/input_booleans.yaml + + +# Lists of selectable values +# https://home-assistant.io/components/input_select/ +#input_select: !include misc/input_selects.yaml + + +# Enables System Health +system_health: + + +# Enable the configuration UI +config: + + +# Enable support for tracking state changes over time +history: + + +# View all events in a logbook +logbook: + exclude: + entities: + - sensor.uptime + - sensor.time + - sensor.date + - sensor.date_time + - sensor.date_time_iso + - sensor.time_date + - sensor.time_utc + - sensor.beat + - sensor.pcf8523 + + +# Scenes +# https://home-assistant.io/components/scene/ +#scene: !include misc/scenes.yaml + + +# Discover some devices automatically +discovery: + ignore: + - google_cast + - harmony + + +# Device Trackers +device_tracker: !include_dir_merge_list device_trackers/ + + +# Cameras +camera: !include_dir_merge_list cameras/ + + +# Displays +# @see /custom_components/display/ +# https://github.com/daemondazz/homeassistant-displays +#display: !include misc/displays.yaml + + +# Sensors +sensor: !include_dir_merge_list sensors/ + +# Track the sun +sun: + + +# Cameras +# https://home-assistant.io/components/camera/ +#camera: !include_dir_merge_list cameras/ + + +# Media Devices +cast: !include media/cast.yaml diff --git a/device_trackers/README.md b/device_trackers/README.md new file mode 100644 index 0000000..efadcbd --- /dev/null +++ b/device_trackers/README.md @@ -0,0 +1,3 @@ +# Device Trackers + +Various configs for tracking devices. diff --git a/device_trackers/unifi.yaml b/device_trackers/unifi.yaml new file mode 100644 index 0000000..0059f3c --- /dev/null +++ b/device_trackers/unifi.yaml @@ -0,0 +1,25 @@ +- platform: unifi + host: !secret unifi_host + port: !secret unifi_port + username: !secret unifi_username + password: !secret unifi_password + ssid_filter: + !secret unifi_ssids + monitored_conditions: + - _id + - assoc_time + - authorized + - bssid + - channel + - essid + - first_seen + - hostname + - ip + - last_seen + - latest_assoc_time + - mac + - name + - signal + - site_id + - user_id + - usergroup_id diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000..a03f9f3 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,3 @@ +# Docker + +Various run scripts for deploying Home-Automation.io on arm boards. Raspberry Pi and others are supported. diff --git a/docker/run-home-assistant.sh b/docker/run-home-assistant.sh index 97e1a82..0cebf40 100755 --- a/docker/run-home-assistant.sh +++ b/docker/run-home-assistant.sh @@ -4,6 +4,10 @@ # create role homeautomation nosuperuser nocreatedb nocreaterole password 'badPassword'; # create database homeautomation owner homeautomation; +# --device /dev/ttyACM0:/dev/ttyACM0 +# --device /dev/rtc1:/dev/rtc1 +# -v /sys/class:/sys/class + ARCH=`arch` if [ $ARCH == "aarch64" ] then @@ -12,16 +16,20 @@ else REPO="homeassistant/raspberrypi3-homeassistant" fi +touch /var/home-assistant/known_devices.yaml + docker container stop home-assistant docker container rm home-assistant docker run -it --name home-assistant \ --restart unless-stopped \ --network docker-private \ + --device /dev/ttyACM0:/dev/ttyACM0 \ -e DEBUG=1 \ -l traefik.frontend.rule=Host:home-automation.domain.tld \ -l traefik.frontend.passHostHeader=true \ -l traefik.port=8123 \ + -v /sys/class:/sys/class \ -v /etc/localtime:/etc/localtime:ro \ -v /var/home-assistant:/config \ ${REPO}:latest diff --git a/docs/shower_thoughts.md b/docs/shower_thoughts.md index 14f7932..ba91ced 100644 --- a/docs/shower_thoughts.md +++ b/docs/shower_thoughts.md @@ -1,18 +1,9 @@ ## Home-Automation.io -- https://www.home-assistant.io/components/recorder/ - - -- https://www.home-assistant.io/ -- https://www.home-assistant.io/docs/installation/docker/ -- https://www.home-assistant.io/docs/ecosystem/backup/backup_usb/ - https://www.home-assistant.io/docs/z-wave/ - https://www.home-assistant.io/docs/z-wave/installation - https://www.home-assistant.io/docs/z-wave/adding -- https://community.home-assistant.io/t/real-time-clock/91699 -- https://www.home-assistant.io/components/time_date/ -- https://www.home-assistant.io/components/worldclock/ - https://www.home-assistant.io/components/timer/ - https://www.home-assistant.io/components/persistent_notification/ - https://community.home-assistant.io/t/medication-reminder/18110 @@ -20,53 +11,20 @@ - https://github.com/pkozul/ha-floorplan - https://github.com/thomasloven/hass-fontawesome - https://www.home-assistant.io/components/caldav/ -- https://www.home-assistant.io/components/weather.darksky/ -- https://www.home-assistant.io/components/cloudflare/ -- https://www.home-assistant.io/components/command_line/ -- https://www.home-assistant.io/components/darksky/ +- http://davmail.sourceforge.net/ - https://www.home-assistant.io/components/generic/ - https://www.home-assistant.io/components/input_datetime/ - https://www.home-assistant.io/components/input_boolean/ - https://www.home-assistant.io/components/input_select/ -- https://www.home-assistant.io/components/linux_battery/ -- https://www.home-assistant.io/components/logbook/ - https://www.home-assistant.io/components/matrix/ - https://www.home-assistant.io/components/miflora/ -- https://www.home-assistant.io/components/nfandroidtv/ - https://www.home-assistant.io/components/plant/ -- https://www.home-assistant.io/components/pollen/ - https://www.home-assistant.io/components/smtp/ -- https://www.home-assistant.io/components/uvc/ -- https://www.home-assistant.io/components/unifi/ - https://www.home-assistant.io/components/ups/ - https://www.home-assistant.io/components/fedex/ - https://www.home-assistant.io/components/usps/ -### Samples -- https://github.com/renemarc/home-assistant-config/ -- https://github.com/stanvx/Home-Assistant-Configuration -- https://www.awesome-ha.com/ - -## Simple Sensor Array - -- https://learn.sparkfun.com/tutorials/arduino-weather-shield-hookup-guide-v12 -- http://pinoutguide.com/images/arduino/micro.png -- https://strawberry-linux.com/pub/Weather%20Shield.pdf -- https://cdn.sparkfun.com/assets/1/1/4/d/6/Weather_Shield_V12.pdf -- https://www.arduino.cc/en/main/software#download -- https://marketplace.visualstudio.com/items?itemName=vsciot-vscode.vscode-arduino -- https://github.com/sparkfun/Weather_Shield - - -https://www.home-assistant.io/components/serial/ -Humidity = 45.52%, temp_h = 22.58C, Pressure = 99065.00Pa, temp_p = 71.37F, light_lvl = 4.20V, VinPin = 0.00V - - -## Networked Devices - -- https://www.home-assistant.io/components/harmony/ -- https://www.home-assistant.io/components/cast/ ## Setup Kiosk For HASS diff --git a/secrets-example.yaml b/secrets-example.yaml index 5431add..b7bcc46 100644 --- a/secrets-example.yaml +++ b/secrets-example.yaml @@ -1,16 +1,37 @@ -# # Home Assistant basic info -# zone_home_name: "Some Name" zone_home_latitude: 0.0 zone_home_longitude: 0.0 zone_home_elevation: 0.0 +zip_code: "00544" homeassistant_time_zone: America/Eastern homeassistant_whitelist_config: ./ http_base_url: "" http_password: "" -# # Database Setup -# recorder_db_url: "postgresql://user:password@SERVER_IP/DB_NAME" + +# API Keys +dark_sky_api_key: YOUR_API_KEY_HERE + +# Media Devices +google_casts: + - host: 172.16.0.1 + - host: 10.0.0.1 + - host: 192.168.0.1 + +# UniFi Config +unifi_host: unifi.domain.tld +unifi_port: 8443 +unifi_username: username +unifi_password: password +unifi_ssids: + - ssid_1 + - ssid_2 + +# UniFi Video Config +unifi_video_nvr: unifivideo.domain.tld +unifi_video_port: 7080 +unifi_video_api_key: API_KEY +unifi_video_camera_password: ubnt diff --git a/sensors/README.md b/sensors/README.md new file mode 100644 index 0000000..7a5030c --- /dev/null +++ b/sensors/README.md @@ -0,0 +1,3 @@ +# Sensors + +Various sensor configurations. Each of the ```yaml``` files is a *different* sensor. diff --git a/sensors/pollen.yaml b/sensors/pollen.yaml new file mode 100644 index 0000000..1c9f633 --- /dev/null +++ b/sensors/pollen.yaml @@ -0,0 +1,14 @@ +- platform: pollen + zip_code: !secret zip_code + monitored_conditions: + - allergy_average_forecasted + - allergy_average_historical + - allergy_index_today + - allergy_index_tomorrow + - allergy_index_yesterday + - asthma_average_forecasted + - asthma_average_historical + - asthma_index_today + - asthma_index_tomorrow + - asthma_index_yesterday + - disease_average_forecasted \ No newline at end of file diff --git a/sensors/rtc1.yaml b/sensors/rtc1.yaml new file mode 100644 index 0000000..2610352 --- /dev/null +++ b/sensors/rtc1.yaml @@ -0,0 +1,4 @@ +- platform: command_line + name: "pcf8523" + command: 'hwclock -r -f /dev/rtc1' + scan_interval: 3600 diff --git a/sensors/scripts/README.md b/sensors/scripts/README.md new file mode 100644 index 0000000..b0ce2ba --- /dev/null +++ b/sensors/scripts/README.md @@ -0,0 +1,3 @@ +# Sensor Scripts + +A collection of scripts for building more robust command line sensors to fill in gaps in the upstream components. diff --git a/sensors/scripts/ac_sopine.py b/sensors/scripts/ac_sopine.py new file mode 100755 index 0000000..39f307b --- /dev/null +++ b/sensors/scripts/ac_sopine.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 + +from distutils.util import strtobool + +PATH_PRESENT = '/sys/class/power_supply/axp813-ac/present' +PATH_ONLINE = '/sys/class/power_supply/axp813-ac/online' +PATH_TYPE = '/sys/class/power_supply/axp813-ac/type' +PATH_HEALTH = '/sys/class/power_supply/axp813-ac/health' +PATH_INPUT_CURRENT_LIMIT = '/sys/class/power_supply/axp813-ac/input_current_limit' +PATH_VOLTAGE_MIN = '/sys/class/power_supply/axp813-ac/voltage_min' + +present = False +with open(PATH_PRESENT, 'r') as f: + present = bool(strtobool(f.read().strip())) + +online = False +with open(PATH_ONLINE, 'r') as f: + online = bool(strtobool(f.read().strip())) + +result = {'present': present, 'online': online} + +if present: + with open(PATH_TYPE, 'r') as f: + result['type'] = f.read().strip() + with open(PATH_HEALTH,'r') as f: + result['health'] = f.read().strip() + with open(PATH_INPUT_CURRENT_LIMIT, 'r') as f: + current = f.read().strip() + result['current'] = (int(current)/10000.0)*0.01 + with open(PATH_VOLTAGE_MIN, 'r') as f: + voltage = f.read().strip() + result['voltage'] = (int(voltage)/10000.0)*0.01 + +import json +print(json.dumps(result)) diff --git a/sensors/scripts/battery_sopine.py b/sensors/scripts/battery_sopine.py new file mode 100755 index 0000000..2d9f4d9 --- /dev/null +++ b/sensors/scripts/battery_sopine.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 + +from distutils.util import strtobool + +PATH_PRESENT = '/sys/class/power_supply/axp20x-battery/present' +PATH_STATUS = '/sys/class/power_supply/axp20x-battery/status' +PATH_VOLTAGE = '/sys/class/power_supply/axp20x-battery/voltage_now' +PATH_CURRENT = '/sys/class/power_supply/axp20x-battery/current_now' +PATH_CAPACITY = '/sys/class/power_supply/axp20x-battery/capacity' +PATH_HEALTH = '/sys/class/power_supply/axp20x-battery/health' + +present = False +with open(PATH_PRESENT, 'r') as f: + present = bool(strtobool(f.read().strip())) + +result = {'present': present} + +if present: + with open(PATH_STATUS,'r') as f: + result['status'] = f.read().strip() + with open(PATH_VOLTAGE, 'r') as f: + voltage = f.read().strip() + result['voltage'] = (int(voltage)/10000.0)*0.01 + with open(PATH_CURRENT, 'r') as f: + current = f.read().strip() + result['current'] = int(current)/1000 + with open(PATH_CAPACITY, 'r') as f: + result['capacity'] = f.read().strip() + with open(PATH_HEALTH, 'r') as f: + result['health'] = f.read().strip() + +import json +print(json.dumps(result)) diff --git a/sensors/sopine-ac.yaml b/sensors/sopine-ac.yaml new file mode 100644 index 0000000..6a7bf69 --- /dev/null +++ b/sensors/sopine-ac.yaml @@ -0,0 +1,32 @@ +- platform: command_line + name: "sopine_ac" + command: '/config/sensors/scripts/ac_sopine.py' + json_attributes: + - present + - voltage + - online + - health + - type + - current + +- platform: template + sensors: + sopine_ac_present: + entity_id: "sensor.sopine_ac" + value_template: "{{ state_attr('sensor.sopine_ac', 'present') }}" + sopine_ac_voltage: + entity_id: "sensor.sopine_ac" + value_template: "{{ state_attr('sensor.sopine_ac', 'voltage') }}" + sopine_ac_online: + entity_id: "sensor.sopine_ac" + value_template: "{{ state_attr('sensor.sopine_ac', 'online') }}" + sopine_ac_health: + entity_id: "sensor.sopine_ac" + value_template: "{{ state_attr('sensor.sopine_ac', 'health') }}" + sopine_ac_type: + entity_id: "sensor.sopine_ac" + value_template: "{{ state_attr('sensor.sopine_ac', 'type') }}" + sopine_ac_current: + entity_id: "sensor.sopine_ac" + value_template: "{{ state_attr('sensor.sopine_ac', 'current') }}" + diff --git a/sensors/sopine-battery.yaml b/sensors/sopine-battery.yaml new file mode 100644 index 0000000..dded910 --- /dev/null +++ b/sensors/sopine-battery.yaml @@ -0,0 +1,34 @@ +- platform: command_line + name: "sopine_battery" + command: '/config/sensors/scripts/battery_sopine.py' + json_attributes: + - status + - voltage + - capacity + - present + - current + - health + +- platform: template + sensors: + sopine_battery_status: + entity_id: "sensor.sopine_battery" + value_template: "{{ state_attr('sensor.sopine_battery', 'status') }}" + sopine_battery_voltage: + entity_id: "sensor.sopine_battery" + value_template: "{{ state_attr('sensor.sopine_battery', 'voltage') }}" + unit_of_measurement: "V" + sopine_battery_capacity: + entity_id: "sensor.sopine_battery" + value_template: "{{ state_attr('sensor.sopine_battery', 'capacity') }}" + unit_of_measurement: "%" + sopine_battery_present: + entity_id: "sensor.sopine_battery" + value_template: "{{ state_attr('sensor.sopine_battery', 'present') }}" + sopine_battery_current: + entity_id: "sensor.sopine_battery" + value_template: "{{ state_attr('sensor.sopine_battery', 'current') }}" + unit_of_measurement: "A" + sopine_battery_health: + entity_id: "sensor.sopine_battery" + value_template: "{{ state_attr('sensor.sopine_battery', 'health') }}" diff --git a/sensors/spark_fun_weather_station.yaml b/sensors/spark_fun_weather_station.yaml new file mode 100644 index 0000000..3777096 --- /dev/null +++ b/sensors/spark_fun_weather_station.yaml @@ -0,0 +1,49 @@ +# { +# "humidity_percent":45.0025, +# "temp_c":23.00256, +# "pressure_pa":98949.5, +# "temp_f":72.1625, +# "hi_f":71.19387, +# "hi_c":21.77415, +# "light_lvl_v":0.106452, +# "batt_lvl_v":0 +#} + +- platform: serial + serial_port: /dev/ttyACM0 + name: sparkfun_weather_station + +- platform: template + sensors: + sparkfun_weather_station_humidity_percent: + entity_id: "sensor.sparkfun_weather_station" + value_template: "{{ state_attr('sensor.sparkfun_weather_station', 'humidity_percent') }}" + unit_of_measurement: "%" + sparkfun_weather_station_temp_c: + entity_id: "sensor.sparkfun_weather_station" + value_template: "{{ state_attr('sensor.sparkfun_weather_station', 'temp_c') }}" + unit_of_measurement: "C" + sparkfun_weather_station_pressure_pa: + entity_id: "sensor.sparkfun_weather_station" + value_template: "{{ state_attr('sensor.sparkfun_weather_station', 'pressure_pa') }}" + unit_of_measurement: "Pa" + sparkfun_weather_station_temp_f: + entity_id: "sensor.sparkfun_weather_station" + value_template: "{{ state_attr('sensor.sparkfun_weather_station', 'temp_f') }}" + unit_of_measurement: "F" + sparkfun_weather_station_hi_f: + entity_id: "sensor.sparkfun_weather_station" + value_template: "{{ state_attr('sensor.sparkfun_weather_station', 'hi_f') }}" + unit_of_measurement: "F" + sparkfun_weather_station_hi_c: + entity_id: "sensor.sparkfun_weather_station" + value_template: "{{ state_attr('sensor.sparkfun_weather_station', 'hi_c') }}" + unit_of_measurement: "C" + sparkfun_weather_station_light_lvl_v: + entity_id: "sensor.sparkfun_weather_station" + value_template: "{{ state_attr('sensor.sparkfun_weather_station', 'light_lvl_v') }}" + unit_of_measurement: "V" + sparkfun_weather_station_batt_lvl_v: + entity_id: "sensor.sparkfun_weather_station" + value_template: "{{ state_attr('sensor.sparkfun_weather_station', 'batt_lvl_v') }}" + unit_of_measurement: "V" diff --git a/sensors/time.yaml b/sensors/time.yaml new file mode 100644 index 0000000..a0a0ce6 --- /dev/null +++ b/sensors/time.yaml @@ -0,0 +1,9 @@ +# Track various times +- platform: time_date + display_options: + - 'time' + - 'date' + - 'date_time' + - 'date_time_iso' + - 'time_date' + - 'time_utc' diff --git a/sensors/weather.yaml b/sensors/weather.yaml new file mode 100644 index 0000000..436a588 --- /dev/null +++ b/sensors/weather.yaml @@ -0,0 +1,45 @@ +- platform: darksky + api_key: !secret dark_sky_api_key + forecast: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + hourly_forecast: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + - 10 + - 11 + - 12 + monitored_conditions: + - summary + - icon + - temperature + - apparent_temperature + - temperature_high + - temperature_low + - humidity + - precip_type + - precip_intensity + - precip_probability + - precip_accumulation + - wind_speed + - wind_gust + - daily_summary + scan_interval: + # At least one of these must be specified: + days: 0 + hours: 0 + minutes: 30 + seconds: 0 + milliseconds: 0