diff --git a/README.md b/README.md index 62870581..74cc355c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Build Status](https://github.com/aneisch/home-assistant-config/actions/workflows/check-ha-release-compatibility.yml/badge.svg)](https://github.com/aneisch/home-assistant-config/actions) [![GitHub last commit](https://img.shields.io/github/last-commit/aneisch/home-assistant-config)](https://github.com/aneisch/home-assistant-config/commits/master) [![GitHub commit activity](https://img.shields.io/github/commit-activity/y/aneisch/home-assistant-config)](https://github.com/aneisch/home-assistant-config/graphs/commit-activity) -[![HA Version](https://img.shields.io/badge/Running%20Home%20Assistant-2024.5.2%20(Latest)-brightgreen)](https://github.com/home-assistant/home-assistant/releases/latest) +[![HA Version](https://img.shields.io/badge/Running%20Home%20Assistant-2024.5.5%20(Latest)-brightgreen)](https://github.com/home-assistant/home-assistant/releases/latest)
Buy Me A Coffee @@ -57,7 +57,7 @@ Also using Grafana/Influx for graphing, both running in Docker containers on NUC Description | value -- | -- Lines of ESPHome YAML | 2802 -Lines of Home Assistant YAML | 9088 +Lines of Home Assistant YAML | 9169 [Integrations](https://www.home-assistant.io/integrations/) in use | 60 Zigbee devices in [`zha`](https://www.home-assistant.io/integrations/zha/) | 26 Z-Wave devices in [`zwave_js`](https://www.home-assistant.io/integrations/zwave_js/) | 37 @@ -71,10 +71,10 @@ Entities in the [`camera`](https://www.home-assistant.io/components/camera) doma Entities in the [`climate`](https://www.home-assistant.io/components/climate) domain | 1 Entities in the [`conversation`](https://www.home-assistant.io/components/conversation) domain | 1 Entities in the [`counter`](https://www.home-assistant.io/components/counter) domain | 1 -Entities in the [`cover`](https://www.home-assistant.io/components/cover) domain | 13 +Entities in the [`cover`](https://www.home-assistant.io/components/cover) domain | 16 Entities in the [`device_tracker`](https://www.home-assistant.io/components/device_tracker) domain | 4 Entities in the [`fan`](https://www.home-assistant.io/components/fan) domain | 3 -Entities in the [`group`](https://www.home-assistant.io/components/group) domain | 17 +Entities in the [`group`](https://www.home-assistant.io/components/group) domain | 18 Entities in the [`image`](https://www.home-assistant.io/components/image) domain | 7 Entities in the [`input_boolean`](https://www.home-assistant.io/components/input_boolean) domain | 29 Entities in the [`input_datetime`](https://www.home-assistant.io/components/input_datetime) domain | 38 @@ -90,17 +90,17 @@ Entities in the [`plant`](https://www.home-assistant.io/components/plant) domain Entities in the [`remote`](https://www.home-assistant.io/components/remote) domain | 1 Entities in the [`script`](https://www.home-assistant.io/components/script) domain | 48 Entities in the [`select`](https://www.home-assistant.io/components/select) domain | 3 -Entities in the [`sensor`](https://www.home-assistant.io/components/sensor) domain | 420 +Entities in the [`sensor`](https://www.home-assistant.io/components/sensor) domain | 424 Entities in the [`siren`](https://www.home-assistant.io/components/siren) domain | 1 Entities in the [`sun`](https://www.home-assistant.io/components/sun) domain | 1 Entities in the [`switch`](https://www.home-assistant.io/components/switch) domain | 167 Entities in the [`timer`](https://www.home-assistant.io/components/timer) domain | 6 Entities in the [`tts`](https://www.home-assistant.io/components/tts) domain | 1 -Entities in the [`update`](https://www.home-assistant.io/components/update) domain | 34 +Entities in the [`update`](https://www.home-assistant.io/components/update) domain | 32 Entities in the [`vacuum`](https://www.home-assistant.io/components/vacuum) domain | 1 Entities in the [`weather`](https://www.home-assistant.io/components/weather) domain | 1 Entities in the [`zone`](https://www.home-assistant.io/components/zone) domain | 6 -**Total state objects** | **1202** +**Total state objects** | **1208** ## The HACS integrations/plugins that I use: **Appdaemon**:
[aneisch/follow_me_appdaemon](https://github.com/aneisch/follow_me_appdaemon)
diff --git a/automations.yaml b/automations.yaml index bbf34900..2e5fba29 100644 --- a/automations.yaml +++ b/automations.yaml @@ -120,7 +120,7 @@ initial_state: true trigger: - platform: state - entity_id: sensor.thermostat_latest_equipment_event + entity_id: sensor.thermostat_active_equipment_event condition: '{{ trigger.to_state.state not in [ ''unavailable'', '''' ] and trigger.from_state.state not in [ ''unavailable'', '''' ] }}' action: @@ -199,7 +199,7 @@ - lock.garage_exterior_door - lock.back_door to: unlocked - condition: '{{ states(''input_boolean.security_status'') == ''on''}}' + condition: '{{ states(''input_boolean.door_notify'') == ''on''}}' action: - service: script.notify_wrapper data: @@ -473,6 +473,8 @@ - sensor.office_blind_right_battery - sensor.guest_bedroom_blind_left_battery - sensor.guest_bedroom_blind_right_battery + - sensor.master_bedroom_blind_left_battery + - sensor.master_bedroom_blind_right_battery - sensor.dining_room_blind_left_battery - sensor.dining_room_blind_center_battery - sensor.dining_room_blind_right_battery diff --git a/custom_components/monitor_docker/__init__.py b/custom_components/monitor_docker/__init__.py index b90eb479..348d116a 100644 --- a/custom_components/monitor_docker/__init__.py +++ b/custom_components/monitor_docker/__init__.py @@ -2,22 +2,19 @@ import asyncio import logging -import time -import threading -import voluptuous as vol - from datetime import timedelta import homeassistant.helpers.config_validation as cv - -from .helpers import DockerAPI - +import voluptuous as vol from homeassistant.const import ( CONF_MONITORED_CONDITIONS, CONF_NAME, CONF_SCAN_INTERVAL, CONF_URL, ) +from homeassistant.core import HomeAssistant +from homeassistant.helpers.typing import ConfigType +from homeassistant.helpers.reload import async_setup_reload_service from .const import ( API, @@ -32,20 +29,22 @@ CONF_PRECISION_NETWORK_MB, CONF_PREFIX, CONF_RENAME, + CONF_RENAME_ENITITY, CONF_RETRY, CONF_SENSORNAME, CONF_SWITCHENABLED, CONF_SWITCHNAME, CONFIG, CONTAINER_INFO_ALLINONE, - DOMAIN, DEFAULT_NAME, DEFAULT_RETRY, DEFAULT_SENSORNAME, DEFAULT_SWITCHNAME, + DOMAIN, MONITORED_CONDITIONS_LIST, PRECISION, ) +from .helpers import DockerAPI _LOGGER = logging.getLogger(__name__) @@ -57,17 +56,18 @@ vol.Optional(CONF_PREFIX, default=""): cv.string, vol.Optional(CONF_URL, default=None): vol.Any(cv.string, None), vol.Optional(CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL): cv.time_period, - vol.Optional( - CONF_MONITORED_CONDITIONS, default=MONITORED_CONDITIONS_LIST - ): vol.All( + vol.Optional(CONF_MONITORED_CONDITIONS, default=[]): vol.All( cv.ensure_list, - [vol.In(MONITORED_CONDITIONS_LIST + list([CONTAINER_INFO_ALLINONE]))], + [vol.In(MONITORED_CONDITIONS_LIST)], ), vol.Optional(CONF_CONTAINERS, default=[]): cv.ensure_list, vol.Optional(CONF_CONTAINERS_EXCLUDE, default=[]): cv.ensure_list, vol.Optional(CONF_RENAME, default={}): dict, + vol.Optional(CONF_RENAME_ENITITY, default=False): cv.boolean, vol.Optional(CONF_SENSORNAME, default=DEFAULT_SENSORNAME): cv.string, - vol.Optional(CONF_SWITCHENABLED, default=True): cv.boolean, + vol.Optional(CONF_SWITCHENABLED, default=True): vol.Any( + cv.boolean, cv.ensure_list(cv.string) + ), vol.Optional(CONF_SWITCHNAME, default=DEFAULT_SWITCHNAME): cv.string, vol.Optional(CONF_CERTPATH, default=""): cv.string, vol.Optional(CONF_RETRY, default=DEFAULT_RETRY): cv.positive_int, @@ -88,17 +88,12 @@ ################################################################# -async def async_setup(hass, config): +async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Will setup the Monitor Docker platform.""" - def RunDocker(hass, entry): + async def RunDocker(hass: HomeAssistant, entry: ConfigType) -> None: """Wrapper around function for a separated thread.""" - # Create out asyncio loop, because we are already inside - # a def (not main) we need to do create/set - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - # Create docker instance, it will have asyncio threads hass.data[DOMAIN][entry[CONF_NAME]] = {} hass.data[DOMAIN][entry[CONF_NAME]][CONFIG] = entry @@ -109,9 +104,8 @@ def RunDocker(hass, entry): doLoop = True try: - hass.data[DOMAIN][entry[CONF_NAME]][API] = DockerAPI( - hass, entry, startCount - ) + hass.data[DOMAIN][entry[CONF_NAME]][API] = DockerAPI(hass, entry) + await hass.data[DOMAIN][entry[CONF_NAME]][API].init(startCount) except Exception as err: doLoop = False if entry[CONF_RETRY] == 0: @@ -119,24 +113,35 @@ def RunDocker(hass, entry): else: _LOGGER.error("Failed Docker connect: %s", str(err)) _LOGGER.error("Retry in %d seconds", entry[CONF_RETRY]) - time.sleep(entry[CONF_RETRY]) + await asyncio.sleep(entry[CONF_RETRY]) startCount += 1 if doLoop: # Now run forever in this separated thread - loop.run_forever() + # loop.run_forever() # We only get here if a docker instance disconnected or HASS is stopping if not hass.data[DOMAIN][entry[CONF_NAME]][API]._dockerStopped: # If HASS stopped, do not retry break + # Setup reload service + # await async_setup_reload_service(hass, DOMAIN, [DOMAIN]) + # Create domain monitor_docker data variable hass.data[DOMAIN] = {} # Now go through all possible entries, we support 1 or more docker hosts (untested) for entry in config[DOMAIN]: + + # Default MONITORED_CONDITIONS_LIST also contains allinone, so we need to fix it up here + if len(entry[CONF_MONITORED_CONDITIONS]) == 0: + # Add whole list, including allinone. Make a copy, no reference + entry[CONF_MONITORED_CONDITIONS] = MONITORED_CONDITIONS_LIST.copy() + # remove the allinone + entry[CONF_MONITORED_CONDITIONS].remove(CONTAINER_INFO_ALLINONE) + # Check if CONF_MONITORED_CONDITIONS has only ALLINONE, then expand to all if ( len(entry[CONF_MONITORED_CONDITIONS]) == 1 @@ -154,9 +159,13 @@ def RunDocker(hass, entry): return False # Each docker hosts runs in its own thread. We need to pass hass too, for the load_platform - thread = threading.Thread( - target=RunDocker, kwargs={"hass": hass, "entry": entry} - ) - thread.start() + asyncio.create_task(RunDocker(hass, entry)) return True + + +################################################################# +async def async_reset_platform(hass: HomeAssistant, integration_name: str) -> None: + """Reload the integration.""" + if DOMAIN not in hass.data: + _LOGGER.error("monitor_docker not loaded") diff --git a/custom_components/monitor_docker/const.py b/custom_components/monitor_docker/const.py index 6831decc..29ad21f5 100644 --- a/custom_components/monitor_docker/const.py +++ b/custom_components/monitor_docker/const.py @@ -1,5 +1,12 @@ """Define constants for the Monitor Docker component.""" +from homeassistant.components.sensor import ( + SensorDeviceClass, + SensorEntityDescription, + SensorStateClass, +) +from homeassistant.const import PERCENTAGE, UnitOfDataRate, UnitOfInformation + DOMAIN = "monitor_docker" API = "api" CONFIG = "config" @@ -16,6 +23,7 @@ CONF_PRECISION_NETWORK_MB = "precision_network_mb" CONF_PREFIX = "prefix" CONF_RENAME = "rename" +CONF_RENAME_ENITITY = "rename_entity" CONF_RETRY = "retry" CONF_SENSORNAME = "sensorname" CONF_SWITCHENABLED = "switchenabled" @@ -60,42 +68,155 @@ CONTAINER_STATS_NETWORK_TOTAL_DOWN = "network_total_down" DOCKER_MONITOR_LIST = { - DOCKER_INFO_VERSION: ["Version", None, "mdi:information-outline", None], - DOCKER_INFO_CONTAINER_RUNNING: ["Containers Running", None, "mdi:docker", None], - DOCKER_INFO_CONTAINER_PAUSED: ["Containers Paused", None, "mdi:docker", None], - DOCKER_INFO_CONTAINER_STOPPED: ["Containers Stopped", None, "mdi:docker", None], - DOCKER_INFO_CONTAINER_TOTAL: ["Containers Total", None, "mdi:docker", None], - DOCKER_STATS_CPU_PERCENTAGE: ["CPU", "%", "mdi:chip", None], - DOCKER_STATS_1CPU_PERCENTAGE: ["1CPU", "%", "mdi:chip", None], - DOCKER_STATS_MEMORY: ["Memory", "MB", "mdi:memory", None], - DOCKER_STATS_MEMORY_PERCENTAGE: ["Memory (percent)", "%", "mdi:memory", None], - DOCKER_INFO_IMAGES: ["Images", None, "mdi:docker", None], + DOCKER_INFO_VERSION: SensorEntityDescription( + key=DOCKER_INFO_VERSION, + name="Version", + icon="mdi:information-outline", + ), + DOCKER_INFO_CONTAINER_RUNNING: SensorEntityDescription( + key=DOCKER_INFO_CONTAINER_RUNNING, + name="Containers Running", + icon="mdi:docker", + ), + DOCKER_INFO_CONTAINER_PAUSED: SensorEntityDescription( + key=DOCKER_INFO_CONTAINER_PAUSED, + name="Containers Paused", + icon="mdi:docker", + ), + DOCKER_INFO_CONTAINER_STOPPED: SensorEntityDescription( + key=DOCKER_INFO_CONTAINER_STOPPED, + name="Containers Stopped", + icon="mdi:docker", + ), + DOCKER_INFO_CONTAINER_TOTAL: SensorEntityDescription( + key=DOCKER_INFO_CONTAINER_TOTAL, + name="Containers Total", + icon="mdi:docker", + ), + DOCKER_STATS_CPU_PERCENTAGE: SensorEntityDescription( + key=DOCKER_STATS_CPU_PERCENTAGE, + name="CPU", + native_unit_of_measurement=PERCENTAGE, + icon="mdi:chip", + state_class=SensorStateClass.MEASUREMENT, + ), + DOCKER_STATS_1CPU_PERCENTAGE: SensorEntityDescription( + key=DOCKER_STATS_1CPU_PERCENTAGE, + name="1CPU", + native_unit_of_measurement=PERCENTAGE, + icon="mdi:chip", + state_class=SensorStateClass.MEASUREMENT, + ), + DOCKER_STATS_MEMORY: SensorEntityDescription( + key=DOCKER_STATS_MEMORY, + name="Memory", + native_unit_of_measurement=UnitOfInformation.MEBIBYTES, + icon="mdi:memory", + device_class=SensorDeviceClass.DATA_SIZE, + state_class=SensorStateClass.MEASUREMENT, + ), + DOCKER_STATS_MEMORY_PERCENTAGE: SensorEntityDescription( + key=DOCKER_STATS_MEMORY_PERCENTAGE, + name="Memory (percent)", + native_unit_of_measurement=PERCENTAGE, + icon="mdi:memory", + state_class=SensorStateClass.MEASUREMENT, + ), + DOCKER_INFO_IMAGES: SensorEntityDescription( + key=DOCKER_INFO_IMAGES, + name="Images", + icon="mdi:docker", + ), } CONTAINER_MONITOR_LIST = { - CONTAINER_INFO_STATE: ["State", None, "mdi:checkbox-marked-circle-outline", None], - CONTAINER_INFO_HEALTH: ["Health", None, "mdi:heart-pulse", None], - CONTAINER_INFO_STATUS: ["Status", None, "mdi:checkbox-marked-circle-outline", None], - CONTAINER_INFO_UPTIME: ["Up Time", "", "mdi:clock", "timestamp"], - CONTAINER_INFO_IMAGE: ["Image", None, "mdi:information-outline", None], - CONTAINER_STATS_CPU_PERCENTAGE: ["CPU", "%", "mdi:chip", None], - CONTAINER_STATS_1CPU_PERCENTAGE: ["1CPU", "%", "mdi:chip", None], - CONTAINER_STATS_MEMORY: ["Memory", "MB", "mdi:memory", None], - CONTAINER_STATS_MEMORY_PERCENTAGE: ["Memory (percent)", "%", "mdi:memory", None], - CONTAINER_STATS_NETWORK_SPEED_UP: ["Network speed Up", "kB/s", "mdi:upload", None], - CONTAINER_STATS_NETWORK_SPEED_DOWN: [ - "Network speed Down", - "kB/s", - "mdi:download", - None, - ], - CONTAINER_STATS_NETWORK_TOTAL_UP: ["Network total Up", "MB", "mdi:upload", None], - CONTAINER_STATS_NETWORK_TOTAL_DOWN: [ - "Network total Down", - "MB", - "mdi:download", - None, - ], + CONTAINER_INFO_STATE: SensorEntityDescription( + key=CONTAINER_INFO_STATE, + name="State", + icon="mdi:checkbox-marked-circle-outline", + ), + CONTAINER_INFO_HEALTH: SensorEntityDescription( + key=CONTAINER_INFO_HEALTH, + name="Health", + icon="mdi:heart-pulse", + ), + CONTAINER_INFO_STATUS: SensorEntityDescription( + key=CONTAINER_INFO_STATUS, + name="Status", + icon="mdi:checkbox-marked-circle-outline", + ), + CONTAINER_INFO_UPTIME: SensorEntityDescription( + key=CONTAINER_INFO_UPTIME, + name="Up Time", + icon="mdi:clock", + device_class=SensorDeviceClass.TIMESTAMP, + ), + CONTAINER_INFO_IMAGE: SensorEntityDescription( + key=CONTAINER_INFO_IMAGE, + name="Image", + icon="mdi:information-outline", + ), + CONTAINER_STATS_CPU_PERCENTAGE: SensorEntityDescription( + key=CONTAINER_STATS_CPU_PERCENTAGE, + name="CPU", + native_unit_of_measurement=PERCENTAGE, + icon="mdi:chip", + state_class=SensorStateClass.MEASUREMENT, + ), + CONTAINER_STATS_1CPU_PERCENTAGE: SensorEntityDescription( + key=CONTAINER_STATS_1CPU_PERCENTAGE, + name="1CPU", + native_unit_of_measurement=PERCENTAGE, + icon="mdi:chip", + state_class=SensorStateClass.MEASUREMENT, + ), + CONTAINER_STATS_MEMORY: SensorEntityDescription( + key=CONTAINER_STATS_MEMORY, + name="Memory", + native_unit_of_measurement=UnitOfInformation.MEBIBYTES, + icon="mdi:memory", + state_class=SensorStateClass.MEASUREMENT, + ), + CONTAINER_STATS_MEMORY_PERCENTAGE: SensorEntityDescription( + key=CONTAINER_STATS_MEMORY_PERCENTAGE, + name="Memory (percent)", + native_unit_of_measurement=PERCENTAGE, + icon="mdi:memory", + state_class=SensorStateClass.MEASUREMENT, + ), + CONTAINER_STATS_NETWORK_SPEED_UP: SensorEntityDescription( + key=CONTAINER_STATS_NETWORK_SPEED_UP, + name="Network speed Up", + native_unit_of_measurement=UnitOfDataRate.KIBIBYTES_PER_SECOND, + icon="mdi:upload", + state_class=SensorStateClass.MEASUREMENT, + ), + CONTAINER_STATS_NETWORK_SPEED_DOWN: SensorEntityDescription( + key=CONTAINER_STATS_NETWORK_SPEED_DOWN, + name="Network speed Down", + native_unit_of_measurement=UnitOfDataRate.KIBIBYTES_PER_SECOND, + icon="mdi:download", + state_class=SensorStateClass.MEASUREMENT, + ), + CONTAINER_STATS_NETWORK_TOTAL_UP: SensorEntityDescription( + key=CONTAINER_STATS_NETWORK_TOTAL_UP, + name="Network total Up", + native_unit_of_measurement=UnitOfInformation.MEBIBYTES, + icon="mdi:upload", + state_class=SensorStateClass.TOTAL_INCREASING, + ), + CONTAINER_STATS_NETWORK_TOTAL_DOWN: SensorEntityDescription( + key=CONTAINER_STATS_NETWORK_TOTAL_DOWN, + name="Network total Down", + native_unit_of_measurement=UnitOfInformation.MEBIBYTES, + icon="mdi:download", + state_class=SensorStateClass.TOTAL_INCREASING, + ), + CONTAINER_INFO_ALLINONE: SensorEntityDescription( + key=CONTAINER_INFO_ALLINONE, + name="State", + icon="mdi:checkbox-marked-circle-outline", + ), } CONTAINER_MONITOR_NETWORK_LIST = [ diff --git a/custom_components/monitor_docker/helpers.py b/custom_components/monitor_docker/helpers.py index d0be2b4b..79e72a3e 100644 --- a/custom_components/monitor_docker/helpers.py +++ b/custom_components/monitor_docker/helpers.py @@ -1,25 +1,24 @@ """Monitor Docker API helper.""" -import aiodocker import asyncio import concurrent import logging import os -import time - from datetime import datetime, timezone -from dateutil import parser, relativedelta - -from homeassistant.helpers.discovery import load_platform +from typing import Any, Callable +import aiodocker import homeassistant.util.dt as dt_util - +from dateutil import parser, relativedelta from homeassistant.const import ( CONF_NAME, CONF_SCAN_INTERVAL, CONF_URL, EVENT_HOMEASSISTANT_STOP, ) +from homeassistant.core import Event, HomeAssistant +from homeassistant.helpers.discovery import load_platform +from homeassistant.helpers.typing import ConfigType from .const import ( ATTR_MEMORY_LIMIT, @@ -37,45 +36,45 @@ CONF_PRECISION_NETWORK_KB, CONF_PRECISION_NETWORK_MB, CONTAINER, - CONTAINER_STATS_CPU_PERCENTAGE, - CONTAINER_STATS_1CPU_PERCENTAGE, + CONTAINER_INFO_HEALTH, CONTAINER_INFO_IMAGE, CONTAINER_INFO_NETWORK_AVAILABLE, + CONTAINER_INFO_STATE, + CONTAINER_INFO_STATUS, + CONTAINER_INFO_UPTIME, + CONTAINER_STATS_1CPU_PERCENTAGE, + CONTAINER_STATS_CPU_PERCENTAGE, CONTAINER_STATS_MEMORY, CONTAINER_STATS_MEMORY_PERCENTAGE, - CONTAINER_STATS_NETWORK_SPEED_UP, CONTAINER_STATS_NETWORK_SPEED_DOWN, - CONTAINER_STATS_NETWORK_TOTAL_UP, + CONTAINER_STATS_NETWORK_SPEED_UP, CONTAINER_STATS_NETWORK_TOTAL_DOWN, - DOCKER_INFO_IMAGES, - CONTAINER_INFO_STATE, - CONTAINER_INFO_HEALTH, - CONTAINER_INFO_STATUS, - CONTAINER_INFO_UPTIME, - DOCKER_INFO_CONTAINER_RUNNING, + CONTAINER_STATS_NETWORK_TOTAL_UP, DOCKER_INFO_CONTAINER_PAUSED, + DOCKER_INFO_CONTAINER_RUNNING, DOCKER_INFO_CONTAINER_STOPPED, DOCKER_INFO_CONTAINER_TOTAL, + DOCKER_INFO_IMAGES, DOCKER_INFO_VERSION, - DOCKER_STATS_CPU_PERCENTAGE, DOCKER_STATS_1CPU_PERCENTAGE, + DOCKER_STATS_CPU_PERCENTAGE, DOCKER_STATS_MEMORY, DOCKER_STATS_MEMORY_PERCENTAGE, DOMAIN, PRECISION, ) -VERSION = "1.14" +VERSION = "1.18" _LOGGER = logging.getLogger(__name__) -def toKB(value, precision=PRECISION): +def toKB(value: float, precision: int = PRECISION) -> float: """Converts bytes to kBytes.""" return round(value / (1024 ** 1), precision) -def toMB(value, precision=PRECISION): +def toMB(value: float, precision: int = PRECISION) -> float: """Converts bytes to MBytes.""" return round(value / (1024 ** 2), precision) @@ -84,29 +83,30 @@ def toMB(value, precision=PRECISION): class DockerAPI: """Docker API abstraction allowing multiple Docker instances beeing monitored.""" - def __init__(self, hass, config, startCount=0): + def __init__(self, hass: HomeAssistant, config: ConfigType): """Initialize the Docker API.""" self._hass = hass self._config = config - self._instance = config[CONF_NAME] - self._containers = {} - self._tasks = {} - self._info = {} - self._event_create = {} - self._event_destroy = {} + self._instance: str = config[CONF_NAME] + self._containers: dict[str, DockerContainerAPI] = {} + self._tasks: dict[str, asyncio.Task] = {} + self._info: dict[str, Any] = {} + self._event_create: dict[str, int] = {} + self._event_destroy: dict[str, int] = {} self._dockerStopped = False - self._subscribers = [] + self._subscribers: list[Callable] = [] + self._version1904 = None + self._api: aiodocker.Docker = None _LOGGER.debug("[%s]: Helper version: %s", self._instance, VERSION) - self._interval = config[CONF_SCAN_INTERVAL].seconds - - self._loop = asyncio.get_event_loop() + self._interval: int = config[CONF_SCAN_INTERVAL].seconds + async def init(self, startCount=0): try: # Try to fix unix:// to unix:/// (3 are required by aiodocker) - url = self._config[CONF_URL] + url: str = self._config[CONF_URL] if ( url is not None and url.find("unix://") == 0 @@ -116,7 +116,7 @@ def __init__(self, hass, config, startCount=0): # When we reconnect with tcp, we should delay - docker is maybe not fully ready if startCount > 0 and url is not None and url.find("unix:") != 0: - time.sleep(5) + await asyncio.sleep(5) # Do some debugging logging for TCP/TLS if url is not None: @@ -169,11 +169,10 @@ def __init__(self, hass, config, startCount=0): ) return - versionInfo = self._loop.run_until_complete(self._api.version()) - version = versionInfo.get("Version", None) + versionInfo = await self._api.version() + version: str | None = versionInfo.get("Version", None) # Compare version with 19.03 when memory calculation has changed - self._version1904 = None if version is not None: try: if tuple(map(int, (version.split(".")[0:2]))) > tuple( @@ -193,17 +192,17 @@ def __init__(self, hass, config, startCount=0): ) # Start task to monitor events of create/delete/start/stop - self._tasks["events"] = self._loop.create_task(self._run_docker_events()) + self._tasks["events"] = asyncio.create_task(self._run_docker_events()) # Start task to monitor total/running containers - self._tasks["info"] = self._loop.create_task(self._run_docker_info()) + self._tasks["info"] = asyncio.create_task(self._run_docker_info()) # Get the list of containers to monitor - containers = self._loop.run_until_complete(self._api.containers.list(all=True)) + containers = await self._api.containers.list(all=True) for container in containers or []: # Determine name from Docker API, it contains an array with a slash - cname = container._container["Names"][0][1:] + cname: str = container._container["Names"][0][1:] # We will monitor all containers, including excluded ones. # This is needed to get total CPU/Memory usage. @@ -216,8 +215,9 @@ def __init__(self, hass, config, startCount=0): cname, version1904=self._version1904, ) + await self._containers[cname].init() - hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, self._monitor_stop) + self._hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, self._monitor_stop) for component in COMPONENTS: load_platform( @@ -229,15 +229,13 @@ def __init__(self, hass, config, startCount=0): ) ############################################################# - def _monitor_stop(self, _service_or_event): + def _monitor_stop(self, _service_or_event: Event) -> None: """Stop the monitor thread.""" _LOGGER.info("[%s]: Stopping Monitor Docker thread", self._instance) - self._loop.stop() - ############################################################# - def remove_entities(self): + def remove_entities(self) -> None: """Remove docker info entities.""" if len(self._subscribers) > 0: @@ -249,25 +247,24 @@ def remove_entities(self): for callback in self._subscribers: callback(remove=True) - self._subscriber = [] + self._subscriber: list[Callable] = [] ############################################################# - def register_callback(self, callback, variable): + def register_callback(self, callback: Callable, variable: str) -> None: """Register callback from sensor.""" if callback not in self._subscribers: _LOGGER.debug("[%s]: Added callback entity: %s", self._instance, variable) self._subscribers.append(callback) ############################################################# - async def _run_docker_events(self): + async def _run_docker_events(self) -> None: """Function to retrieve docker events. We can add or remove monitored containers.""" try: subscriber = self._api.events.subscribe() while True: - - event = await subscriber.get() + event: dict = await subscriber.get() # When we receive none, the connection normally is broken if event is None: @@ -290,7 +287,6 @@ async def _run_docker_events(self): str(err), exc_info=True, ) - pass # Stop everything and return to the main thread self._monitor_stop(self._config[CONF_NAME]) @@ -321,7 +317,7 @@ async def _run_docker_events(self): ) if self._event_create and not taskcreated: - self._loop.create_task(self._container_create_destroy()) + await self._container_create_destroy() elif event["Action"] == "destroy": # Check if another task is running, ifso, we don't create a new one @@ -354,7 +350,7 @@ async def _run_docker_events(self): ) if self._event_destroy and not taskcreated: - self._loop.create_task(self._container_create_destroy()) + await self._container_create_destroy() elif event["Action"] == "rename": # during a docker-compose up -d the old container can be renamed # sensors/switch should be removed before the new container is monitored @@ -373,15 +369,54 @@ async def _run_docker_events(self): oname, cname, ) - self._containers[cname] = self._containers[oname] - del self._containers[oname] - # We also need to rename the internal name - self._containers[cname].set_name(cname) + # First remove the newly create container, has a temporary name + if oname in self._event_create: + _LOGGER.warning( + "[%s] %s: Event rename received, but create wasn't executed yet", + self._instance, + oname, + ) + del self._event_create[cname] + elif oname not in self._event_destroy: + _LOGGER.debug( + "[%s] %s: Event rename (destroy) container", + self._instance, + oname, + ) + self._event_destroy[oname] = 0 + else: + _LOGGER.error( + "%s: Event rename (destroy) container, but already in working table?", + oname, + ) + + if self._event_destroy and not taskcreated: + await self._container_create_destroy() - # We also should remove entities, rename does not work - self._containers[cname].remove_entities() + # Second re-add the container with the original name + taskcreated = ( + True + if self._event_create or self._event_destroy + else False + ) + + if cname not in self._event_create: + _LOGGER.debug( + "[%s] %s: Event rename (create) container", + self._instance, + cname, + ) + self._event_create[cname] = 0 + else: + _LOGGER.error( + "[%s] %s: Event rename (create) container, but already in working table?", + self._instance, + cname, + ) + if self._event_create and not taskcreated: + await self._container_create_destroy() else: _LOGGER.error( "[%s] %s: Event rename container doesn't exist in list?", @@ -395,12 +430,11 @@ async def _run_docker_events(self): ) ############################################################# - async def _container_create_destroy(self): + async def _container_create_destroy(self) -> None: """Handles create or destroy of container events.""" try: while self._event_create or self._event_destroy: - # Go through create loop first for cname in self._event_create: if self._event_create[cname] > 2: @@ -428,8 +462,7 @@ async def _container_create_destroy(self): ) ############################################################# - async def _container_add(self, cname): - + async def _container_add(self, cname: str) -> None: if cname in self._containers: _LOGGER.error("[%s] %s: Container already monitored", self._instance, cname) return @@ -462,8 +495,7 @@ async def _container_add(self, cname): ) ############################################################# - async def _container_remove(self, cname): - + async def _container_remove(self, cname: str) -> None: if cname in self._containers: _LOGGER.debug("[%s] %s: Stopping Container Monitor", self._instance, cname) self._containers[cname].cancel_task() @@ -474,14 +506,13 @@ async def _container_remove(self, cname): _LOGGER.error("[%s] %s: Container is NOT monitored", self._instance, cname) ############################################################# - async def _run_docker_info(self): + async def _run_docker_info(self) -> None: """Function to retrieve information like docker info.""" loopInit = False try: while True: - if self._dockerStopped: _LOGGER.debug("[%s]: Stopping docker info thread", self._instance) break @@ -500,8 +531,8 @@ async def _run_docker_info(self): self._info[ATTR_MEMORY_LIMIT] = info.get("MemTotal") self._info[ATTR_ONLINE_CPUS] = info.get("NCPU") - self._info[ATTR_VERSION_OS] = info.get("OperationSystem") - self._info[ATTR_VERSION_OS_TYPE] = info.get("OStype") + self._info[ATTR_VERSION_OS] = info.get("OperatingSystem") + self._info[ATTR_VERSION_OS_TYPE] = info.get("OSType") self._info[ATTR_VERSION_ARCH] = info.get("Architecture") self._info[ATTR_VERSION_KERNEL] = info.get("KernelVersion") @@ -537,13 +568,11 @@ async def _run_docker_info(self): self._info[ATTR_MEMORY_LIMIT] is not None and self._info[ATTR_MEMORY_LIMIT] != 0 ): - self._info[DOCKER_STATS_MEMORY_PERCENTAGE] = ( + self._info[DOCKER_STATS_MEMORY_PERCENTAGE] = round( self._info[DOCKER_STATS_MEMORY] - / toMB( - self._info[ATTR_MEMORY_LIMIT], - self._config[CONF_PRECISION_MEMORY_PERCENTAGE], - ) - * 100 + / toMB(self._info[ATTR_MEMORY_LIMIT], 4) + * 100, + self._config[CONF_PRECISION_MEMORY_PERCENTAGE], ) # Try to fix possible 0 values in history at start-up @@ -644,7 +673,7 @@ def list_containers(self): return self._containers.keys() ############################################################# - def get_container(self, cname): + def get_container(self, cname: str) -> "DockerContainerAPI": if cname in self._containers: return self._containers[cname] else: @@ -654,7 +683,7 @@ def get_container(self, cname): return None ############################################################# - def get_info(self): + def get_info(self) -> dict[str, Any]: return self._info @@ -664,46 +693,43 @@ class DockerContainerAPI: def __init__( self, - config, - api, - cname, + config: ConfigType, + api: aiodocker.Docker, + cname: str, atInit=True, - version1904=None, + version1904: bool | None = None, ): self._config = config self._api = api self._version1904 = version1904 - self._instance = config[CONF_NAME] - self._memChange = config[CONF_MEMORYCHANGE] + self._instance: str = config[CONF_NAME] + self._memChange: int = config[CONF_MEMORYCHANGE] self._name = cname - self._interval = config[CONF_SCAN_INTERVAL].seconds + self._interval: int = config[CONF_SCAN_INTERVAL].seconds self._busy = False self._atInit = atInit - self._task = None - self._subscribers = [] - self._cpu_old = {} - self._network_old = {} + self._task: asyncio.Task | None = None + self._subscribers: list[Callable] = [] + self._cpu_old: dict[str, int] = {} + self._network_old: dict[str, int | datetime] = {} self._network_error = 0 self._memory_error = 0 self._cpu_error = 0 - self._memory_prev = None + self._memory_prev: float | None = None self._memory_prev_breach = False - self._memory_percent_prev = None + self._memory_percent_prev: float | None = None self._memory_percent_prev_breach = False - self._info = {} - self._stats = {} - - self._loop = asyncio.get_event_loop() + self._info: dict[str, Any] = {} + self._stats: dict[str, Any] = {} + async def init(self): # During start-up we will wait on container attachment, # preventing concurrency issues the main HA loop (we are # othside that one with our threads) if self._atInit: try: - self._container = self._loop.run_until_complete( - self._api.containers.get(self._name) - ) + self._container = await self._api.containers.get(self._name) except Exception as err: _LOGGER.error( "[%s] %s: Container not available anymore (1) (%s)", @@ -714,11 +740,10 @@ def __init__( ) return - self._task = self._loop.create_task(self._run()) + self._task = asyncio.create_task(self._run()) ############################################################# - async def _initGetContainer(self): - + async def _initGetContainer(self) -> bool: # If we noticed a event=create, we need to attach here. # The run_until_complete doesn't work, because we are already # in a running loop. @@ -735,17 +760,16 @@ async def _initGetContainer(self): ) return False - self._task = self._loop.create_task(self._run()) + self._task = asyncio.create_task(self._run()) return True ############################################################# - async def _run(self): + async def _run(self) -> None: """Loop to gather container info/stats.""" while True: try: - # Don't check container if we are doing a start/stop if not self._busy: await self._run_container_info() @@ -783,7 +807,7 @@ async def _run(self): await asyncio.sleep(self._interval) ############################################################# - async def _run_container_info(self): + async def _run_container_info(self) -> None: """Get container information, but we can not get the uptime of this container, that is only available while listing all containers :-(. @@ -791,13 +815,20 @@ async def _run_container_info(self): self._info = {} - raw = await self._container.show() + raw: dict = await self._container.show() self._info[CONTAINER_INFO_STATE] = raw["State"]["Status"] self._info[CONTAINER_INFO_IMAGE] = raw["Config"]["Image"] - self._info[CONTAINER_INFO_NETWORK_AVAILABLE] = ( - False if raw["HostConfig"]["NetworkMode"] in ["host", "none"] else True - ) + + if self._network_error <= 5: + if CONTAINER_INFO_NETWORK_AVAILABLE not in self._info: + self._info[CONTAINER_INFO_NETWORK_AVAILABLE] = ( + False + if raw["HostConfig"]["NetworkMode"] in ["host", "none"] + else True + ) + else: + self._info[CONTAINER_INFO_NETWORK_AVAILABLE] = False try: self._info[CONTAINER_INFO_HEALTH] = raw["State"]["Health"]["Status"] @@ -849,18 +880,17 @@ async def _run_container_info(self): ) ############################################################# - async def _run_container_stats(self): - + async def _run_container_stats(self) -> None: # Initialize stats information - stats = {} + stats: dict[str, Any] = {} stats["cpu"] = {} stats["memory"] = {} stats["network"] = {} stats["read"] = {} # Get container stats, only interested in [0] - raw = await self._container.stats(stream=False) - raw = raw[0] + rawarr = await self._container.stats(stream=False) + raw: dict[str, Any] = rawarr[0] stats["read"] = parser.parse(raw["read"]) @@ -890,7 +920,7 @@ async def _run_container_stats(self): (cpu_delta / system_delta) * float(cpu_stats["online_cpus"]) * 100.0, - PRECISION, + self._config[CONF_PRECISION_CPU], ) self._cpu_old = cpu_new @@ -906,7 +936,6 @@ async def _run_container_stats(self): self._cpu_error = 0 except KeyError as err: - # Something wrong with the raw data if self._cpu_error == 0: _LOGGER.error( @@ -929,7 +958,7 @@ async def _run_container_stats(self): self._cpu_error += 1 # Gather memory information - memory_stats = {} + memory_stats: dict[str, float | None] = {} try: memory_stats["usage"] = None @@ -960,7 +989,7 @@ async def _run_container_stats(self): ) memory_stats["usage_percent"] = round( float(memory_stats["usage"]) / float(memory_stats["limit"]) * 100.0, - PRECISION, + self._config[CONF_PRECISION_MEMORY_PERCENTAGE], ) if self._memory_error > 0: @@ -974,7 +1003,6 @@ async def _run_container_stats(self): self._memory_error = 0 except (KeyError, TypeError) as err: - if self._memory_error == 0: _LOGGER.error( "[%s] %s: Cannot determine memory usage for container (%s)", @@ -1035,9 +1063,9 @@ async def _run_container_stats(self): self._memory_prev_breach = False """ - self._memory_prev = None + self._memory_prev = None self._memory_prev_breach = False - self._memory_percent_prev = None + self._memory_percent_prev = None self._memory_percent_prev_breach = False """ @@ -1062,7 +1090,7 @@ async def _run_container_stats(self): self._memory_percent_prev = memory_stats.get("usage_percent", None) # Gather network information, doesn't work in network=host mode - network_stats = {} + network_stats: dict[str, int | float] = {} if self._info[CONTAINER_INFO_NETWORK_AVAILABLE]: try: network_new = {} @@ -1157,7 +1185,7 @@ async def _run_container_stats(self): self._stats = stats ############################################################# - def cancel_task(self): + def cancel_task(self) -> None: if self._task is not None: _LOGGER.info( "[%s] %s: Cancelling task for container info/stats", @@ -1173,7 +1201,7 @@ def cancel_task(self): ) ############################################################# - def rename_entities_containername(self): + def rename_entities_containername(self) -> None: if len(self._subscribers) > 0: _LOGGER.debug( "[%s] %s: Renaming entities for container", self._instance, self._name @@ -1183,7 +1211,7 @@ def rename_entities_containername(self): callback(rename=True, name=self._name) ############################################################# - def remove_entities(self): + def remove_entities(self) -> None: if len(self._subscribers) > 0: _LOGGER.debug( "[%s] %s: Removing entities from container", self._instance, self._name @@ -1192,10 +1220,10 @@ def remove_entities(self): for callback in self._subscribers: callback(remove=True) - self._subscriber = [] + self._subscriber: list[Callable] = [] ############################################################# - async def _start(self): + async def _start(self) -> None: """Separate loop to start container, because HA loop can't be used.""" try: @@ -1211,15 +1239,15 @@ async def _start(self): self._busy = False ############################################################# - async def start(self): + async def start(self) -> None: """Called from HA switch.""" _LOGGER.info("[%s] %s: Start container", self._instance, self._name) self._busy = True - self._loop.create_task(self._start()) + await self._start() ############################################################# - async def _stop(self): + async def _stop(self) -> None: """Separate loop to stop container, because HA loop can't be used.""" try: await self._container.stop(t=10) @@ -1234,15 +1262,15 @@ async def _stop(self): self._busy = False ############################################################# - async def stop(self): + async def stop(self) -> None: """Called from HA switch.""" _LOGGER.info("[%s] %s: Stop container", self._instance, self._name) self._busy = True - self._loop.create_task(self._stop()) + await self._stop() ############################################################# - async def _restart(self): + async def _restart(self) -> None: """Separate loop to stop container, because HA loop can't be used.""" try: await self._container.restart() @@ -1257,35 +1285,35 @@ async def _restart(self): self._busy = False ############################################################# - async def restart(self): + async def restart(self) -> None: """Called from service call.""" _LOGGER.info("[%s] %s: Restart container", self._instance, self._name) self._busy = True - self._loop.create_task(self._restart()) + await self._restart() ############################################################# - def get_name(self): + def get_name(self) -> str: """Return the container name.""" return self._name ############################################################# - def set_name(self, name): + def set_name(self, name: str) -> None: """Set the container name.""" self._name = name ############################################################# - def get_info(self): + def get_info(self) -> dict: """Return the container info.""" return self._info ############################################################# - def get_stats(self): + def get_stats(self) -> dict: """Return the container stats.""" return self._stats ############################################################# - def register_callback(self, callback, variable): + def register_callback(self, callback: Callable, variable: str): """Register callback from sensor/switch.""" if callback not in self._subscribers: _LOGGER.debug( @@ -1297,7 +1325,7 @@ def register_callback(self, callback, variable): self._subscribers.append(callback) ############################################################# - def _notify(self): + def _notify(self) -> None: if len(self._subscribers) > 0: _LOGGER.debug( "[%s] %s: Send notify (%d) to container", @@ -1311,7 +1339,7 @@ def _notify(self): ############################################################# @staticmethod - def _calcdockerformat(dt): + def _calcdockerformat(dt: datetime) -> str: """Calculate datetime to Docker format, because it isn't available in stats.""" if dt is None: return "None" diff --git a/custom_components/monitor_docker/icons.json b/custom_components/monitor_docker/icons.json new file mode 100644 index 00000000..729f046a --- /dev/null +++ b/custom_components/monitor_docker/icons.json @@ -0,0 +1,5 @@ +{ + "services": { + "restart": "mdi:restart" + } +} diff --git a/custom_components/monitor_docker/manifest.json b/custom_components/monitor_docker/manifest.json index 0b8f59c8..d34cba36 100644 --- a/custom_components/monitor_docker/manifest.json +++ b/custom_components/monitor_docker/manifest.json @@ -1,10 +1,10 @@ { "domain": "monitor_docker", "name": "Monitor Docker", - "version": "1.10", + "codeowners": ["@ualex73"], "documentation": "https://github.com/ualex73/monitor_docker", + "iot_class": "local_polling", "issue_tracker": "https://github.com/ualex73/monitor_docker/issues", "requirements": ["aiodocker==0.21.0", "python-dateutil==2.8.2"], - "codeowners": ["@ualex73"], - "iot_class": "local_polling" + "version": "1.18" } diff --git a/custom_components/monitor_docker/sensor.py b/custom_components/monitor_docker/sensor.py index 5d01ce08..daaa8051 100644 --- a/custom_components/monitor_docker/sensor.py +++ b/custom_components/monitor_docker/sensor.py @@ -2,14 +2,22 @@ import asyncio import logging - -from homeassistant.components.sensor import ENTITY_ID_FORMAT -from homeassistant.const import CONF_NAME, CONF_MONITORED_CONDITIONS -from homeassistant.helpers.entity import Entity +import re +from datetime import datetime +from typing import Any + +from homeassistant.components.sensor import ( + ENTITY_ID_FORMAT, + SensorEntity, + SensorEntityDescription, +) +from homeassistant.const import CONF_MONITORED_CONDITIONS, CONF_NAME +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddEntitiesCallback +from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from homeassistant.util import slugify from .const import ( - DOMAIN, API, ATTR_MEMORY_LIMIT, ATTR_ONLINE_CPUS, @@ -17,39 +25,54 @@ ATTR_VERSION_KERNEL, ATTR_VERSION_OS, ATTR_VERSION_OS_TYPE, - CONFIG, CONF_CONTAINERS, CONF_CONTAINERS_EXCLUDE, CONF_PREFIX, CONF_RENAME, + CONF_RENAME_ENITITY, CONF_SENSORNAME, - DOCKER_INFO_VERSION, + CONFIG, CONTAINER, CONTAINER_INFO_ALLINONE, + CONTAINER_INFO_HEALTH, CONTAINER_INFO_IMAGE, CONTAINER_INFO_NETWORK_AVAILABLE, CONTAINER_INFO_STATE, - CONTAINER_INFO_HEALTH, CONTAINER_INFO_STATUS, CONTAINER_INFO_UPTIME, CONTAINER_MONITOR_LIST, CONTAINER_MONITOR_NETWORK_LIST, + DOCKER_INFO_VERSION, DOCKER_MONITOR_LIST, + DOMAIN, ) +from .helpers import DockerAPI, DockerContainerAPI _LOGGER = logging.getLogger(__name__) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): +async def async_setup_platform( + hass: HomeAssistant, + config: ConfigType, + async_add_entities: AddEntitiesCallback, + discovery_info: DiscoveryInfoType | None = None, +): """Set up the Monitor Docker Sensor.""" + def find_rename(d: dict[str, str], item: str) -> str: + for k in d: + if re.match(k, item): + return d[k] + + return item + if discovery_info is None: return - instance = discovery_info[CONF_NAME] - name = discovery_info[CONF_NAME] - api = hass.data[DOMAIN][name][API] - config = hass.data[DOMAIN][name][CONFIG] + instance: str = discovery_info[CONF_NAME] + name: str = discovery_info[CONF_NAME] + api: DockerAPI = hass.data[DOMAIN][name][API] + config: ConfigType = hass.data[DOMAIN][name][CONFIG] # Set or overrule prefix prefix = name @@ -59,8 +82,8 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= _LOGGER.debug("[%s]: Setting up sensor(s)", instance) sensors = [] - sensors = [ - DockerSensor(api, instance, prefix, variable) + sensors: list[DockerSensor | DockerContainerSensor] = [ + DockerSensor(api, instance, prefix, DOCKER_MONITOR_LIST[variable]) for variable in config[CONF_MONITORED_CONDITIONS] if variable in DOCKER_MONITOR_LIST if CONTAINER not in discovery_info @@ -84,7 +107,6 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= config[CONF_MONITORED_CONDITIONS].remove(CONTAINER_INFO_STATE) for cname in clist: - includeContainer = False if cname in config[CONF_CONTAINERS] or not config[CONF_CONTAINERS]: includeContainer = True @@ -116,15 +138,22 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= ) ): monitor_conditions += [variable] + + # Only force rename of entityid is requested, to not break backwards compatibility + alias_entityid = cname + if config[CONF_RENAME_ENITITY]: + alias_entityid = find_rename(config[CONF_RENAME], cname) + sensors += [ DockerContainerSensor( capi, - instance, - prefix, - cname, - config[CONF_RENAME].get(cname, cname), - CONTAINER_INFO_ALLINONE, - config[CONF_SENSORNAME], + instance=instance, + prefix=prefix, + cname=cname, + alias_entityid=alias_entityid, + alias_name=find_rename(config[CONF_RENAME], cname), + description=CONTAINER_MONITOR_LIST[CONTAINER_INFO_ALLINONE], + sensor_name_format=config[CONF_SENSORNAME], condition_list=monitor_conditions, ) ] @@ -137,15 +166,22 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= and variable not in CONTAINER_MONITOR_NETWORK_LIST ) ): + + # Only force rename of entityid is requested, to not break backwards compatibility + alias_entityid = cname + if config[CONF_RENAME_ENITITY]: + alias_entityid = find_rename(config[CONF_RENAME], cname) + sensors += [ DockerContainerSensor( capi, - instance, - prefix, - cname, - config[CONF_RENAME].get(cname, cname), - variable, - config[CONF_SENSORNAME], + instance=instance, + prefix=prefix, + cname=cname, + alias_entityid=alias_entityid, + alias_name=find_rename(config[CONF_RENAME], cname), + description=CONTAINER_MONITOR_LIST[variable], + sensor_name_format=config[CONF_SENSORNAME], ) ] @@ -161,72 +197,57 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= ################################################################# -class DockerSensor(Entity): +class DockerSensor(SensorEntity): """Representation of a Docker Sensor.""" - def __init__(self, api, instance, prefix, variable): + def __init__( + self, + api: DockerAPI, + instance: str, + prefix: str, + description: SensorEntityDescription, + ): """Initialize the sensor.""" - self._loop = asyncio.get_running_loop() self._api = api self._instance = instance self._prefix = prefix - self._var_id = variable - self._var_name = DOCKER_MONITOR_LIST[variable][0] - self._var_unit = DOCKER_MONITOR_LIST[variable][1] - self._var_icon = DOCKER_MONITOR_LIST[variable][2] - self._var_class = DOCKER_MONITOR_LIST[variable][3] + self.entity_description = description - self._entity_id = ENTITY_ID_FORMAT.format( - slugify(self._prefix + "_" + self._var_name) + self._entity_id: str = ENTITY_ID_FORMAT.format( + slugify(f"{self._prefix}_{self.entity_description.name}") + ) + self._name = "{name} {sensor}".format( + name=self._prefix, sensor=self.entity_description ) - self._name = "{name} {sensor}".format(name=self._prefix, sensor=self._var_name) self._state = None - self._attributes = {} + self._attributes: dict[str, Any] = {} self._removed = False _LOGGER.info( - "[%s]: Initializing Docker sensor '%s'", self._instance, self._var_id + "[%s]: Initializing Docker sensor '%s'", + self._instance, + self.entity_description.name, ) @property - def entity_id(self): + def entity_id(self) -> str: """Return the entity id of the sensor.""" return self._entity_id @property - def name(self): - """Return the name of the sensor.""" - return self._name - - @property - def icon(self): - """Icon to use in the frontend.""" - return self._var_icon - - @property - def state(self): + def native_value(self) -> str | None: """Return the state of the sensor.""" return self._state - @property - def device_class(self): - """Return the class of this sensor.""" - return self._var_class - - @property - def unit_of_measurement(self): - """Return the unit the value is expressed in.""" - return self._var_unit - - def update(self): + def update(self) -> None: """Get the latest data for the states.""" info = self._api.get_info() - if self._var_id == DOCKER_INFO_VERSION: - self._state = info.get(self._var_id) + if self.entity_description.key == DOCKER_INFO_VERSION: + self._state = info.get(self.entity_description.key) self._attributes[ATTR_MEMORY_LIMIT] = info.get(ATTR_MEMORY_LIMIT) self._attributes[ATTR_ONLINE_CPUS] = info.get(ATTR_ONLINE_CPUS) self._attributes[ATTR_VERSION_ARCH] = info.get(ATTR_VERSION_ARCH) @@ -234,18 +255,18 @@ def update(self): self._attributes[ATTR_VERSION_OS_TYPE] = info.get(ATTR_VERSION_OS_TYPE) self._attributes[ATTR_VERSION_KERNEL] = info.get(ATTR_VERSION_KERNEL) else: - self._state = info.get(self._var_id) + self._state = info.get(self.entity_description.key) @property - def extra_state_attributes(self): + def extra_state_attributes(self) -> dict: """Return the state attributes.""" return self._attributes - async def async_added_to_hass(self): + async def async_added_to_hass(self) -> None: """Register callbacks.""" - self._api.register_callback(self.event_callback, self._var_id) + self._api.register_callback(self.event_callback, self.entity_description.key) - def event_callback(self, remove=False): + def event_callback(self, remove=False) -> None: """Callback to remove Docker entity.""" # If already called before, do not remove it again @@ -254,136 +275,119 @@ def event_callback(self, remove=False): if remove: _LOGGER.info( - "[%s]: Removing sensor entity: %s", self._instance, self._var_id + "[%s]: Removing sensor entity: %s", + self._instance, + self.entity_description.key, ) - self._loop.create_task(self.async_remove()) + asyncio.create_task(self.async_remove()) self._removed = True return ################################################################# -class DockerContainerSensor(Entity): +class DockerContainerSensor(SensorEntity): """Representation of a Docker Sensor.""" def __init__( self, - container, - instance, - prefix, - cname, - alias, - variable, - sensor_name_format, - condition_list=None, + container: DockerContainerAPI, + instance: str, + prefix: str, + cname: str, + alias_entityid: str, + alias_name: str, + description: SensorEntityDescription, + sensor_name_format: str, + condition_list: list | None = None, ): """Initialize the sensor.""" - self._loop = asyncio.get_running_loop() self._instance = instance self._container = container self._prefix = prefix self._cname = cname self._condition_list = condition_list - self._var_id = variable + self.entity_description = description - if self._var_id == CONTAINER_INFO_ALLINONE: - self._var_name = CONTAINER_MONITOR_LIST[CONTAINER_INFO_STATE][0] - self._var_unit = CONTAINER_MONITOR_LIST[CONTAINER_INFO_STATE][1] - self._var_icon = CONTAINER_MONITOR_LIST[CONTAINER_INFO_STATE][2] - self._var_class = CONTAINER_MONITOR_LIST[CONTAINER_INFO_STATE][3] - else: - self._var_name = CONTAINER_MONITOR_LIST[variable][0] - self._var_unit = CONTAINER_MONITOR_LIST[variable][1] - self._var_icon = CONTAINER_MONITOR_LIST[variable][2] - self._var_class = CONTAINER_MONITOR_LIST[variable][3] - - self._state_extra = None - - if self._var_id == CONTAINER_INFO_ALLINONE: + if self.entity_description.key == CONTAINER_INFO_ALLINONE: self._entity_id = ENTITY_ID_FORMAT.format( - slugify(self._prefix + "_" + self._cname) + slugify(f"{self._prefix}_{alias_entityid}") + ) + self._attr_name = ENTITY_ID_FORMAT.format( + slugify(f"{self._prefix}_{alias_entityid}") + ) + self._attr_name = sensor_name_format.format( + name=alias_name, sensorname="", sensor="" ) - self._name = sensor_name_format.format(name=alias, sensorname="", sensor="") else: self._entity_id = ENTITY_ID_FORMAT.format( - slugify(self._prefix + "_" + self._cname + "_" + self._var_name) + slugify( + f"{self._prefix}_{alias_entityid}_{self.entity_description.name}" + ) ) - self._name = sensor_name_format.format( - name=alias, sensorname=self._var_name, sensor=self._var_name + self._attr_name = sensor_name_format.format( + name=alias_name, + sensorname=self.entity_description.name, + sensor=self.entity_description.name, ) self._state = None self._state_extra = None - self._attributes = {} + self._attr_extra_state_attributes: dict[str, Any] = {} self._removed = False _LOGGER.info( "[%s] %s: Initializing sensor with parameter: %s", self._instance, self._cname, - self._var_name, + self.entity_description.name, ) @property - def entity_id(self): + def entity_id(self) -> str: """Return the entity id of the sensor.""" return self._entity_id @property - def name(self): - """Return the name of the sensor, if any.""" - return self._name - - @property - def icon(self): + def icon(self) -> str: """Icon to use in the frontend, if any.""" - if self._var_id == CONTAINER_INFO_STATUS: + if self.entity_description.key == CONTAINER_INFO_STATUS: if self._state_extra == "running": return "mdi:checkbox-marked-circle-outline" else: return "mdi:checkbox-blank-circle-outline" - elif self._var_id in [CONTAINER_INFO_ALLINONE, CONTAINER_INFO_STATE]: + elif self.entity_description.key in [ + CONTAINER_INFO_ALLINONE, + CONTAINER_INFO_STATE, + ]: if self._state == "running": return "mdi:checkbox-marked-circle-outline" else: return "mdi:checkbox-blank-circle-outline" - return self._var_icon + return self.entity_description.icon @property - def should_poll(self): + def should_poll(self) -> bool: return False @property - def state(self): + def native_value(self) -> str: """Return the state of the sensor.""" return self._state - @property - def device_class(self): - """Return the class of this sensor.""" - return self._var_class - - @property - def unit_of_measurement(self): - """Return the unit the value is expressed in.""" - return self._var_unit - - @property - def extra_state_attributes(self): - """Return the state attributes.""" - return self._attributes - - async def async_added_to_hass(self): + async def async_added_to_hass(self) -> None: """Register callbacks.""" - self._container.register_callback(self.event_callback, self._var_id) + self._container.register_callback( + self.event_callback, self.entity_description.key + ) # Call event callback for possible information available self.event_callback() - def event_callback(self, name="", remove=False): + def event_callback(self, name="", remove=False) -> None: """Callback for update of container information.""" if remove: @@ -395,9 +399,9 @@ def event_callback(self, name="", remove=False): "[%s] %s: Removing sensor entity: %s", self._instance, self._cname, - self._var_id, + self.entity_description.key, ) - self._loop.create_task(self.async_remove()) + asyncio.create_task(self.async_remove()) self._removed = True return @@ -407,7 +411,7 @@ def event_callback(self, name="", remove=False): "[%s] %s: Received callback for: %s", self._instance, self._cname, - self._var_name, + self.entity_description.key, ) stats = {} @@ -426,12 +430,12 @@ def event_callback(self, name="", remove=False): str(err), ) else: - if self._var_id == CONTAINER_INFO_ALLINONE: + if self.entity_description.key == CONTAINER_INFO_ALLINONE: # The state is mandatory state = info.get(CONTAINER_INFO_STATE) # Now list the rest of the attributes - self._attributes = {} + self._attr_extra_state_attributes = {} for cond in self._condition_list: if cond in [ CONTAINER_INFO_STATUS, @@ -439,26 +443,31 @@ def event_callback(self, name="", remove=False): CONTAINER_INFO_HEALTH, CONTAINER_INFO_UPTIME, ]: - self._attributes[cond] = info.get(cond, None) + self._attr_extra_state_attributes[cond] = info.get(cond, None) else: - self._attributes[cond] = stats.get(cond, None) - elif self._var_id == CONTAINER_INFO_STATUS: + self._attr_extra_state_attributes[cond] = stats.get(cond, None) + elif self.entity_description.key == CONTAINER_INFO_STATUS: state = info.get(CONTAINER_INFO_STATUS) self._state_extra = info.get(CONTAINER_INFO_STATE) - elif self._var_id in [ + elif self.entity_description.key in [ CONTAINER_INFO_STATE, CONTAINER_INFO_IMAGE, CONTAINER_INFO_HEALTH, ]: - state = info.get(self._var_id) + state = info.get(self.entity_description.key) elif info.get(CONTAINER_INFO_STATE) == "running": - if self._var_id in CONTAINER_MONITOR_LIST: - if self._var_id in [CONTAINER_INFO_UPTIME]: - state = info.get(self._var_id) + if self.entity_description.key in CONTAINER_MONITOR_LIST: + if self.entity_description.key in [CONTAINER_INFO_UPTIME]: + state = datetime.fromisoformat( + info.get(self.entity_description.key) + ) else: - state = stats.get(self._var_id) + state = stats.get(self.entity_description.key) - if state != self._state or self._var_id == CONTAINER_INFO_ALLINONE: + if ( + state != self._state + or self.entity_description.key == CONTAINER_INFO_ALLINONE + ): self._state = state try: diff --git a/custom_components/monitor_docker/services.yaml b/custom_components/monitor_docker/services.yaml index dde65cef..b4b05a6a 100644 --- a/custom_components/monitor_docker/services.yaml +++ b/custom_components/monitor_docker/services.yaml @@ -1,9 +1,9 @@ restart: - description: "Restart a container, the container must be configured in monitor_docker." fields: name: - description: Name of the container - example: "nodered" + required: true + selector: + text: server: - description: Name of the server, as given in config. Only required if you have more than one docker host config. - example: "mediaserver" + selector: + text: diff --git a/custom_components/monitor_docker/strings.json b/custom_components/monitor_docker/strings.json new file mode 100644 index 00000000..8c91f6fd --- /dev/null +++ b/custom_components/monitor_docker/strings.json @@ -0,0 +1,22 @@ +{ + "services": { + "reload": { + "name": "[%key:common::action::reload%]", + "description": "Reloads all monitor_docker entities." + }, + "restart": { + "name": "[%key:common::action::restart%]", + "description": "Restart a container, the container must be configured in monitor_docker.", + "fields": { + "name": { + "description": "Name of the container.", + "name": "Name" + }, + "server": { + "description": "Name of the server, as given in config. Only required if you have more than one docker host config.", + "name": "Server" + } + } + } + } +} diff --git a/custom_components/monitor_docker/switch.py b/custom_components/monitor_docker/switch.py index 5ed37a99..92fa755a 100644 --- a/custom_components/monitor_docker/switch.py +++ b/custom_components/monitor_docker/switch.py @@ -2,11 +2,18 @@ import asyncio import logging -import voluptuous as vol +import re +from typing import Any +import voluptuous as vol +from custom_components.monitor_docker.helpers import DockerAPI, DockerContainerAPI from homeassistant.components.switch import ENTITY_ID_FORMAT, SwitchEntity from homeassistant.const import CONF_NAME -from homeassistant.helpers import config_validation as cv, entity_platform +from homeassistant.core import HomeAssistant +from homeassistant.helpers import config_validation as cv +from homeassistant.helpers import entity_platform +from homeassistant.helpers.entity_platform import AddEntitiesCallback +from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from homeassistant.util import slugify from .const import ( @@ -17,6 +24,7 @@ CONF_CONTAINERS_EXCLUDE, CONF_PREFIX, CONF_RENAME, + CONF_RENAME_ENITITY, CONF_SWITCHENABLED, CONF_SWITCHNAME, CONFIG, @@ -31,11 +39,15 @@ _LOGGER = logging.getLogger(__name__) -async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): +async def async_setup_platform( + hass: HomeAssistant, + config: ConfigType, + async_add_entities: AddEntitiesCallback, + discovery_info: DiscoveryInfoType | None = None, +): """Set up the Monitor Docker Switch.""" - async def async_restart(parm): - + async def async_restart(parm) -> None: cname = parm.data[ATTR_NAME] cserver = parm.data.get(ATTR_SERVER, None) @@ -55,7 +67,7 @@ async def async_restart(parm): await server_api.get_container(cname).restart() else: _LOGGER.error( - "Service restart failed, container '%s'does not exist", cname + "Service restart failed, container '%s' does not exist", cname ) elif cname in server_config[CONF_CONTAINERS]: _LOGGER.debug("Trying to restart container '%s'", cname) @@ -70,13 +82,20 @@ async def async_restart(parm): "Service restart failed, container '%s' is not configured", cname ) + def find_rename(d: dict[str, str], item: str) -> str: + for k in d: + if re.match(k, item): + return d[k] + + return item + if discovery_info is None: return - instance = discovery_info[CONF_NAME] - name = discovery_info[CONF_NAME] - api = hass.data[DOMAIN][name][API] - config = hass.data[DOMAIN][name][CONFIG] + instance: str = discovery_info[CONF_NAME] + name: str = discovery_info[CONF_NAME] + api: DockerAPI = hass.data[DOMAIN][name][API] + config: ConfigType = hass.data[DOMAIN][name][CONFIG] # Set or overrule prefix prefix = name @@ -84,7 +103,7 @@ async def async_restart(parm): prefix = config[CONF_PREFIX] # Don't create any switch if disabled - if not config[CONF_SWITCHENABLED]: + if config[CONF_SWITCHENABLED] == False: _LOGGER.debug("[%s]: Switch(es) are disabled", instance) return True @@ -99,7 +118,6 @@ async def async_restart(parm): clist = api.list_containers() for cname in clist: - includeContainer = False if cname in config[CONF_CONTAINERS] or not config[CONF_CONTAINERS]: includeContainer = True @@ -108,18 +126,30 @@ async def async_restart(parm): includeContainer = False if includeContainer: - _LOGGER.debug("[%s] %s: Adding component Switch", instance, cname) - - switches.append( - DockerContainerSwitch( - api.get_container(cname), - instance, - prefix, - cname, - config[CONF_RENAME].get(cname, cname), - config[CONF_SWITCHNAME], + if ( + config[CONF_SWITCHENABLED] == True + or cname in config[CONF_SWITCHENABLED] + ): + _LOGGER.debug("[%s] %s: Adding component Switch", instance, cname) + + # Only force rename of entityid is requested, to not break backwards compatibility + alias_entityid = cname + if config[CONF_RENAME_ENITITY]: + alias_entityid = find_rename(config[CONF_RENAME], cname) + + switches.append( + DockerContainerSwitch( + api.get_container(cname), + instance=instance, + prefix=prefix, + cname=cname, + alias_entityid=alias_entityid, + alias_name=find_rename(config[CONF_RENAME], cname), + name_format=config[CONF_SWITCHNAME], + ) ) - ) + else: + _LOGGER.debug("[%s] %s: NOT Adding component Switch", instance, cname) if not switches: _LOGGER.info("[%s]: No containers set-up", instance) @@ -138,63 +168,71 @@ async def async_restart(parm): ################################################################# class DockerContainerSwitch(SwitchEntity): - def __init__(self, container, instance, prefix, cname, alias, name_format): - self._loop = asyncio.get_running_loop() + def __init__( + self, + container: DockerContainerAPI, + instance: str, + prefix: str, + cname: str, + alias_entityid: str, + alias_name: str, + name_format: str, + ): self._container = container self._instance = instance self._prefix = prefix self._cname = cname self._state = False - self._entity_id = ENTITY_ID_FORMAT.format( - slugify(self._prefix + "_" + self._cname) + self._entity_id: str = ENTITY_ID_FORMAT.format( + slugify(f"{self._prefix}_{alias_entityid}") ) - self._name = name_format.format(name=alias) + self._name = name_format.format(name=alias_name) self._removed = False @property - def entity_id(self): + def entity_id(self) -> str: """Return the entity id of the switch.""" return self._entity_id @property - def name(self): + def name(self) -> str: """Return the name of the sensor.""" return self._name @property - def should_poll(self): + def should_poll(self) -> bool: return False @property - def icon(self): + def icon(self) -> str: return "mdi:docker" @property - def extra_state_attributes(self): + def extra_state_attributes(self) -> dict: return {} @property - def is_on(self): + def is_on(self) -> bool: return self._state - async def async_turn_on(self): + async def async_turn_on(self, **kwargs: Any) -> None: await self._container.start() self._state = True self.async_schedule_update_ha_state() - async def async_turn_off(self): + async def async_turn_off(self, **kwargs: Any) -> None: await self._container.stop() self._state = False self.async_schedule_update_ha_state() - async def async_added_to_hass(self): + async def async_added_to_hass(self) -> None: """Register callbacks.""" self._container.register_callback(self.event_callback, "switch") # Call event callback for possible information available self.event_callback() - def event_callback(self, name="", remove=False): + def event_callback(self, name="", remove=False) -> None: """Callback for update of container information.""" if remove: @@ -203,7 +241,7 @@ def event_callback(self, name="", remove=False): return _LOGGER.info("[%s] %s: Removing switch entity", self._instance, self._cname) - self._loop.create_task(self.async_remove()) + asyncio.create_task(self.async_remove()) self._removed = True return diff --git a/custom_components/monitor_docker/translations/bg.json b/custom_components/monitor_docker/translations/bg.json new file mode 100644 index 00000000..b0071f15 --- /dev/null +++ b/custom_components/monitor_docker/translations/bg.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "\u0420\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u043d\u0435" + } + } +} diff --git a/custom_components/monitor_docker/translations/ca.json b/custom_components/monitor_docker/translations/ca.json new file mode 100644 index 00000000..f6ff39fa --- /dev/null +++ b/custom_components/monitor_docker/translations/ca.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Reinicia" + } + } +} diff --git a/custom_components/monitor_docker/translations/cs.json b/custom_components/monitor_docker/translations/cs.json new file mode 100644 index 00000000..fab6af4b --- /dev/null +++ b/custom_components/monitor_docker/translations/cs.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Restartovat" + } + } +} diff --git a/custom_components/monitor_docker/translations/de.json b/custom_components/monitor_docker/translations/de.json new file mode 100644 index 00000000..3dcdc4ed --- /dev/null +++ b/custom_components/monitor_docker/translations/de.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Neu starten" + } + } +} diff --git a/custom_components/monitor_docker/translations/el.json b/custom_components/monitor_docker/translations/el.json new file mode 100644 index 00000000..eef4a756 --- /dev/null +++ b/custom_components/monitor_docker/translations/el.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Restart" + } + } +} diff --git a/custom_components/monitor_docker/translations/en.json b/custom_components/monitor_docker/translations/en.json new file mode 100644 index 00000000..23ee3aa2 --- /dev/null +++ b/custom_components/monitor_docker/translations/en.json @@ -0,0 +1,22 @@ +{ + "services": { + "reload": { + "description": "Reloads all monitor_docker entities.", + "name": "Reload" + }, + "restart": { + "description": "Restart a container, the container must be configured in monitor_docker.", + "fields": { + "name": { + "description": "Name of the container.", + "name": "Name" + }, + "server": { + "description": "Name of the server, as given in config. Only required if you have more than one docker host config.", + "name": "Server" + } + }, + "name": "Restart" + } + } +} diff --git a/custom_components/monitor_docker/translations/es.json b/custom_components/monitor_docker/translations/es.json new file mode 100644 index 00000000..d6ffb10d --- /dev/null +++ b/custom_components/monitor_docker/translations/es.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Reiniciar" + } + } +} diff --git a/custom_components/monitor_docker/translations/et.json b/custom_components/monitor_docker/translations/et.json new file mode 100644 index 00000000..169f80dd --- /dev/null +++ b/custom_components/monitor_docker/translations/et.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Taask\u00e4ivita" + } + } +} diff --git a/custom_components/monitor_docker/translations/fi.json b/custom_components/monitor_docker/translations/fi.json new file mode 100644 index 00000000..015224ac --- /dev/null +++ b/custom_components/monitor_docker/translations/fi.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Uudelleenk\u00e4ynnist\u00e4" + } + } +} diff --git a/custom_components/monitor_docker/translations/fr.json b/custom_components/monitor_docker/translations/fr.json new file mode 100644 index 00000000..33124f19 --- /dev/null +++ b/custom_components/monitor_docker/translations/fr.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Red\u00e9marrer" + } + } +} diff --git a/custom_components/monitor_docker/translations/he.json b/custom_components/monitor_docker/translations/he.json new file mode 100644 index 00000000..1b4051c3 --- /dev/null +++ b/custom_components/monitor_docker/translations/he.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "\u05d4\u05e4\u05e2\u05dc\u05d4 \u05de\u05d7\u05d3\u05e9" + } + } +} diff --git a/custom_components/monitor_docker/translations/hu.json b/custom_components/monitor_docker/translations/hu.json new file mode 100644 index 00000000..008247e8 --- /dev/null +++ b/custom_components/monitor_docker/translations/hu.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "\u00dajraind\u00edt\u00e1s" + } + } +} diff --git a/custom_components/monitor_docker/translations/id.json b/custom_components/monitor_docker/translations/id.json new file mode 100644 index 00000000..4e3f97b7 --- /dev/null +++ b/custom_components/monitor_docker/translations/id.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Mulai Ulang" + } + } +} diff --git a/custom_components/monitor_docker/translations/it.json b/custom_components/monitor_docker/translations/it.json new file mode 100644 index 00000000..d9ed2afa --- /dev/null +++ b/custom_components/monitor_docker/translations/it.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Riavvia" + } + } +} diff --git a/custom_components/monitor_docker/translations/ja.json b/custom_components/monitor_docker/translations/ja.json new file mode 100644 index 00000000..d99065dd --- /dev/null +++ b/custom_components/monitor_docker/translations/ja.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "\u518d\u8d77\u52d5" + } + } +} diff --git a/custom_components/monitor_docker/translations/ko.json b/custom_components/monitor_docker/translations/ko.json new file mode 100644 index 00000000..e42b547a --- /dev/null +++ b/custom_components/monitor_docker/translations/ko.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "\uc7ac\uc2dc\uc791" + } + } +} diff --git a/custom_components/monitor_docker/translations/lt.json b/custom_components/monitor_docker/translations/lt.json new file mode 100644 index 00000000..8898a8cc --- /dev/null +++ b/custom_components/monitor_docker/translations/lt.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Perkrauti" + } + } +} diff --git a/custom_components/monitor_docker/translations/nb.json b/custom_components/monitor_docker/translations/nb.json new file mode 100644 index 00000000..0eeaa3f4 --- /dev/null +++ b/custom_components/monitor_docker/translations/nb.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Omstart" + } + } +} diff --git a/custom_components/monitor_docker/translations/nl.json b/custom_components/monitor_docker/translations/nl.json new file mode 100644 index 00000000..da970595 --- /dev/null +++ b/custom_components/monitor_docker/translations/nl.json @@ -0,0 +1,22 @@ +{ + "services": { + "reload": { + "description": "Herlaad alle monitor_docker entiteiten.", + "name": "Herladen" + }, + "restart": { + "description": "Herstart een container, deze container moet geconfigureerd zijn in monitor_docker.", + "fields": { + "name": { + "description": "Naam van de container.", + "name": "Name" + }, + "server": { + "description": "Naam van de server, zoals geconfigueerd in de config. Alleen vereist als je meer an 1 docker host in je configuratie hebt.", + "name": "Server" + } + }, + "name": "Herstarten" + } + } +} diff --git a/custom_components/monitor_docker/translations/pl.json b/custom_components/monitor_docker/translations/pl.json new file mode 100644 index 00000000..52094fbc --- /dev/null +++ b/custom_components/monitor_docker/translations/pl.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Uruchom ponownie" + } + } +} diff --git a/custom_components/monitor_docker/translations/pt-BR.json b/custom_components/monitor_docker/translations/pt-BR.json new file mode 100644 index 00000000..d6ffb10d --- /dev/null +++ b/custom_components/monitor_docker/translations/pt-BR.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Reiniciar" + } + } +} diff --git a/custom_components/monitor_docker/translations/pt.json b/custom_components/monitor_docker/translations/pt.json new file mode 100644 index 00000000..d6ffb10d --- /dev/null +++ b/custom_components/monitor_docker/translations/pt.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Reiniciar" + } + } +} diff --git a/custom_components/monitor_docker/translations/ru.json b/custom_components/monitor_docker/translations/ru.json new file mode 100644 index 00000000..aa96fcc1 --- /dev/null +++ b/custom_components/monitor_docker/translations/ru.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c" + } + } +} diff --git a/custom_components/monitor_docker/translations/sk.json b/custom_components/monitor_docker/translations/sk.json new file mode 100644 index 00000000..90f8708b --- /dev/null +++ b/custom_components/monitor_docker/translations/sk.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Re\u0161tart" + } + } +} diff --git a/custom_components/monitor_docker/translations/sv.json b/custom_components/monitor_docker/translations/sv.json new file mode 100644 index 00000000..e1b418a3 --- /dev/null +++ b/custom_components/monitor_docker/translations/sv.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Starta om" + } + } +} diff --git a/custom_components/monitor_docker/translations/tr.json b/custom_components/monitor_docker/translations/tr.json new file mode 100644 index 00000000..ce72512b --- /dev/null +++ b/custom_components/monitor_docker/translations/tr.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "Yeniden ba\u015flat" + } + } +} diff --git a/custom_components/monitor_docker/translations/zh-Hans.json b/custom_components/monitor_docker/translations/zh-Hans.json new file mode 100644 index 00000000..a7ce6649 --- /dev/null +++ b/custom_components/monitor_docker/translations/zh-Hans.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "\u91cd\u65b0\u5f00\u59cb" + } + } +} diff --git a/custom_components/monitor_docker/translations/zh-Hant.json b/custom_components/monitor_docker/translations/zh-Hant.json new file mode 100644 index 00000000..72d16d75 --- /dev/null +++ b/custom_components/monitor_docker/translations/zh-Hant.json @@ -0,0 +1,7 @@ +{ + "services": { + "restart": { + "name": "\u91cd\u65b0\u958b\u59cb" + } + } +} diff --git a/extras/Node-RED/flows.json b/extras/Node-RED/flows.json index b4faef9a..0f073d4c 100644 --- a/extras/Node-RED/flows.json +++ b/extras/Node-RED/flows.json @@ -1 +1 @@ -[{"id":"9584418c.dafc2","type":"tab","label":"Automations","disabled":false,"info":""},{"id":"f602e6ba.609d28","type":"tab","label":"Irrigation","disabled":false,"info":""},{"id":"9cfe6331fbc680d5","type":"group","z":"9584418c.dafc2","name":"Delivery Logo Object Detection","style":{"label":true},"nodes":["ed80a3f.522526","f3a3e80f.3e8e38","6f08d11c854dfb00","9b7c5535c74a94a3","d8a16fd91366d112","bcaf3569e7816922","d58f6ef71c326040","42be35f83b764861","b2a5543693ac851e","c13f0f20a56d6af5","7151828122e3b80c","bace446bfa7b343d","5acbb2cbdbdea368","c061be05c01527e0","e263410e9a3af7d8","d9e9a93275328762","a12e93d199527cae","b4b8f84a.7e57a8","63fd5090444c9cad","2dfdead1d2e3b78b","c1fe21bcb3184137"],"x":54,"y":2099,"w":1372,"h":322},{"id":"3c4349a7eea9bd3b","type":"group","z":"9584418c.dafc2","name":"Set Cameras Online","style":{"label":true},"nodes":["bd19a17005513c2f","24d1a94e275e5e44","58d0c98797e19829","7a8e43b6f7c84bac","ab66afa5b576de3f","ccf5998fdf8ee50d"],"x":54,"y":1839,"w":492,"h":242},{"id":"35da177d9e2fd258","type":"group","z":"9584418c.dafc2","name":"Virtual Radar Server","style":{"label":true},"nodes":["a9a323de66b6f772","ee139512bcad0966","7da69a7e8ecadc7c","26e32b1d7824356a","3a82b835.c57d48","91afebbf8b9edf05","5684b08aacd6d225","4ca1a5ad47ce7a18","ba68e03143ba4af8","5f1d1b471a1c7cbb","2cd08c8da06afaf6","ea911291f04c7d18","43e5fa289c7550ff","97761f13f8e5c31b","ea239028eda07991"],"x":54,"y":1499,"w":1272,"h":322},{"id":"bd2acc7efb5be5fd","type":"group","z":"9584418c.dafc2","name":"Front Porch Light Occupancy Brightness","style":{"label":true},"nodes":["3f2a2e4d99057b69","3e399d83e4e7f4c3","59f5bc2571b0f12f","c68c969a6b8c2833","b1a99d9698d831b2","17b35d69307a8455","d11c183fff8d848d","fae7fa701710e258","1ef176bec8ed5da0","254a48eabb9cf476"],"x":54,"y":1279,"w":1092,"h":202},{"id":"11e25fc28c23144c","type":"group","z":"9584418c.dafc2","name":"Front House Lights","style":{"label":true},"nodes":["86bc310cbc0562af","2fb6a7afb6502a32","8c55985bffebd56a"],"x":54,"y":1119,"w":472,"h":142},{"id":"b808f2d7ae539c87","type":"group","z":"9584418c.dafc2","name":"Indoor Lights Dim Evening","style":{"label":true},"nodes":["e93027cb.6a6308","fc81cfda.29ff5","8ee35d65.a7569","41b918d5.7ce018","5420f9c0.5356c8","77184c93.8790d4","39a5ce57.78e3d2","ea19fe14.80749","ea2604f9.4cdf98","8a82f465.846018","d8ad0651.bf7a18","d9cc182cc3eb2a93","cde7b3c9ca39891b","1457bf6605a50448","fa90c550.d6c948"],"x":54,"y":659,"w":1073,"h":444},{"id":"9df353d4c0fc9a54","type":"group","z":"9584418c.dafc2","name":"Server Rack Temperature","style":{"label":true},"nodes":["73550501.be7fbc","7dff3ae1.e36a04","88822bfe.2cc598","96b5207d.407dd","b259f0eb.3e83","c7ff978f.ff0728","29b17ed7.fab972"],"x":54,"y":459,"w":932,"h":182},{"id":"18fe74aea06a1180","type":"group","z":"9584418c.dafc2","name":"AC Stale Air","style":{"label":true},"nodes":["ebe84a6f70b4bc2f","cf1c689e51b98aec","6af7abba85612dd9","8b6280c5c448720c","9ce46ce21d8cc964","2b6721107586ceae","830c3ddd08ef396c"],"x":54,"y":299,"w":1132,"h":142},{"id":"cf3a0410bcf837ae","type":"group","z":"9584418c.dafc2","name":"Door Alerts","style":{"label":true},"nodes":["2022689a.938918","8ec438b6.4eb2e8","9c1d9c7c.ed9c7","896f5b34.7b4328","c5124616.c9bd48","f9d93af6.184028","3314ec9f.ca8994","5c24f744.30fcb8","6aa388d0.707768","cf758271.d4fd6","5a740c2d.009864","c5c85c0aa2d8c8ca","28fa66cd.af058a","aee87977a0670889"],"x":54,"y":19,"w":1012,"h":262},{"id":"3cf0491ac33aecfa","type":"group","z":"f602e6ba.609d28","name":"Max Time and Master Valve Control","style":{"label":true},"nodes":["54bad548.7e9fcc","5a10cd93.8e94b4","a77808ff.3f1288","54ae6ec3.1bc63","bcbf413e.7b188","3b848bce.76aea4","43dedcca.ac7734","c42e6d62.7a24c","cdd3b7ef.04a618","63f07877e73b952a","5e9007a27732bba9","061b74f643477dd9","749afd72791a5127","656ad2cd6fb99f57"],"x":54,"y":19,"w":1532,"h":222},{"id":"43a30fe5a5052c22","type":"group","z":"f602e6ba.609d28","name":"Custom Water","style":{"label":true},"nodes":["d269f175.c9dc6","3367e45f.cc981c","116d5bb3.ee92a4","80df47d5.602888","fb46876c.845298","98eeafa7.bd2b9","565ee5c1.561bfc","22a20603.86a06a","a8d96e.1f00969","808e6a81.92e2e8","883f2c00.1d94e8","e42ff3d9.593dc","76160bc4.8cd644","e2c37b65c5582c2b","860a4c61d7557dc9"],"x":54,"y":259,"w":1452,"h":262},{"id":"a9182c2cc04d2d9a","type":"group","z":"f602e6ba.609d28","name":"Irrigation Delays","style":{"label":true},"nodes":["dd9855ca4017c8c0","c3a696a117416327","27f2580e35031830","9cb8187c669c6485","47f1a8018e58e032","427f7fa58d86cc59","1d9a4d0bb4645f32","d9ebbaa37f5911a9","eeecfc1e8864e39f","89487a4efedec1db","1e4b3bc7c25b294f","2c45af5b3ee5cf0a","d7e50e7a2810667d","28936ec687ee4eb0","974833b6a2eca853","478a5a84d38ba181","c01fd0612615e927","93965a61d2c4f5de","c3cb1c7d15767014"],"x":54,"y":539,"w":752,"h":502},{"id":"0f07749a4e1672ad","type":"group","z":"f602e6ba.609d28","name":"Supply Voltage Control","style":{"label":true},"nodes":["1ae21386.a831bc","117145a7.67e99a","882aff35f788008b"],"x":54,"y":1059,"w":472,"h":142},{"id":"a08dae6118c91c19","type":"group","z":"f602e6ba.609d28","name":"Run Lawn","style":{"label":true},"nodes":["f2c9c3a5b8b11a64","9896327569c234da","e95ac52f03478921","174186fb5d054240","287dd3b1af5dc2d0","74cd40702021e86d","bf015af2161c5ec2","151eb6ba5b2d39cd","45ee74d06e9cac2c","95a54981805b22f2","a4b3eba196a504dc","02d1e639f7ac6596","8d3c8370996be2da","863b8fa63f210ebe","7d8374976c01e3dc","b0debe46542c4c67","de509d99b9d965b3","b1c9631973c2f4b1","6ea0448df1383ec2","224d30a98f52c287","5a27d31bfb4a6990","197853479ad9eeda","7b985932412db47d","acdcc72fea065aac","38affe5cc680d076"],"x":54,"y":2019,"w":1272,"h":522},{"id":"79694877249c9902","type":"group","z":"f602e6ba.609d28","name":"Attempt Lawn","style":{"label":true},"nodes":["3b656b89.1ac154","493b435f.c9851c","7b12e66f.57d068","8c060f00.cf577","4422f61c.847d88","dcdeabc7.780578","722d03d6.2ff77c","af4788fe.215ba8","c90fd5e6.c5c678","862ad27a.d347d","83edf648.3f9ed8","8d4bfe8e.ee805","815fddc0.6604c","06d6255efdc31c47","5420d0eed32223fb","3ff9ce03ef7b554b","576b66fa1bd202a3","a3d75225807b70eb","219b37105a8304f1","e7430e17f0b24ed8","b6e7d5b8891bba6d","339ee0ada21856e0","d01fbafafbb34692","f5684be88477322f","336585d4eee0ca73","b3c4a3638c17629e","2fc67b25514de5a5","08e3098cf183e086"],"x":54,"y":1219,"w":672,"h":782},{"id":"68ec980b932fdba7","type":"group","z":"f602e6ba.609d28","name":"Attempt Front Beds","style":{"label":true},"nodes":["583f46a3.fc4c38","d9147878.b61cf8","c7e5552e.7f8a08","6bcf06fb.9ca748","f587589f.d739e8","d9d17e8f.590e6","d9f893eb.834f3","9d851699.6a8458","4fae5b92.a9cd44","418058c4.af3158","7350c911a0b1a86d","fdcfa1521191fa40","4f2902edc77f2d3b","f6881b4bf93c27c5","ed6e3d4225582e20","593bee0e8c958df8","67916c3a5554a794","f7ac7a90f3da2298","45c5dbbbd8ce50a1","abb8777dd08aa743","d8637d8d96b68fca","b403eec7866aea22"],"x":54,"y":2559,"w":672,"h":582},{"id":"55a2162532da4e14","type":"group","z":"f602e6ba.609d28","name":"Run Front Beds","style":{"label":true},"nodes":["a2ab7368.923fb","a31e3daf.17207","21ced698.708b5a","c661d489.9c9bc8","accc6697.196268","487ff788.8c5c98","2238b09b.1b5b5","84258ddd.41da4","9129b06e.d8925","5ce1803b.06628","aa53225140781dd7","8113d83074ff7701","d83b5ff7a2212931","f78cdb84200eb171","62b5545bc6d6e627"],"x":54,"y":3159,"w":1332,"h":262},{"id":"59ea88a27ef998e7","type":"group","z":"9584418c.dafc2","name":"Drone Delivery Logo Object Detection","style":{"label":true},"nodes":["4e2d750742dc8890","cdc9c2c982e3fe5f","300267d7c89b0955","1ae58f8afe36e04c","5c59c5c412e759ce","aa523c5cbfe26949","b4392caec775b305","81d6e9a99eb61c67","8bec0433aa6e51fa","1aa9e39b6be88864","ec51454057c055e2","765c7c5a61100728","1bda1e8b7f76e5f3","14855ff357d5fbad","a95b4fa60f1238d7","081d788e92e34986","9799e777bb06f63f","6d56b297fcfe0016","2f18405339079200","b4d7bb6e129bacea","b442c20392c7ce60","ec6b4698123ebc34"],"x":54,"y":2439,"w":1412,"h":282},{"id":"cb7e3560a0078392","type":"group","z":"9584418c.dafc2","name":"Global Entry Schedule","style":{"label":true},"nodes":["5123f652827fa902","970920516fa379e8","51f2291060d07336","91d3d26774f9468e","7415468104c18108","b8a4a1ee4e15f778","79c00f8c61888f52","a61d605915dc23ff","c44a5c4d6d17ee9f","fa9f2ef8fecf1de2","7d01abce7bc68291","b7c50947c4507d03","1480d9470754a6a3","ca8d58af48d7b7c5","414a38bf0735b27c","c0546e86d17e99e9","d5ab0aa6d198ba81","88d3b091fc333998","1b266e9b338a4dfe","85644b2ab18e7141","041a81d375ec985d","bfbece91f0b61e8b","f3b23466b80725e0"],"x":54,"y":2739,"w":1102,"h":342},{"id":"26b2ac79d4c32bda","type":"group","z":"9584418c.dafc2","name":"Timelapse","style":{"label":true},"nodes":["83e2179938d08d58","59e4459459f077c9","089b07fa48286f29","7ff9bf1a917cbf50","a826a8c498d6d1e3"],"x":54,"y":3099,"w":612,"h":262},{"id":"6f393a92ae952332","type":"group","z":"9584418c.dafc2","name":"Faucet Auto Drip","style":{"label":true},"nodes":["08b26d8311cd9187","716e8fabff85ffb9","7b988b93a658f526","7fe1e564efbd46af","16e1a3e2f53e6bdf","d85faf19968afde1"],"x":54,"y":3379,"w":1032,"h":202},{"id":"e28fc796ce042622","type":"group","z":"9584418c.dafc2","name":"Generic Listener to Push Notifications from SMTP Inbox","style":{"label":true},"nodes":["7eb1a3d60fccbc76","cb1f141562c8fd2b","1cd709e001bf5e89","7f48460e08988c9e","24fc1882c8436738"],"x":54,"y":3599,"w":892,"h":142},{"id":"e1dc0b88.463bb8","type":"server","name":"Home Assistant","version":5,"addon":false,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":false,"cacheJson":true,"heartbeat":true,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true},{"id":"546e31ed.0db1c","type":"mqtt-broker","name":"Mosquitto","broker":"10.0.1.22","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"9f81fd881d01a666","type":"position-config","name":"","isValide":"true","longitude":"0","latitude":"0","angleType":"deg","timeZoneOffset":"99","timeZoneDST":"0","stateTimeFormat":"3","stateDateFormat":"12","contextStore":""},{"id":"4f8f8feffed26998","type":"sqlitedb","db":"/data/amazon.db","mode":"RWC"},{"id":"96b8babe5c0a6107","type":"deepstack-server","proto":"http","host":"codeproject","port":"32168","version":"v1","rejectUnauthorized":true},{"id":"27555ce732fc54b0","type":"global-config","name":"global-config","env":[{"name":"bb_pass","value":"PASSWORD","type":"str"},{"name":"bb_number","value":"19402326788","type":"str"}]},{"id":"2022689a.938918","type":"api-call-service","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Notify Via Wrapper: Opened 1 Minute","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"script","service":"notify_wrapper","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": \"The \" & $lowercase(msg.data.new_state.attributes.friendly_name) & \" has been opened for 1 minute\"\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":890,"y":120,"wires":[[]]},{"id":"8ec438b6.4eb2e8","type":"api-current-state","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Door Notify On","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"true","halt_if_type":"bool","halt_if_compare":"is","entity_id":"input_boolean.door_notify","state_type":"habool","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":360,"y":60,"wires":[["c5124616.c9bd48"],[]]},{"id":"9c1d9c7c.ed9c7","type":"change","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Reset If Closed","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":360,"y":220,"wires":[["5c24f744.30fcb8","cf758271.d4fd6","5a740c2d.009864","28fa66cd.af058a"]]},{"id":"896f5b34.7b4328","type":"api-call-service","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Notify Via Wrapper","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"script","service":"notify_wrapper","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": payload, \"data\": {\"priority\": 1} \t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":950,"y":60,"wires":[[]]},{"id":"c5124616.c9bd48","type":"template","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Opened","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{{ data.new_state.attributes.friendly_name }} opened","output":"str","x":740,"y":60,"wires":[["896f5b34.7b4328"]]},{"id":"f9d93af6.184028","type":"server-state-changed","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Door Opened","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"binary_sensor.*_door$","entityIdType":"regex","outputInitially":false,"stateType":"habool","ifState":"true","ifStateType":"bool","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":150,"y":100,"wires":[["8ec438b6.4eb2e8","5c24f744.30fcb8","cf758271.d4fd6","5a740c2d.009864","28fa66cd.af058a"],["9c1d9c7c.ed9c7"]]},{"id":"73550501.be7fbc","type":"trigger-state","z":"9584418c.dafc2","d":true,"g":"9df353d4c0fc9a54","name":"Rack Temperature","server":"e1dc0b88.463bb8","version":4,"inputs":1,"outputs":2,"exposeAsEntityConfig":"","entityId":"sensor.rack_exhaust_temperature","entityIdType":"exact","debugEnabled":false,"constraints":[],"customOutputs":[],"outputInitially":false,"stateType":"num","enableInput":true,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"x":170,"y":560,"wires":[["7dff3ae1.e36a04"],[]]},{"id":"7dff3ae1.e36a04","type":"switch","z":"9584418c.dafc2","g":"9df353d4c0fc9a54","name":"Above 90?","property":"payload","propertyType":"msg","rules":[{"t":"gt","v":"95","vt":"num"},{"t":"lte","v":"90","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":350,"y":560,"wires":[["29b17ed7.fab972"],["96b5207d.407dd"]]},{"id":"88822bfe.2cc598","type":"api-call-service","z":"9584418c.dafc2","g":"9df353d4c0fc9a54","name":"Turn on Fan","server":"e1dc0b88.463bb8","version":5,"domain":"homeassistant","service":"turn_on","areaId":[],"deviceId":[],"entityId":["fan.rack_fan"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":true,"outputProperties":[],"queue":"none","x":710,"y":500,"wires":[[]]},{"id":"96b5207d.407dd","type":"api-current-state","z":"9584418c.dafc2","g":"9df353d4c0fc9a54","name":"Rack Fan","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"true","halt_if_type":"bool","halt_if_compare":"is","entity_id":"fan.rack_fan","state_type":"habool","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":540,"y":580,"wires":[["c7ff978f.ff0728"],[]]},{"id":"b259f0eb.3e83","type":"api-call-service","z":"9584418c.dafc2","g":"9df353d4c0fc9a54","name":"Turn off fan","server":"e1dc0b88.463bb8","version":5,"domain":"homeassistant","service":"turn_off","areaId":[],"deviceId":[],"entityId":["fan.rack_fan"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":true,"outputProperties":[],"queue":"none","x":890,"y":540,"wires":[[]]},{"id":"e93027cb.6a6308","type":"api-current-state","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"Master Bedroom Lamps On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.master_bedroom_lamps","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":680,"y":702,"wires":[["fc81cfda.29ff5"],[]]},{"id":"fc81cfda.29ff5","type":"api-call-service","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"Set brightness to 128","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":[],"data":"{\"brightness\":\"128\",\"transition\":5, \"entity_id\": msg.data.entity_id}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1001,"y":700,"wires":[[]]},{"id":"c7ff978f.ff0728","type":"api-current-state","z":"9584418c.dafc2","g":"9df353d4c0fc9a54","name":"Rack fan auto off?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.rack_fan_auto_off","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":730,"y":600,"wires":[["b259f0eb.3e83"],[]]},{"id":"29b17ed7.fab972","type":"api-current-state","z":"9584418c.dafc2","g":"9df353d4c0fc9a54","name":"Rack Fan","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"true","halt_if_type":"bool","halt_if_compare":"is","entity_id":"fan.rack_fan","state_type":"habool","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":540,"y":520,"wires":[[],["88822bfe.2cc598"]]},{"id":"3314ec9f.ca8994","type":"server-state-changed","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Garage Opened","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"cover.garage_door","entityIdType":"regex","outputInitially":false,"stateType":"str","ifState":"open","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":160,"y":160,"wires":[["8ec438b6.4eb2e8"],[]]},{"id":"8ee35d65.a7569","type":"api-current-state","z":"9584418c.dafc2","d":true,"g":"b808f2d7ae539c87","name":"Kitchen Cans On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.kitchen_can_lights","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":650,"y":942,"wires":[["5420f9c0.5356c8"],[]]},{"id":"41b918d5.7ce018","type":"api-current-state","z":"9584418c.dafc2","d":true,"g":"b808f2d7ae539c87","name":"Kitchen Table On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.kitchen_table_light","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":650,"y":1062,"wires":[["d8ad0651.bf7a18"],[]]},{"id":"5420f9c0.5356c8","type":"api-call-service","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"Set brightness to 40","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":[],"data":"{\"brightness\":\"40\",\"transition\": \"5\", \"entity_id\": msg.data.entity_id}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1000,"y":842,"wires":[[]]},{"id":"77184c93.8790d4","type":"api-current-state","z":"9584418c.dafc2","d":true,"g":"b808f2d7ae539c87","name":"Kitchen Sink On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.kitchen_sink_light","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":650,"y":882,"wires":[["5420f9c0.5356c8"],[]]},{"id":"39a5ce57.78e3d2","type":"api-current-state","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"Living Room Cans On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.living_room_can_lights","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":670,"y":822,"wires":[["5420f9c0.5356c8"],[]]},{"id":"5c24f744.30fcb8","type":"trigger","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Wait 5m","op1":"","op2":"5","op1type":"nul","op2type":"str","duration":"5","extend":false,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":620,"y":160,"wires":[["6aa388d0.707768","aee87977a0670889"]]},{"id":"6aa388d0.707768","type":"api-call-service","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Alexa Announce Opened","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"alexa_media","areaId":[],"deviceId":[],"entityId":[],"data":"{\"message\":\"The\" & $lowercase(msg.data.new_state.attributes.friendly_name) & \"has been opened for\" & msg.payload & \" minutes.\",\"data\":{\"method\":\"all\",\"type\":\"announce\"},\"target\":[\"Office\",\"Kitchen\",\"Master\",\"Living Room\"]}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":850,"y":220,"wires":[[]]},{"id":"cf758271.d4fd6","type":"trigger","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Wait 10m","op1":"","op2":"10","op1type":"nul","op2type":"str","duration":"10","extend":false,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":620,"y":200,"wires":[["6aa388d0.707768"]]},{"id":"5a740c2d.009864","type":"trigger","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Wait 15m","op1":"","op2":"15","op1type":"nul","op2type":"str","duration":"15","extend":false,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":620,"y":240,"wires":[["6aa388d0.707768"]]},{"id":"ea19fe14.80749","type":"api-current-state","z":"9584418c.dafc2","d":true,"g":"b808f2d7ae539c87","name":"Entryway On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.entryway_light","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":640,"y":1002,"wires":[["5420f9c0.5356c8"],[]]},{"id":"ea2604f9.4cdf98","type":"api-current-state","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"Living Room Sconces On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.living_room_sconces","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":680,"y":762,"wires":[["fc81cfda.29ff5"],[]]},{"id":"8a82f465.846018","type":"comment","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"100% = 255","info":"","x":970,"y":773,"wires":[]},{"id":"d8ad0651.bf7a18","type":"api-call-service","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"Set brightness to 80","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":[],"data":"{\"brightness\":\"80\",\"transition\": \"5\", \"entity_id\": msg.data.entity_id}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1000,"y":922,"wires":[[]]},{"id":"86bc310cbc0562af","type":"inject","z":"9584418c.dafc2","g":"11e25fc28c23144c","name":"At 10:30PM","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"30 22 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":170,"y":1200,"wires":[["2fb6a7afb6502a32","8c55985bffebd56a"]]},{"id":"2fb6a7afb6502a32","type":"api-call-service","z":"9584418c.dafc2","g":"11e25fc28c23144c","name":"Front Porch Lights Off","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_off","areaId":[],"deviceId":[],"entityId":["light.front_porch_lights"],"data":"{ \"transition\": 5 }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":400,"y":1220,"wires":[[]]},{"id":"3f2a2e4d99057b69","type":"server-state-changed","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Front Door Motion","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"binary_sensor.front_door_all_occupancy","entityIdType":"exact","outputInitially":false,"stateType":"habool","ifState":"true","ifStateType":"bool","ifStateOperator":"is","outputOnlyOnStateChange":false,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":170,"y":1380,"wires":[["17b35d69307a8455","d11c183fff8d848d"],[]]},{"id":"3e399d83e4e7f4c3","type":"api-call-service","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Front Porch Lights to 254","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":["light.front_porch_lights"],"data":"{\"brightness\":\"254\",\"transition\":2}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":710,"y":1360,"wires":[["1ef176bec8ed5da0","59f5bc2571b0f12f"]]},{"id":"59f5bc2571b0f12f","type":"delay","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"","pauseType":"delay","timeout":"60","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":560,"y":1440,"wires":[["c68c969a6b8c2833"]]},{"id":"c68c969a6b8c2833","type":"api-call-service","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Front Porch Lights Off","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_off","areaId":[],"deviceId":[],"entityId":["light.front_porch_lights"],"data":"{ \"transition\": 5 }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":780,"y":1440,"wires":[["254a48eabb9cf476"]]},{"id":"d9cc182cc3eb2a93","type":"inject","z":"9584418c.dafc2","d":true,"g":"b808f2d7ae539c87","name":"At 10 PM","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 22 * * 3","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":160,"y":742,"wires":[["1457bf6605a50448"]]},{"id":"b1a99d9698d831b2","type":"server-state-changed","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Front Door Open","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"binary_sensor.front_door","entityIdType":"exact","outputInitially":false,"stateType":"habool","ifState":"true","ifStateType":"bool","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":160,"y":1440,"wires":[["17b35d69307a8455","d11c183fff8d848d"],[]]},{"id":"17b35d69307a8455","type":"within-time-switch","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"","nameInt":"","positionConfig":"9f81fd881d01a666","startTime":"22:30","startTimeType":"entered","startOffset":0,"startOffsetType":"none","startOffsetMultiplier":60000,"endTime":"sunriseStart","endTimeType":"pdsTime","endOffset":"-30","endOffsetType":"num","endOffsetMultiplier":60000,"timeRestrictions":0,"timeRestrictionsType":"none","timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","propertyStart":"","propertyStartType":"none","propertyStartCompare":"true","propertyStartThreshold":"","propertyStartThresholdType":"num","startTimeAlt":"","startTimeAltType":"entered","startOffsetAlt":0,"startOffsetAltType":"none","startOffsetAltMultiplier":60000,"propertyEnd":"","propertyEndType":"none","propertyEndCompare":"true","propertyEndThreshold":"","propertyEndThresholdType":"num","endTimeAlt":"","endTimeAltType":"entered","endOffsetAlt":0,"endOffsetAltType":"none","endOffsetAltMultiplier":60000,"withinTimeValue":"","withinTimeValueType":"msgInput","outOfTimeValue":"","outOfTimeValueType":"msgInput","tsCompare":"0","x":400,"y":1380,"wires":[["3e399d83e4e7f4c3"],[]]},{"id":"d11c183fff8d848d","type":"change","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Reset","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":350,"y":1440,"wires":[["59f5bc2571b0f12f"]]},{"id":"a9a323de66b6f772","type":"http request","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Get Aircraft","method":"GET","ret":"obj","paytoqs":"ignore","url":"http://vrs:8080/VirtualRadar/AircraftList.json","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"Content-Type","valueType":"other","valueValue":"application/json"}],"x":610,"y":1660,"wires":[["7da69a7e8ecadc7c","91afebbf8b9edf05","4ca1a5ad47ce7a18","2cd08c8da06afaf6","43e5fa289c7550ff"]]},{"id":"ee139512bcad0966","type":"inject","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Every 20 Seconds","props":[],"repeat":"20","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":190,"y":1660,"wires":[["ea239028eda07991"]]},{"id":"7da69a7e8ecadc7c","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Amazon","func":"var alert = {}\nvar message = \"Airborne:\\n\"\n\nfor (var i = 0; i < msg.payload.acList.length; i++) {\n if (typeof msg.payload.acList[i].Reg !== \"undefined\" && typeof msg.payload.acList[i].Man !== \"undefined\") {\n if (msg.payload.acList[i].Man.toLowerCase().includes(\"amazon\")) {\n //if (msg.payload.acList[i].Reg.endsWith(\"PA\") && msg.payload.acList[i].Man.toLowerCase().includes(\"amazon\")) {\n alert[msg.payload.acList[i].Reg] = msg.payload.acList[i].Icao\n }\n }\n}\n\nif (Object.keys(alert).length > 0) {\n for (const [key, value] of Object.entries(alert)) {\n message += key + \": https://globe.adsbexchange.com/?icao=\" + value + \"\\n\"\n }\n return { payload: message + \"https://vrs.aneis.ch\" }\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":780,"y":1660,"wires":[["5684b08aacd6d225"]]},{"id":"26e32b1d7824356a","type":"api-call-service","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Notify Via Signal","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"signal_adsb","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": payload \t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1200,"y":1660,"wires":[[]]},{"id":"3a82b835.c57d48","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Rate Limiter","func":"var interval = (1000*60*10); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1010,"y":1600,"wires":[["26e32b1d7824356a"]]},{"id":"91afebbf8b9edf05","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Interesting Tail #","func":"var alert = {}\nvar message = \"Interesting:\\n\"\n// N518GS George Strait\n// N628TS Elon\n// N898TS Taylor Swift\n// N621MM Taylor Swift\n// 82-8000 AF1\n// 92-9000 AF1\n// N5DA Don Adams Prop\n// N4DA Don Adams Lear\n// N68885 Zuckerberg\n// N681JK JB\n// N635PA\n// N628PA\n// N636PA\nvar interesting = [\"N68885\", \"N518GS\", \"N628TS\", \"82-8000\", \"92-9000\", \"N621MM\", \"N898TS\", \"N681JK\", \"N635PA\", \"N628PA\", \"N636PA\"]\n\nfor (var i = 0; i < msg.payload.acList.length; i++) {\n if (typeof msg.payload.acList[i].Reg !== \"undefined\") {\n if (interesting.includes(msg.payload.acList[i].Reg)) {\n alert[msg.payload.acList[i].Reg] = msg.payload.acList[i].Icao\n }\n }\n}\n\nif (Object.keys(alert).length > 0) {\n for (const [key, value] of Object.entries(alert)) {\n message += key + \": https://globe.adsbexchange.com/?icao=\" + value + \"\\n\"\n }\n return { payload: message + \"https://vrs.aneis.ch\" }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":1600,"wires":[["3a82b835.c57d48"]]},{"id":"5684b08aacd6d225","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Rate Limiter","func":"var interval = (1000*60); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1010,"y":1660,"wires":[["26e32b1d7824356a"]]},{"id":"4ca1a5ad47ce7a18","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Amazon Landing","func":"var alert = {}\nvar message = \"Landing:\\n\"\n\nfor (var i = 0; i < msg.payload.acList.length; i++) {\n if (typeof msg.payload.acList[i].Reg !== \"undefined\" && typeof msg.payload.acList[i].Man !== \"undefined\") {\n //if (msg.payload.acList[i].Reg.endsWith(\"PA\") && msg.payload.acList[i].Man.toLowerCase().includes(\"amazon\")) {\n if (msg.payload.acList[i].Man.toLowerCase().includes(\"amazon\")) {\n if (msg.payload.acList[i].Alt < 50){\n alert[msg.payload.acList[i].Reg] = msg.payload.acList[i].Icao\n }\n }\n }\n}\n\nif (Object.keys(alert).length > 0) {\n for (const [key, value] of Object.entries(alert)) {\n message += key + \": https://globe.adsbexchange.com/?icao=\" + value + \"\\n\"\n }\n return { payload: message + \"https://vrs.aneis.ch\" }\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":810,"y":1720,"wires":[["ba68e03143ba4af8"]]},{"id":"ba68e03143ba4af8","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Rate Limiter","func":"var interval = (1000*60); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1010,"y":1720,"wires":[["26e32b1d7824356a"]]},{"id":"5f1d1b471a1c7cbb","type":"sqlite","z":"9584418c.dafc2","g":"35da177d9e2fd258","mydb":"4f8f8feffed26998","sqlquery":"msg.topic","sql":"","name":"Amazon","x":1000,"y":1780,"wires":[["ea911291f04c7d18"]]},{"id":"2cd08c8da06afaf6","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Write Amazon Landing","func":"var sql = \"\"\n\nfor (var i = 0; i < msg.payload.acList.length; i++) {\n var latlong = \"0,0\"\n if (typeof msg.payload.acList[i].Reg !== \"undefined\" && typeof msg.payload.acList[i].Lat !== \"undefined\" && typeof msg.payload.acList[i].Long !== \"undefined\") {\n //if (msg.payload.acList[i].Reg.endsWith(\"PA\") && msg.payload.acList[i].Man.toLowerCase().includes(\"amazon\")) {\n if (msg.payload.acList[i].Man.toLowerCase().includes(\"amazon\")) {\n if (msg.payload.acList[i].Alt < 50){\n latlong = msg.payload.acList[i].Lat + \",\" + msg.payload.acList[i].Long.toString()\n sql += `INSERT INTO deliveries (timestamp, registration, latlong, altitude) VALUES (\"${Date.now()}\", \"${msg.payload.acList[i].Reg}\", \"${latlong}\", \"${msg.payload.acList[i].Alt}\"); `\n }\n }\n }\n}\n\nif (sql.length > 0){\n msg.topic = sql\n return msg;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":820,"y":1780,"wires":[["5f1d1b471a1c7cbb"]]},{"id":"ea911291f04c7d18","type":"api-call-service","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Generate Heatmap","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"shell_command","service":"generate_heatmap","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1210,"y":1780,"wires":[[]]},{"id":"cde7b3c9ca39891b","type":"link in","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"","links":["1457bf6605a50448"],"x":325,"y":722,"wires":[["e93027cb.6a6308","ea2604f9.4cdf98","39a5ce57.78e3d2","77184c93.8790d4","8ee35d65.a7569","ea19fe14.80749","41b918d5.7ce018"]]},{"id":"1457bf6605a50448","type":"link out","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"","links":["cde7b3c9ca39891b"],"x":295,"y":722,"wires":[]},{"id":"8c55985bffebd56a","type":"api-call-service","z":"9584418c.dafc2","g":"11e25fc28c23144c","name":"Front Sconces Off","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_off","areaId":[],"deviceId":[],"entityId":["light.front_sconces"],"data":"{ \"transition\": 5 }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":390,"y":1160,"wires":[[]]},{"id":"fae7fa701710e258","type":"server-state-changed","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Front Door Unlock","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"lock.front_door","entityIdType":"exact","outputInitially":false,"stateType":"str","ifState":"unlocked","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":false,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":170,"y":1320,"wires":[["17b35d69307a8455","d11c183fff8d848d"],[]]},{"id":"ebe84a6f70b4bc2f","type":"inject","z":"9584418c.dafc2","g":"18fe74aea06a1180","name":"Every 30 Minutes","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"1800","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":190,"y":340,"wires":[["830c3ddd08ef396c"]]},{"id":"cf1c689e51b98aec","type":"api-current-state","z":"9584418c.dafc2","g":"18fe74aea06a1180","name":"Thermostat Idle","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"Idle","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.thermostat_state","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":440,"y":340,"wires":[["6af7abba85612dd9"],[]]},{"id":"6af7abba85612dd9","type":"function","z":"9584418c.dafc2","g":"18fe74aea06a1180","name":"Idle > 2 hours","func":"// If last changed > 3 hours\nif (parseInt(msg.payload.timeSinceChangedMs) > 3600000*2) {\n return msg;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":560,"y":400,"wires":[["8b6280c5c448720c"]]},{"id":"8b6280c5c448720c","type":"api-call-service","z":"9584418c.dafc2","g":"18fe74aea06a1180","name":"Turn AC Fan on Low","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"climate","service":"set_fan_mode","areaId":[],"deviceId":[],"entityId":["climate.thermostat"],"data":"{\"fan_mode\":\"low\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":760,"y":340,"wires":[["9ce46ce21d8cc964"]]},{"id":"9ce46ce21d8cc964","type":"delay","z":"9584418c.dafc2","g":"18fe74aea06a1180","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":900,"y":400,"wires":[["2b6721107586ceae"]]},{"id":"2b6721107586ceae","type":"api-call-service","z":"9584418c.dafc2","g":"18fe74aea06a1180","name":"Turn AC Fan on Auto","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"climate","service":"set_fan_mode","areaId":[],"deviceId":[],"entityId":["climate.thermostat"],"data":"{\"fan_mode\":\"auto\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1060,"y":340,"wires":[[]]},{"id":"830c3ddd08ef396c","type":"api-current-state","z":"9584418c.dafc2","g":"18fe74aea06a1180","name":"Attic > 100","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"100","halt_if_type":"num","halt_if_compare":"gt","entity_id":"sensor.netatmo_home_attic_temperature","state_type":"str","blockInputOverrides":true,"outputProperties":[{"property":"attic","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":290,"y":400,"wires":[["cf1c689e51b98aec"],[]]},{"id":"43e5fa289c7550ff","type":"function","z":"9584418c.dafc2","d":true,"g":"35da177d9e2fd258","name":"Speedy","func":"var alert = {}\nvar message = \"Speedy:\\n\"\n\nfor (var i = 0; i < msg.payload.acList.length; i++) {\n if (typeof msg.payload.acList[i].Reg !== \"undefined\") {\n if (typeof msg.payload.acList[i].Spd == \"number\") {\n if (msg.payload.acList[i].Spd > 600) {\n alert[msg.payload.acList[i].Reg] = msg.payload.acList[i].Icao\n }\n }\n }\n}\n\nif (Object.keys(alert).length > 0) {\n for (const [key, value] of Object.entries(alert)) {\n message += key + \": https://globe.adsbexchange.com/?icao=\" + value + \"\\n\"\n }\n return { payload: message + \"https://vrs.aneis.ch\" }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":780,"y":1540,"wires":[["97761f13f8e5c31b"]]},{"id":"97761f13f8e5c31b","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Rate Limiter","func":"var interval = (1000*60*10); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1010,"y":1540,"wires":[["26e32b1d7824356a"]]},{"id":"ed80a3f.522526","type":"server-state-changed","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Vehicle Detected","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"sensor.street_car_count","entityIdType":"exact","outputInitially":false,"stateType":"str","ifState":"0","ifStateType":"num","ifStateOperator":"gt","outputOnlyOnStateChange":false,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":160,"y":2200,"wires":[["bcaf3569e7816922"],[]]},{"id":"f3a3e80f.3e8e38","type":"function","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Image to Payload","func":"msg = {\n payload: msg.payload,\n event_id: msg.event_id,\n loops: msg.loops\n};\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":930,"y":2200,"wires":[["e263410e9a3af7d8"]]},{"id":"6f08d11c854dfb00","type":"file","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Write File","filename":"/data/logo.jpg","filenameType":"str","appendNewline":true,"createDir":false,"overwriteFile":"true","encoding":"none","x":1000,"y":2260,"wires":[["b2a5543693ac851e"]]},{"id":"9b7c5535c74a94a3","type":"function","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Output msg","func":"msg = {\n payload: msg.outlinedImage,\n detection_result: msg.payload[0].label,\n event_id: msg.event_id\n};\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":850,"y":2260,"wires":[["6f08d11c854dfb00"]]},{"id":"d8a16fd91366d112","type":"switch","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Match Found","property":"payload","propertyType":"msg","rules":[{"t":"nempty"}],"checkall":"true","repair":false,"outputs":1,"x":430,"y":2260,"wires":[["63fd5090444c9cad"]]},{"id":"bcaf3569e7816922","type":"http request","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Get Events","method":"GET","ret":"txt","paytoqs":"ignore","url":"http://frigate:5000/api/events?cameras=driveway&labels=car&has_snapshot=1&zones=street&in_progress=1&limit=1","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":350,"y":2200,"wires":[["d58f6ef71c326040"]]},{"id":"d58f6ef71c326040","type":"function","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Extract Event ID","func":"if (JSON.parse(msg.payload).length > 0) {\n msg = {\n event_id: JSON.parse(msg.payload)[0].id,\n };\n return msg;\n}\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":540,"y":2200,"wires":[["c13f0f20a56d6af5"]]},{"id":"bd19a17005513c2f","type":"inject","z":"9584418c.dafc2","g":"3c4349a7eea9bd3b","name":"Every 15 Minutes","props":[],"repeat":"900","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":190,"y":1940,"wires":[["24d1a94e275e5e44","ab66afa5b576de3f","7a8e43b6f7c84bac","58d0c98797e19829","ccf5998fdf8ee50d"]]},{"id":"24d1a94e275e5e44","type":"http request","z":"9584418c.dafc2","g":"3c4349a7eea9bd3b","name":"Set Doorbell Online","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.34/cgi-bin/configManager.cgi?action=setConfig&VSP_PaaS.Online=true","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":410,"y":2000,"wires":[[]]},{"id":"42be35f83b764861","type":"http request","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Add SubLabel","method":"POST","ret":"txt","paytoqs":"ignore","url":"http://frigate:5000/api/events/{{{event_id}}}/sub_label","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"Content-type","valueType":"other","valueValue":"application/json"}],"x":1320,"y":2340,"wires":[[]]},{"id":"b2a5543693ac851e","type":"function","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Detection to payload","func":"var new_msg = {\n payload: { \"subLabel\": msg.detection_result },\n detection_result: msg.detection_result,\n event_id: msg.event_id\n};\nvar msg = new_msg\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1180,"y":2260,"wires":[["42be35f83b764861"]]},{"id":"c13f0f20a56d6af5","type":"http request","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Get Current Image","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://frigate:1984/api/frame.jpeg?src=driveway&h=1000","tls":"","persist":true,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":730,"y":2200,"wires":[["f3a3e80f.3e8e38"]]},{"id":"7151828122e3b80c","type":"deepstack-custom-model","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Post to Deepstack","server":"96b8babe5c0a6107","confidence":"60","customModel":"delivery","drawPredictions":true,"outlineColor":"red","custom":"","outputs":1,"x":190,"y":2260,"wires":[["5acbb2cbdbdea368","bace446bfa7b343d"]]},{"id":"ea239028eda07991","type":"within-time-switch","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"","nameInt":"","positionConfig":"9f81fd881d01a666","startTime":"08:00:00","startTimeType":"entered","startOffset":0,"startOffsetType":"none","startOffsetMultiplier":60000,"endTime":"21:00:00","endTimeType":"entered","endOffset":0,"endOffsetType":"none","endOffsetMultiplier":60000,"timeRestrictions":0,"timeRestrictionsType":"none","timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","propertyStart":"","propertyStartType":"none","propertyStartCompare":"true","propertyStartThreshold":"","propertyStartThresholdType":"num","startTimeAlt":"","startTimeAltType":"entered","startOffsetAlt":0,"startOffsetAltType":"none","startOffsetAltMultiplier":60000,"propertyEnd":"","propertyEndType":"none","propertyEndCompare":"true","propertyEndThreshold":"","propertyEndThresholdType":"num","endTimeAlt":"","endTimeAltType":"entered","endOffsetAlt":0,"endOffsetAltType":"none","endOffsetAltMultiplier":60000,"withinTimeValue":"true","withinTimeValueType":"msgInput","outOfTimeValue":"false","outOfTimeValueType":"msgInput","tsCompare":"0","x":410,"y":1660,"wires":[["a9a323de66b6f772"],[]]},{"id":"58d0c98797e19829","type":"http request","z":"9584418c.dafc2","d":true,"g":"3c4349a7eea9bd3b","name":"Set Camera 1 Online","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.32/cgi-bin/configManager.cgi?action=setConfig&VSP_PaaS.Online=true","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":420,"y":1880,"wires":[[]]},{"id":"7a8e43b6f7c84bac","type":"http request","z":"9584418c.dafc2","d":true,"g":"3c4349a7eea9bd3b","name":"Set Camera 2 Online","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.33/cgi-bin/configManager.cgi?action=setConfig&VSP_PaaS.Online=true","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":420,"y":1920,"wires":[[]]},{"id":"ab66afa5b576de3f","type":"http request","z":"9584418c.dafc2","d":true,"g":"3c4349a7eea9bd3b","name":"Set Camera 3 Online","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.35/cgi-bin/configManager.cgi?action=setConfig&VSP_PaaS.Online=true","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":420,"y":1960,"wires":[[]]},{"id":"ccf5998fdf8ee50d","type":"http request","z":"9584418c.dafc2","d":true,"g":"3c4349a7eea9bd3b","name":"Set PTZ Online","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.36/cgi-bin/configManager.cgi?action=setConfig&VSP_PaaS.Online=true","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":400,"y":2040,"wires":[[]]},{"id":"1ef176bec8ed5da0","type":"api-call-service","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Doorbell Ring Light On","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":["light.front_door_ring_light"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1020,"y":1340,"wires":[[]]},{"id":"254a48eabb9cf476","type":"api-call-service","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Doorbell Ring Light Off","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_off","areaId":[],"deviceId":[],"entityId":["light.front_door_ring_light"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1020,"y":1440,"wires":[[]]},{"id":"4e2d750742dc8890","type":"server-state-changed","z":"9584418c.dafc2","d":true,"g":"59ea88a27ef998e7","name":"Drone Motion Detected","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"binary_sensor.drone_detect_motion","entityIdType":"exact","outputInitially":false,"stateType":"str","ifState":"on","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":false,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":180,"y":2480,"wires":[["9799e777bb06f63f"],[]]},{"id":"cdc9c2c982e3fe5f","type":"function","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Image to Payload","func":"msg = {\n payload: msg.payload,\n loops: msg.loops\n};\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":890,"y":2480,"wires":[["b4392caec775b305"]]},{"id":"300267d7c89b0955","type":"debug","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Deepstack Output","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":420,"y":2620,"wires":[]},{"id":"1ae58f8afe36e04c","type":"http request","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Get Current Image","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://frigate:5000/api/bullet/latest.jpg?quality=100","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":670,"y":2480,"wires":[["cdc9c2c982e3fe5f"]]},{"id":"5c59c5c412e759ce","type":"deepstack-custom-model","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Post to Deepstack","server":"96b8babe5c0a6107","confidence":"40","customModel":"delivery","drawPredictions":true,"outlineColor":"red","custom":"","outputs":1,"x":190,"y":2540,"wires":[["300267d7c89b0955","aa523c5cbfe26949","2f18405339079200"]]},{"id":"aa523c5cbfe26949","type":"image","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"","width":"800","data":"outlinedImage","dataType":"msg","thumbnail":false,"active":true,"pass":true,"outputs":1,"x":200,"y":2680,"wires":[[]]},{"id":"b4392caec775b305","type":"jimp-image","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"","data":"payload","dataType":"msg","ret":"buf","parameter1":"380","parameter1Type":"num","parameter2":"0","parameter2Type":"num","parameter3":"170","parameter3Type":"num","parameter4":"170","parameter4Type":"num","parameter5":"","parameter5Type":"msg","parameter6":"","parameter6Type":"msg","parameter7":"","parameter7Type":"msg","parameter8":"","parameter8Type":"msg","sendProperty":"payload","sendPropertyType":"msg","parameterCount":4,"jimpFunction":"crop","selectedJimpFunction":{"name":"crop","fn":"crop","description":"crop to the given region","parameters":[{"name":"x","type":"num","required":true,"hint":"the x coordinate to crop form"},{"name":"y","type":"num","required":true,"hint":"the y coordinate to crop form"},{"name":"w","type":"num","required":true,"hint":"the width of the crop region"},{"name":"h","type":"num","required":true,"hint":"the height of the crop region"}]},"x":1050,"y":2480,"wires":[["5c59c5c412e759ce","081d788e92e34986"]]},{"id":"81d6e9a99eb61c67","type":"switch","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Match Found","property":"payload","propertyType":"msg","rules":[{"t":"nempty"}],"checkall":"true","repair":false,"outputs":1,"x":690,"y":2540,"wires":[["8bec0433aa6e51fa"]]},{"id":"8bec0433aa6e51fa","type":"function","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Output msg","func":"var oldmsg = msg;\n\nmsg = {\n payload: msg.outlinedImage,\n detection_result: msg.payload[0].label,\n};\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":890,"y":2540,"wires":[["1aa9e39b6be88864","b4d7bb6e129bacea"]]},{"id":"1aa9e39b6be88864","type":"file","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Write File","filename":"/data/logo.jpg","filenameType":"str","appendNewline":true,"createDir":false,"overwriteFile":"true","encoding":"none","x":1060,"y":2540,"wires":[["ec51454057c055e2"]]},{"id":"ec51454057c055e2","type":"function","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Detection to payload","func":"var new_msg = {\n payload: { \"subLabel\": msg.detection_result },\n detection_result: msg.detection_result,\n event_id: msg.event_id\n};\nvar msg = new_msg\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1260,"y":2540,"wires":[["6d56b297fcfe0016"]]},{"id":"765c7c5a61100728","type":"http request","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Create Event","method":"POST","ret":"txt","paytoqs":"ignore","url":"http://frigate:5000/api/events/drone_detect/PrimeAir/create","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"Content-type","valueType":"other","valueValue":"application/json"}],"x":1270,"y":2600,"wires":[[]]},{"id":"1bda1e8b7f76e5f3","type":"http request","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Create Event","method":"POST","ret":"txt","paytoqs":"ignore","url":"http://frigate:5000/api/events/back_porch/PrimeAir/create","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"Content-type","valueType":"other","valueValue":"application/json"}],"x":1270,"y":2640,"wires":[[]]},{"id":"14855ff357d5fbad","type":"mqtt out","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"","topic":"frigate/events","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"546e31ed.0db1c","x":1360,"y":2680,"wires":[]},{"id":"a95b4fa60f1238d7","type":"function","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Build MQTT","func":"msg.payload = {'type':'update', 'after':{'label':'PrimeAir'}}\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1190,"y":2680,"wires":[["14855ff357d5fbad"]]},{"id":"081d788e92e34986","type":"image","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"","width":"800","data":"payload","dataType":"msg","thumbnail":false,"active":true,"pass":true,"outputs":1,"x":1000,"y":2680,"wires":[[]]},{"id":"9799e777bb06f63f","type":"within-time-switch","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"","nameInt":"","positionConfig":"9f81fd881d01a666","startTime":"08:30:00","startTimeType":"entered","startOffset":0,"startOffsetType":"none","startOffsetMultiplier":60000,"endTime":"15:30:00","endTimeType":"entered","endOffset":0,"endOffsetType":"none","endOffsetMultiplier":60000,"timeRestrictions":0,"timeRestrictionsType":"none","timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","propertyStart":"","propertyStartType":"none","propertyStartCompare":"true","propertyStartThreshold":"","propertyStartThresholdType":"num","startTimeAlt":"","startTimeAltType":"entered","startOffsetAlt":0,"startOffsetAltType":"none","startOffsetAltMultiplier":60000,"propertyEnd":"","propertyEndType":"none","propertyEndCompare":"true","propertyEndThreshold":"","propertyEndThresholdType":"num","endTimeAlt":"","endTimeAltType":"entered","endOffsetAlt":0,"endOffsetAltType":"none","endOffsetAltMultiplier":60000,"withinTimeValue":"true","withinTimeValueType":"msgInput","outOfTimeValue":"false","outOfTimeValueType":"msgInput","tsCompare":"0","x":430,"y":2480,"wires":[["1ae58f8afe36e04c"],[]]},{"id":"6d56b297fcfe0016","type":"function","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Rate Limiter","func":"var interval = (1000*30); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1070,"y":2600,"wires":[["a95b4fa60f1238d7","1bda1e8b7f76e5f3","765c7c5a61100728","b442c20392c7ce60"]]},{"id":"2f18405339079200","type":"while-loop","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Loop \"payload.length == 0\"","condi":"msg.payload.length == 0","limit":true,"limitTime":"10","time":"loops","timeType":"msg","x":460,"y":2540,"wires":[["81d6e9a99eb61c67"],["1ae58f8afe36e04c"]]},{"id":"bace446bfa7b343d","type":"while-loop","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Loop \"msg.payload.length == 0\"","condi":"msg.payload.length == 0","limit":true,"limitTime":"4","time":"loops","timeType":"msg","x":240,"y":2340,"wires":[["d8a16fd91366d112"],["c13f0f20a56d6af5"]]},{"id":"b4d7bb6e129bacea","type":"debug","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Write Match Image","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":740,"y":2600,"wires":[]},{"id":"b442c20392c7ce60","type":"debug","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Call Frigate API","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":750,"y":2680,"wires":[]},{"id":"5acbb2cbdbdea368","type":"image","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"","width":"800","data":"outlinedImage","dataType":"msg","thumbnail":false,"active":true,"pass":true,"outputs":1,"x":200,"y":2380,"wires":[[]]},{"id":"c061be05c01527e0","type":"image","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"","width":"800","data":"payload","dataType":"msg","thumbnail":false,"active":true,"pass":true,"outputs":1,"x":1060,"y":2380,"wires":[[]]},{"id":"ec6b4698123ebc34","type":"inject","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Manually Create Event","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":1280,"y":2480,"wires":[["6d56b297fcfe0016"]]},{"id":"e263410e9a3af7d8","type":"jimp-image","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"","data":"payload","dataType":"msg","ret":"buf","parameter1":"650","parameter1Type":"num","parameter2":"0","parameter2Type":"num","parameter3":"625","parameter3Type":"num","parameter4":"130","parameter4Type":"num","parameter5":"","parameter5Type":"msg","parameter6":"","parameter6Type":"msg","parameter7":"","parameter7Type":"msg","parameter8":"","parameter8Type":"msg","sendProperty":"payload","sendPropertyType":"msg","parameterCount":4,"jimpFunction":"crop","selectedJimpFunction":{"name":"crop","fn":"crop","description":"crop to the given region","parameters":[{"name":"x","type":"num","required":true,"hint":"the x coordinate to crop form"},{"name":"y","type":"num","required":true,"hint":"the y coordinate to crop form"},{"name":"w","type":"num","required":true,"hint":"the width of the crop region"},{"name":"h","type":"num","required":true,"hint":"the height of the crop region"}]},"x":1110,"y":2200,"wires":[["7151828122e3b80c","a12e93d199527cae","c061be05c01527e0"]]},{"id":"5123f652827fa902","type":"inject","z":"9584418c.dafc2","d":true,"g":"cb7e3560a0078392","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"30","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":170,"y":2860,"wires":[["970920516fa379e8","88d3b091fc333998"]]},{"id":"970920516fa379e8","type":"http request","z":"9584418c.dafc2","d":true,"g":"cb7e3560a0078392","name":"PHX","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://ttp.cbp.dhs.gov/schedulerapi/slot-availability?locationId=7160","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":330,"y":2860,"wires":[["51f2291060d07336"]]},{"id":"51f2291060d07336","type":"function","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"11/07","func":"var oldmsg = msg;\nvar match = false\nvar slots = ''\n\nfor (var i = 0; i < msg.payload.availableSlots.length; i++) {\n if (msg.payload.availableSlots[i].startTimestamp.includes('2023-11-07')){\n console.log(msg.payload.availableSlots[i].startTimestamp)\n slots += msg.payload.availableSlots[i].startTimestamp + ' '\n match = true\n }\n}\n\nmsg = {\n payload: \"PHX: \" + slots + \"https://ttp.cbp.dhs.gov/schedulerui/schedule-interview/location?lang=en&vo=true&returnUrl=ttp-external&service=UP\",\n 'match': match\n};\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":470,"y":2860,"wires":[["7415468104c18108","a61d605915dc23ff"]]},{"id":"91d3d26774f9468e","type":"debug","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"HOU","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":630,"y":2820,"wires":[]},{"id":"7415468104c18108","type":"debug","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"PHX","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":630,"y":2900,"wires":[]},{"id":"b8a4a1ee4e15f778","type":"api-call-service","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Notify Via Signal","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"signal_self","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": msg.payload\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":960,"y":2860,"wires":[[]]},{"id":"79c00f8c61888f52","type":"switch","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"","property":"match","propertyType":"msg","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":610,"y":2780,"wires":[["c44a5c4d6d17ee9f"]]},{"id":"a61d605915dc23ff","type":"switch","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"","property":"match","propertyType":"msg","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":610,"y":2860,"wires":[["fa9f2ef8fecf1de2"]]},{"id":"c44a5c4d6d17ee9f","type":"function","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Rate Limiter","func":"var interval = (1000*600); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":2780,"wires":[["d5ab0aa6d198ba81"]]},{"id":"fa9f2ef8fecf1de2","type":"function","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Rate Limiter","func":"var interval = (1000*600); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":2860,"wires":[["b8a4a1ee4e15f778"]]},{"id":"7d01abce7bc68291","type":"function","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"All","func":"var oldmsg = msg;\nvar slots = msg.payload.availableSlots\n\n// Pass message if slots not empty\nif(slots.length > 0){\n msg.message = slots[0].startTimestamp\n return msg;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":470,"y":2940,"wires":[["1480d9470754a6a3","b7c50947c4507d03"]]},{"id":"b7c50947c4507d03","type":"switch","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"","property":"payload","propertyType":"msg","rules":[{"t":"nempty"}],"checkall":"true","repair":false,"outputs":1,"x":610,"y":2940,"wires":[["ca8d58af48d7b7c5","414a38bf0735b27c"]]},{"id":"1480d9470754a6a3","type":"debug","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"DAL","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":630,"y":2980,"wires":[]},{"id":"ca8d58af48d7b7c5","type":"function","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Rate Limiter","func":"var interval = (1000*120); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":2940,"wires":[["414a38bf0735b27c","bfbece91f0b61e8b"]]},{"id":"414a38bf0735b27c","type":"api-call-service","z":"9584418c.dafc2","d":true,"g":"cb7e3560a0078392","name":"Notify Via Signal","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"signal_self","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": \"Dallas https://ttp.cbp.dhs.gov/schedulerui/schedule-interview/location?lang=en&vo=true&returnUrl=ttp-external&service=UP\"\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":960,"y":2940,"wires":[[]]},{"id":"c0546e86d17e99e9","type":"function","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"11/03","func":"var oldmsg = msg;\nvar match = false\nvar slots = ''\n\nfor (var i = 0; i < msg.payload.availableSlots.length; i++) {\n if (msg.payload.availableSlots[i].startTimestamp.includes('2023-11-03')){\n console.log(msg.payload.availableSlots[i].startTimestamp)\n slots += msg.payload.availableSlots[i].startTimestamp + ' '\n match = true\n }\n}\n\nmsg = {\n payload: \"HOU: \" + slots + \"https://ttp.cbp.dhs.gov/schedulerui/schedule-interview/location?lang=en&vo=true&returnUrl=ttp-external&service=UP\",\n 'match': match\n};\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":470,"y":2780,"wires":[["91d3d26774f9468e","79c00f8c61888f52"]]},{"id":"d5ab0aa6d198ba81","type":"api-call-service","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Notify Via Signal","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"signal_self","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": msg.payload\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":960,"y":2780,"wires":[[]]},{"id":"83e2179938d08d58","type":"api-call-service","z":"9584418c.dafc2","g":"26b2ac79d4c32bda","name":"Timelapse Snapshots","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"camera","service":"snapshot","areaId":[],"deviceId":[],"entityId":["camera.back_porch","camera.bullet","camera.driveway","camera.front_door"],"data":"{\"filename\":\"/config/media/images/{{ entity_id.entity_id }}/{{ now().strftime('%Y%m%d-%H%M%S') }}.jpg\"}","dataType":"json","mergeContext":"","mustacheAltTags":true,"outputProperties":[],"queue":"none","x":540,"y":3220,"wires":[[]]},{"id":"59e4459459f077c9","type":"time-inject","z":"9584418c.dafc2","g":"26b2ac79d4c32bda","name":"Golden Hour Dawn End","nameInt":"⏲ golden hour dawn end = $!{lblInject}!","positionConfig":"9f81fd881d01a666","props":[],"injectTypeSelect":"time","intervalCount":1,"intervalCountType":"num","intervalCountMultiplier":60000,"time":"goldenHourDawnEnd","timeType":"pdsTime","offset":0,"offsetType":"none","offsetMultiplier":60000,"timeEnd":"","timeEndType":"entered","timeEndOffset":0,"timeEndOffsetType":"none","timeEndOffsetMultiplier":60000,"timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","property":"","propertyType":"none","propertyCompare":"true","propertyThreshold":"","propertyThresholdType":"num","timeAlt":"","timeAltType":"entered","timeAltDays":"*","timeAltOnlyOddDays":false,"timeAltOnlyEvenDays":false,"timeAltOnlyOddWeeks":false,"timeAltOnlyEvenWeeks":false,"timeAltMonths":"*","timeAltOffset":0,"timeAltOffsetType":"none","timeAltOffsetMultiplier":60000,"once":false,"onceDelay":0.1,"recalcTime":2,"x":200,"y":3140,"wires":[["83e2179938d08d58"]]},{"id":"089b07fa48286f29","type":"time-inject","z":"9584418c.dafc2","g":"26b2ac79d4c32bda","name":"Golden Hour Dusk Start","nameInt":"⏲ golden hour dusk start = $!{lblInject}!","positionConfig":"9f81fd881d01a666","props":[],"injectTypeSelect":"time","intervalCount":1,"intervalCountType":"num","intervalCountMultiplier":60000,"time":"goldenHourDuskStart","timeType":"pdsTime","offset":0,"offsetType":"none","offsetMultiplier":60000,"timeEnd":"","timeEndType":"entered","timeEndOffset":0,"timeEndOffsetType":"none","timeEndOffsetMultiplier":60000,"timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","property":"","propertyType":"none","propertyCompare":"true","propertyThreshold":"","propertyThresholdType":"num","timeAlt":"","timeAltType":"entered","timeAltDays":"*","timeAltOnlyOddDays":false,"timeAltOnlyEvenDays":false,"timeAltOnlyOddWeeks":false,"timeAltOnlyEvenWeeks":false,"timeAltMonths":"*","timeAltOffset":0,"timeAltOffsetType":"none","timeAltOffsetMultiplier":60000,"once":false,"onceDelay":0.1,"recalcTime":2,"x":200,"y":3320,"wires":[["83e2179938d08d58"]]},{"id":"7ff9bf1a917cbf50","type":"time-inject","z":"9584418c.dafc2","g":"26b2ac79d4c32bda","name":"Golden Hour Dusk Start - 3h","nameInt":"⏲ golden hour dusk start↶ = $!{lblInject}!","positionConfig":"9f81fd881d01a666","props":[],"injectTypeSelect":"time","intervalCount":1,"intervalCountType":"num","intervalCountMultiplier":60000,"time":"goldenHourDuskStart","timeType":"pdsTime","offset":"-3","offsetType":"num","offsetMultiplier":3600000,"timeEnd":"","timeEndType":"entered","timeEndOffset":0,"timeEndOffsetType":"none","timeEndOffsetMultiplier":60000,"timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","property":"","propertyType":"none","propertyCompare":"true","propertyThreshold":"","propertyThresholdType":"num","timeAlt":"","timeAltType":"entered","timeAltDays":"*","timeAltOnlyOddDays":false,"timeAltOnlyEvenDays":false,"timeAltOnlyOddWeeks":false,"timeAltOnlyEvenWeeks":false,"timeAltMonths":"*","timeAltOffset":0,"timeAltOffsetType":"none","timeAltOffsetMultiplier":60000,"once":false,"onceDelay":0.1,"recalcTime":2,"x":220,"y":3260,"wires":[["83e2179938d08d58"]]},{"id":"a826a8c498d6d1e3","type":"time-inject","z":"9584418c.dafc2","g":"26b2ac79d4c32bda","name":"Golden Hour Dawn End + 3h","nameInt":"⏲ golden hour dawn end↷ = $!{lblInject}!","positionConfig":"9f81fd881d01a666","props":[],"injectTypeSelect":"time","intervalCount":1,"intervalCountType":"num","intervalCountMultiplier":60000,"time":"goldenHourDawnEnd","timeType":"pdsTime","offset":"3","offsetType":"num","offsetMultiplier":3600000,"timeEnd":"","timeEndType":"entered","timeEndOffset":0,"timeEndOffsetType":"none","timeEndOffsetMultiplier":60000,"timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","property":"","propertyType":"none","propertyCompare":"true","propertyThreshold":"","propertyThresholdType":"num","timeAlt":"","timeAltType":"entered","timeAltDays":"*","timeAltOnlyOddDays":false,"timeAltOnlyEvenDays":false,"timeAltOnlyOddWeeks":false,"timeAltOnlyEvenWeeks":false,"timeAltMonths":"*","timeAltOffset":0,"timeAltOffsetType":"none","timeAltOffsetMultiplier":60000,"once":false,"onceDelay":0.1,"recalcTime":2,"x":220,"y":3200,"wires":[["83e2179938d08d58"]]},{"id":"c5c85c0aa2d8c8ca","type":"server-state-changed","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Safe Opened","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"binary_sensor.large_safe","entityIdType":"exact","outputInitially":false,"stateType":"habool","ifState":"true","ifStateType":"bool","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":530,"y":80,"wires":[["c5124616.c9bd48"],[]]},{"id":"fa90c550.d6c948","type":"inject","z":"9584418c.dafc2","d":true,"g":"b808f2d7ae539c87","name":"At 8 PM","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 20 * * 1,2,4,5,6,0","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":160,"y":700,"wires":[["1457bf6605a50448"]]},{"id":"08b26d8311cd9187","type":"inject","z":"9584418c.dafc2","d":true,"g":"6f393a92ae952332","name":"Every 5 minutes","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"300","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":190,"y":3480,"wires":[["716e8fabff85ffb9","7b988b93a658f526","d85faf19968afde1"]]},{"id":"716e8fabff85ffb9","type":"api-current-state","z":"9584418c.dafc2","g":"6f393a92ae952332","name":"Attic Temperature < 34","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"34","halt_if_type":"num","halt_if_compare":"lt","entity_id":"sensor.netatmo_home_attic_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":420,"y":3420,"wires":[["16e1a3e2f53e6bdf"],[]]},{"id":"7b988b93a658f526","type":"api-current-state","z":"9584418c.dafc2","g":"6f393a92ae952332","name":"Thermostat Outdoor Temperature <= 35","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"35","halt_if_type":"num","halt_if_compare":"lte","entity_id":"sensor.thermostat_outdoor_ambient_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":480,"y":3480,"wires":[["16e1a3e2f53e6bdf"],[]]},{"id":"7fe1e564efbd46af","type":"api-call-service","z":"9584418c.dafc2","g":"6f393a92ae952332","name":"Turn on Faucet Drip","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.bhyve_1"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":970,"y":3480,"wires":[[]]},{"id":"16e1a3e2f53e6bdf","type":"api-current-state","z":"9584418c.dafc2","g":"6f393a92ae952332","name":"Faucet Drip Off?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"switch.bhyve_1","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":780,"y":3480,"wires":[["7fe1e564efbd46af"],[]]},{"id":"d85faf19968afde1","type":"api-current-state","z":"9584418c.dafc2","g":"6f393a92ae952332","name":"Compost External Temperature < 34","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"34","halt_if_type":"num","halt_if_compare":"lt","entity_id":"sensor.compost_external_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":470,"y":3540,"wires":[["16e1a3e2f53e6bdf"],[]]},{"id":"504a90c2bb116cda","type":"inject","z":"9584418c.dafc2","name":"On Demand","props":[],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":690,"y":1920,"wires":[["f7c82af0e299c914"]]},{"id":"f7c82af0e299c914","type":"http request","z":"9584418c.dafc2","name":"Enable Overlay","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.32/cgi-bin/configManager.cgi?action=setConfig&VideoWidget[0].CustomTitle[1].EncodeBlend=true","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":900,"y":1920,"wires":[[]]},{"id":"aa9d132ce4c33794","type":"http request","z":"9584418c.dafc2","name":"Set Overlay Text","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.32/cgi-bin/configManager.cgi?action=setConfig&VideoWidget[0].CustomTitle[1].Text={{{payload}}}°F","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":1140,"y":1980,"wires":[[]]},{"id":"8f9a073f4ebb3133","type":"inject","z":"9584418c.dafc2","name":"On Demand */5","props":[],"repeat":"300","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":700,"y":1980,"wires":[["446f812e8b1f4307"]]},{"id":"acd933c5c0eddc8b","type":"http request","z":"9584418c.dafc2","name":"Disable Overlay","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.32/cgi-bin/configManager.cgi?action=setConfig&VideoWidget[0].CustomTitle[1].EncodeBlend=false","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":900,"y":2040,"wires":[[]]},{"id":"6d26bb1db9ea5e67","type":"inject","z":"9584418c.dafc2","name":"On Demand","props":[],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":690,"y":2040,"wires":[["acd933c5c0eddc8b"]]},{"id":"446f812e8b1f4307","type":"api-current-state","z":"9584418c.dafc2","name":"Outdoor Temperature","server":"e1dc0b88.463bb8","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.433_weather_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":920,"y":1980,"wires":[["aa9d132ce4c33794"]]},{"id":"7eb1a3d60fccbc76","type":"Mailin SMTP","z":"9584418c.dafc2","g":"e28fc796ce042622","name":"Recieve Mail","port":25,"x":150,"y":3660,"wires":[["1cd709e001bf5e89"]]},{"id":"cb1f141562c8fd2b","type":"api-call-service","z":"9584418c.dafc2","g":"e28fc796ce042622","name":"Notify Cellular Priority 1","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"cellular_message","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": payload.html, \"data\": {\"priority\": 1} \t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":810,"y":3640,"wires":[[]]},{"id":"88d3b091fc333998","type":"http request","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"DAL","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://ttp.cbp.dhs.gov/schedulerapi/slot-availability?locationId=5300","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":330,"y":2940,"wires":[["7d01abce7bc68291"]]},{"id":"1cd709e001bf5e89","type":"within-time-switch","z":"9584418c.dafc2","g":"e28fc796ce042622","name":"","nameInt":"","positionConfig":"9f81fd881d01a666","startTime":"09:00:00","startTimeType":"entered","startOffset":0,"startOffsetType":"none","startOffsetMultiplier":60000,"endTime":"22:00:00","endTimeType":"entered","endOffset":0,"endOffsetType":"none","endOffsetMultiplier":60000,"timeRestrictions":0,"timeRestrictionsType":"none","timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","propertyStart":"","propertyStartType":"none","propertyStartCompare":"true","propertyStartThreshold":"","propertyStartThresholdType":"num","startTimeAlt":"","startTimeAltType":"entered","startOffsetAlt":0,"startOffsetAltType":"none","startOffsetAltMultiplier":60000,"propertyEnd":"","propertyEndType":"none","propertyEndCompare":"true","propertyEndThreshold":"","propertyEndThresholdType":"num","endTimeAlt":"","endTimeAltType":"entered","endOffsetAlt":0,"endOffsetAltType":"none","endOffsetAltMultiplier":60000,"withinTimeValue":"true","withinTimeValueType":"msgInput","outOfTimeValue":"false","outOfTimeValueType":"msgInput","tsCompare":"0","x":370,"y":3660,"wires":[["24fc1882c8436738"],["7f48460e08988c9e"]]},{"id":"7f48460e08988c9e","type":"api-call-service","z":"9584418c.dafc2","g":"e28fc796ce042622","name":"Notify Cellular Priority 0","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"cellular_message","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": payload.html, \"data\": {\"priority\": 0} \t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":810,"y":3700,"wires":[[]]},{"id":"24fc1882c8436738","type":"api-current-state","z":"9584418c.dafc2","g":"e28fc796ce042622","name":"Andrew Home?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"home","halt_if_type":"str","halt_if_compare":"is","entity_id":"person.andrew","state_type":"habool","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":580,"y":3640,"wires":[["cb1f141562c8fd2b"],["7f48460e08988c9e"]]},{"id":"d9e9a93275328762","type":"inject","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":780,"y":2140,"wires":[["c13f0f20a56d6af5"]]},{"id":"a12e93d199527cae","type":"file","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Write File","filename":"/data/input.jpg","filenameType":"str","appendNewline":true,"createDir":false,"overwriteFile":"true","encoding":"none","x":1200,"y":2140,"wires":[[]]},{"id":"f8a0990e2842810d","type":"server-state-changed","z":"9584418c.dafc2","name":"Dead Zwave Node","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"_node_status","entityIdType":"substring","outputInitially":false,"stateType":"str","ifState":"dead","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":170,"y":3800,"wires":[["1ba5d7539019ce84"],[]]},{"id":"1ba5d7539019ce84","type":"api-call-service","z":"9584418c.dafc2","name":"Notify Via Signal","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"signal_homeassistant","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": topic & \" has died\" }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":420,"y":3800,"wires":[[]]},{"id":"1b266e9b338a4dfe","type":"debug","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"BB Debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1040,"y":3040,"wires":[]},{"id":"85644b2ab18e7141","type":"http request","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"BlueBubbles","method":"POST","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"andrew-bb","valueType":"other","valueValue":"true"}],"x":870,"y":3040,"wires":[["1b266e9b338a4dfe"]]},{"id":"041a81d375ec985d","type":"function","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Build BB Message","func":"msg.url = msg.payload + \"/api/v1/message/text?password=\" + env.get(\"bb_pass\")\nmsg.payload = {\n \"chatGuid\": \"iMessage;-;+\" + env.get(\"bb_number\"),\n \"message\": msg.message + \" https://ttp.cbp.dhs.gov/schedulerui/schedule-interview/location?lang=en&vo=true&returnUrl=ttp-external&service=UP\",\n \"method\": \"private-api\"\n}\n\nreturn msg;\n\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":670,"y":3040,"wires":[["85644b2ab18e7141"]]},{"id":"bfbece91f0b61e8b","type":"api-current-state","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Get BlueBubbles URL","server":"e1dc0b88.463bb8","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_text.bluebubbles_url","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":250,"y":3040,"wires":[["f3b23466b80725e0"]]},{"id":"f3b23466b80725e0","type":"json","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Object to JSON","property":"message","action":"str","pretty":false,"x":460,"y":3040,"wires":[["041a81d375ec985d"]]},{"id":"b4b8f84a.7e57a8","type":"jimp-image","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Annotate","data":"outlinedImage","dataType":"msg","ret":"buf","parameter1":"FONT_SANS_16_WHITE","parameter1Type":"jimpFont","parameter2":"10","parameter2Type":"num","parameter3":"0","parameter3Type":"num","parameter4":"timestamp","parameter4Type":"msg","parameter5":"HORIZONTAL_ALIGN_LEFT","parameter5Type":"AlignX","parameter6":"VERTICAL_ALIGN_TOP","parameter6Type":"AlignY","parameter7":"","parameter7Type":"auto","parameter8":"","parameter8Type":"auto","sendProperty":"outlinedImage","parameterCount":8,"jimpFunction":"print2","selectedJimpFunction":{"name":"print aligned","fn":"print","description":"Print text to the image","parameters":[{"name":"font|str","type":"jimpFont","required":true,"hint":"font to print. NOTE: This can be one of the presets or the path to a fnt file"},{"name":"x","type":"num","required":true,"hint":"x coordinate to print text"},{"name":"y","type":"num","required":true,"hint":"y coordinate to print text"},{"name":"text","group":"options","type":"str","required":true,"hint":"text to print"},{"name":"alignmentX","group":"options","type":"AlignX","required":false,"hint":"X Alignment"},{"name":"alignmentY","group":"options","type":"AlignY","required":false,"hint":"Y Alignment"},{"name":"maxWidth","type":"auto|num","required":false,"hint":"wrap text at maxWidth"},{"name":"maxHeight","type":"auto|num","required":false,"hint":"max height"}]},"x":700,"y":2260,"wires":[["9b7c5535c74a94a3","2dfdead1d2e3b78b"]],"icon":"font-awesome/fa-image"},{"id":"63fd5090444c9cad","type":"api-render-template","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Time","server":"e1dc0b88.463bb8","version":0,"template":"{{ now().strftime(\"%m-%d-%YT%H:%M:%S\") }}","resultsLocation":"timestamp","resultsLocationType":"msg","templateLocation":"","templateLocationType":"none","x":570,"y":2260,"wires":[["b4b8f84a.7e57a8"]]},{"id":"2dfdead1d2e3b78b","type":"debug","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Post Annotate","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":560,"y":2360,"wires":[]},{"id":"c1fe21bcb3184137","type":"debug","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Post Output msg","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":810,"y":2360,"wires":[]},{"id":"28fa66cd.af058a","type":"trigger","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Wait 1m","op1":"","op2":"1","op1type":"nul","op2type":"str","duration":"1","extend":false,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":620,"y":120,"wires":[["2022689a.938918"]]},{"id":"aee87977a0670889","type":"api-call-service","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Notify Via Wrapper: Opened 5 Minutes","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"script","service":"notify_wrapper","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": \"The \" & $lowercase(msg.data.new_state.attributes.friendly_name) & \" has been opened for 5 minutes\"\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":890,"y":160,"wires":[[]]},{"id":"d269f175.c9dc6","type":"server-events","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Custom Water Event Fired","server":"e1dc0b88.463bb8","version":3,"exposeAsEntityConfig":"","eventType":"irrigation_custom_water","eventData":"","waitForRunning":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"$outputData(\"eventData\").event_type","valueType":"jsonata"},{"property":"event_type","propertyType":"msg","value":"$outputData(\"eventData\").event_type","valueType":"jsonata"}],"x":190,"y":340,"wires":[["883f2c00.1d94e8"]]},{"id":"3367e45f.cc981c","type":"function","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"++","func":"if ( (msg.i += 1) < msg.zones.length ) return msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":670,"y":400,"wires":[["116d5bb3.ee92a4"]]},{"id":"116d5bb3.ee92a4","type":"function","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"For Each","func":"if( msg.i == undefined ) msg.i = 0;\n\nmsg.payload = msg.zones[ msg.i ];\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":840,"y":340,"wires":[["565ee5c1.561bfc","80df47d5.602888","e2c37b65c5582c2b"]]},{"id":"80df47d5.602888","type":"api-call-service","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Turn On Zone","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":[],"data":"{ \"entity_id\": payload.zone}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1060,"y":340,"wires":[[]]},{"id":"fb46876c.845298","type":"api-call-service","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Turn Off Zone","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":[],"data":"{ \"entity_id\": payload.zone}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1320,"y":400,"wires":[["98eeafa7.bd2b9","860a4c61d7557dc9"]]},{"id":"98eeafa7.bd2b9","type":"delay","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Delay 5","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"outputs":1,"x":980,"y":480,"wires":[["3367e45f.cc981c"]]},{"id":"565ee5c1.561bfc","type":"change","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Set Delay Variable","rules":[{"t":"set","p":"delay","pt":"msg","to":"payload.time* 60000","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":890,"y":400,"wires":[["22a20603.86a06a"]]},{"id":"22a20603.86a06a","type":"stoptimer-varidelay","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","duration":"5","durationType":"num","units":"Millisecond","payloadtype":"num","payloadval":"0","name":"Delay","reporting":"every_second","persist":false,"x":1090,"y":400,"wires":[["fb46876c.845298"],[],["a8d96e.1f00969"]]},{"id":"a8d96e.1f00969","type":"mqtt out","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Publish Time Remaining","topic":"sensor/irrigation_time_remaining","qos":"","retain":"","broker":"546e31ed.0db1c","x":1350,"y":340,"wires":[]},{"id":"3b656b89.1ac154","type":"inject","z":"f602e6ba.609d28","g":"79694877249c9902","name":"3:00 Attempt","props":[{"p":"payload"}],"repeat":"","crontab":"00 03 * * 2,5","once":false,"onceDelay":0.1,"topic":"","payload":"[{\"zone\":\"switch.irrigation_front_beds\",\"time\":10,\"name\":\"Front beds\"},{\"zone\":\"switch.irrigation_front_lawn\",\"time\":20,\"name\":\"Front lawn\"},{\"zone\":\"switch.irrigation_left_and_main_rear_lawn\",\"time\":20,\"name\":\"Left and main rear lawn\"},{\"zone\":\"switch.irrigation_front_and_right_rear_lawn\",\"time\":20,\"name\":\"Front and right rear lawn\"},{\"zone\":\"switch.irrigation_side_lawn\",\"time\":20,\"name\":\"Side lawn\"}]","payloadType":"json","x":180,"y":1280,"wires":[["493b435f.c9851c"]]},{"id":"493b435f.c9851c","type":"api-current-state","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Schedule Enabled","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.lawn_irrigation_scheduling","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":410,"y":1280,"wires":[["8c060f00.cf577"],["7b12e66f.57d068"]]},{"id":"7b12e66f.57d068","type":"api-call-service","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.lawn_irrigation_reason"],"data":"{\"value\":\"Automation Off\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":630,"y":1300,"wires":[[]]},{"id":"8c060f00.cf577","type":"link out","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["f1cbfe0.7dfb4","576b66fa1bd202a3"],"x":595,"y":1260,"wires":[]},{"id":"4422f61c.847d88","type":"link in","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["3ff9ce03ef7b554b"],"x":135,"y":1480,"wires":[["219b37105a8304f1"]]},{"id":"dcdeabc7.780578","type":"link out","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["1eaa857e.b6b8db","c90fd5e6.c5c678","b8fe96458628f202"],"x":595,"y":1460,"wires":[]},{"id":"722d03d6.2ff77c","type":"link in","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["8d4bfe8e.ee805","d67106b42368e630"],"x":135,"y":1900,"wires":[["b3c4a3638c17629e"]]},{"id":"af4788fe.215ba8","type":"link out","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["405789f7.0727a8","eb1a5268c1aec843","9896327569c234da"],"x":595,"y":1900,"wires":[]},{"id":"c90fd5e6.c5c678","type":"link in","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["dcdeabc7.780578","89d715ddf12d2195"],"x":135,"y":1600,"wires":[["e7430e17f0b24ed8"]]},{"id":"862ad27a.d347d","type":"link out","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["83edf648.3f9ed8"],"x":595,"y":1580,"wires":[]},{"id":"808e6a81.92e2e8","type":"api-call-service","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Turn On Master Valve","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.irrigation_master_valve"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":460,"y":400,"wires":[["e42ff3d9.593dc"]]},{"id":"883f2c00.1d94e8","type":"api-current-state","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"24v Power","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"switch.irrigation_24v_power","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":250,"y":400,"wires":[["808e6a81.92e2e8"],["808e6a81.92e2e8"]]},{"id":"e42ff3d9.593dc","type":"delay","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Delay 5","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"outputs":1,"x":480,"y":340,"wires":[["76160bc4.8cd644"]]},{"id":"76160bc4.8cd644","type":"change","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"","rules":[{"t":"set","p":"zones","pt":"msg","to":"payload.event.zones","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":660,"y":340,"wires":[["116d5bb3.ee92a4"]]},{"id":"83edf648.3f9ed8","type":"link in","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["862ad27a.d347d","1bb3825011174363"],"x":135,"y":1700,"wires":[["b6e7d5b8891bba6d"]]},{"id":"8d4bfe8e.ee805","type":"link out","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["722d03d6.2ff77c"],"x":595,"y":1720,"wires":[]},{"id":"583f46a3.fc4c38","type":"inject","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"5:00 Attempt","props":[{"p":"payload"}],"repeat":"","crontab":"00 05 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"[{\"zone\":\"switch.irrigation_front_beds\",\"time\":10,\"name\":\"Front beds\"},{\"zone\":\"switch.irrigation_front_lawn\",\"time\":20,\"name\":\"Front lawn\"},{\"zone\":\"switch.irrigation_left_and_main_rear_lawn\",\"time\":20,\"name\":\"Left and main rear lawn\"},{\"zone\":\"switch.irrigation_front_and_right_rear_lawn\",\"time\":20,\"name\":\"Front and right rear lawn\"},{\"zone\":\"switch.irrigation_side_lawn\",\"time\":20,\"name\":\"Side lawn\"}]","payloadType":"json","x":180,"y":2620,"wires":[["d9147878.b61cf8"]]},{"id":"d9147878.b61cf8","type":"api-current-state","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Schedule Enabled","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.front_bed_irrigation_scheduling","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":410,"y":2620,"wires":[["c7e5552e.7f8a08"],["45c5dbbbd8ce50a1"]]},{"id":"c7e5552e.7f8a08","type":"link out","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["f1cbfe0.7dfb4","f6881b4bf93c27c5"],"x":595,"y":2600,"wires":[]},{"id":"6bcf06fb.9ca748","type":"link in","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["4f2902edc77f2d3b"],"x":135,"y":2820,"wires":[["ed6e3d4225582e20"]]},{"id":"f587589f.d739e8","type":"link out","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["1eaa857e.b6b8db","9d851699.6a8458"],"x":595,"y":2800,"wires":[]},{"id":"d9d17e8f.590e6","type":"link in","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["4fae5b92.a9cd44"],"x":135,"y":3040,"wires":[["d8637d8d96b68fca"]]},{"id":"d9f893eb.834f3","type":"link out","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["5ce1803b.06628"],"x":595,"y":3040,"wires":[]},{"id":"9d851699.6a8458","type":"link in","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["f587589f.d739e8"],"x":135,"y":2940,"wires":[["593bee0e8c958df8"]]},{"id":"4fae5b92.a9cd44","type":"link out","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["d9d17e8f.590e6"],"x":595,"y":2920,"wires":[]},{"id":"a2ab7368.923fb","type":"template","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Zone Settings Front Beds","field":"zones","fieldType":"msg","format":"json","syntax":"mustache","template":"{\n \"zone\": \"switch.irrigation_front_beds\",\n \"time\": 20,\n \"name\": \"Front beds\"\n}","output":"json","x":250,"y":3200,"wires":[["62b5545bc6d6e627"]]},{"id":"a31e3daf.17207","type":"api-call-service","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Turn On Master Valve","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.irrigation_master_valve"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":560,"y":3200,"wires":[["21ced698.708b5a"]]},{"id":"21ced698.708b5a","type":"delay","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"2s","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"outputs":1,"x":730,"y":3200,"wires":[["c661d489.9c9bc8"]]},{"id":"c661d489.9c9bc8","type":"api-call-service","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Turn On Zone","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":[],"data":"{ \"entity_id\": msg.zones.zone}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":880,"y":3200,"wires":[["accc6697.196268"]]},{"id":"accc6697.196268","type":"change","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Set Delay Variable","rules":[{"t":"set","p":"delay","pt":"msg","to":"msg.zones.time* 60000","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":1090,"y":3200,"wires":[["487ff788.8c5c98"]]},{"id":"487ff788.8c5c98","type":"stoptimer-varidelay","z":"f602e6ba.609d28","g":"55a2162532da4e14","duration":"5","durationType":"num","units":"Millisecond","payloadtype":"num","payloadval":"0","name":"Delay","reporting":"every_second","persist":false,"ignoretimerpass":false,"x":850,"y":3260,"wires":[["2238b09b.1b5b5","9129b06e.d8925"],[],["84258ddd.41da4"]]},{"id":"2238b09b.1b5b5","type":"api-call-service","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Turn Off Zone","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":[],"data":"{ \"entity_id\": msg.zones.zone}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":900,"y":3340,"wires":[[]]},{"id":"84258ddd.41da4","type":"mqtt out","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Publish Time Remaining","topic":"sensor/irrigation_time_remaining","qos":"","retain":"","broker":"546e31ed.0db1c","x":1130,"y":3320,"wires":[]},{"id":"9129b06e.d8925","type":"function","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Create msg object","func":"var message = \"Sprinkler auto-run: \" + msg.zones.name + \" ran for \" + msg.zones.time + \" minutes\"\n\nreturn { alert: message };","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1050,"y":3260,"wires":[["d83b5ff7a2212931"]]},{"id":"5ce1803b.06628","type":"link in","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"","links":["db46e0c1.f9ab5","d9f893eb.834f3"],"x":95,"y":3200,"wires":[["a2ab7368.923fb"]]},{"id":"815fddc0.6604c","type":"api-call-service","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Turn On 24v","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.irrigation_24v_power"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":470,"y":1900,"wires":[["af4788fe.215ba8"]]},{"id":"418058c4.af3158","type":"api-call-service","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Turn On 24v","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.irrigation_24v_power"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":470,"y":3040,"wires":[["d9f893eb.834f3"]]},{"id":"1ae21386.a831bc","type":"inject","z":"f602e6ba.609d28","g":"0f07749a4e1672ad","name":"06:00 24v Off","props":[],"repeat":"","crontab":"00 06 * * *","once":false,"onceDelay":0.1,"topic":"","x":180,"y":1140,"wires":[["117145a7.67e99a","882aff35f788008b"]]},{"id":"117145a7.67e99a","type":"api-call-service","z":"f602e6ba.609d28","g":"0f07749a4e1672ad","name":"Turn Off 24v","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":["switch.irrigation_24v_power"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":390,"y":1100,"wires":[[]]},{"id":"06d6255efdc31c47","type":"api-current-state","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Force Run","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_force_run","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":250,"y":1380,"wires":[["2fc67b25514de5a5"],["3ff9ce03ef7b554b"]]},{"id":"5420d0eed32223fb","type":"link out","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["f1cbfe0.7dfb4","08e3098cf183e086"],"x":595,"y":1360,"wires":[]},{"id":"3ff9ce03ef7b554b","type":"link out","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["f1cbfe0.7dfb4","4422f61c.847d88","8524a273a6a8ffd0"],"x":595,"y":1400,"wires":[]},{"id":"576b66fa1bd202a3","type":"link in","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["8c060f00.cf577"],"x":135,"y":1380,"wires":[["06d6255efdc31c47"]]},{"id":"7350c911a0b1a86d","type":"api-current-state","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Force Run","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_force_run","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":250,"y":2720,"wires":[["abb8777dd08aa743"],["4f2902edc77f2d3b"]]},{"id":"fdcfa1521191fa40","type":"link out","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["f1cbfe0.7dfb4","b403eec7866aea22"],"x":595,"y":2700,"wires":[]},{"id":"4f2902edc77f2d3b","type":"link out","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["f1cbfe0.7dfb4","6bcf06fb.9ca748"],"x":595,"y":2740,"wires":[]},{"id":"f6881b4bf93c27c5","type":"link in","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["c7e5552e.7f8a08"],"x":135,"y":2720,"wires":[["7350c911a0b1a86d"]]},{"id":"882aff35f788008b","type":"api-call-service","z":"f602e6ba.609d28","g":"0f07749a4e1672ad","name":"Turn Off Force Run","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_off","areaId":[],"deviceId":[],"entityId":["input_boolean.irrigation_force_run"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":410,"y":1160,"wires":[[]]},{"id":"a3d75225807b70eb","type":"delay","z":"f602e6ba.609d28","g":"79694877249c9902","name":"30 Minute Delay","pauseType":"delay","timeout":"30","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":280,"y":1760,"wires":[["339ee0ada21856e0"]]},{"id":"e2c37b65c5582c2b","type":"api-call-service","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Turn Off Start/Stop tracking","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":["automation.store_sprinkler_start_stop_times"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1060,"y":300,"wires":[[]]},{"id":"860a4c61d7557dc9","type":"api-call-service","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Turn On Start/Stop tracking","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["automation.store_sprinkler_start_stop_times"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1360,"y":460,"wires":[[]]},{"id":"aa53225140781dd7","type":"api-render-template","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Evaluate Template","server":"e1dc0b88.463bb8","version":0,"template":"","resultsLocation":"data.continue","resultsLocationType":"msg","templateLocation":"template","templateLocationType":"msg","x":250,"y":3320,"wires":[["8113d83074ff7701"]]},{"id":"8113d83074ff7701","type":"switch","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Last Ran >= Template Hrs Ago","property":"data.continue","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"num"},{"t":"eq","v":"0","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":530,"y":3320,"wires":[["a31e3daf.17207"],["f78cdb84200eb171"]]},{"id":"d83b5ff7a2212931","type":"api-call-service","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Notify via Wrapper","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"script","service":"notify_wrapper","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": alert \t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1270,"y":3260,"wires":[[]]},{"id":"dd9855ca4017c8c0","type":"api-call-service","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Turn on Boolean","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_on","areaId":[],"deviceId":[],"entityId":["input_boolean.irrigation_rainfall_delay"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":700,"y":580,"wires":[[]]},{"id":"c3a696a117416327","type":"function","z":"f602e6ba.609d28","d":true,"g":"a9182c2cc04d2d9a","name":"Check Rainfall","func":"var rain_override = false\n\nfor (var i = 0; i < msg.payload.length; i++) {\n if (parseFloat(msg.payload[i].state) > 0.25) {\n rain_override = true\n }\n}\n\n// top = proceed\n// bottom = overridden\nif (rain_override === true) {\n return [ null, {rain_override} ];\n} \nelse {\n return [ {rain_override}, null ];\n}","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":680,"wires":[["47f1a8018e58e032"],["dd9855ca4017c8c0"]]},{"id":"27f2580e35031830","type":"api-get-history","z":"f602e6ba.609d28","d":true,"g":"a9182c2cc04d2d9a","name":"Rainfall 120h","server":"e1dc0b88.463bb8","version":1,"startDate":"","endDate":"","entityId":"sensor.netatmo_home_rain_sum_rain_today_inches","entityIdType":"equals","useRelativeTime":true,"relativeTime":"120h","flatten":true,"outputType":"array","outputLocationType":"msg","outputLocation":"payload","x":310,"y":680,"wires":[["c3a696a117416327"]]},{"id":"9cb8187c669c6485","type":"comment","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Rainfall","info":"","x":150,"y":600,"wires":[]},{"id":"47f1a8018e58e032","type":"api-call-service","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Turn off Boolean","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_off","areaId":[],"deviceId":[],"entityId":["input_boolean.irrigation_rainfall_delay"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":700,"y":660,"wires":[[]]},{"id":"427f7fa58d86cc59","type":"inject","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"*/30","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"1800","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":640,"wires":[["27f2580e35031830","93965a61d2c4f5de"]]},{"id":"1d9a4d0bb4645f32","type":"api-call-service","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Turn on Boolean","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_on","areaId":[],"deviceId":[],"entityId":["input_boolean.irrigation_rain_forecast_delay"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":700,"y":840,"wires":[[]]},{"id":"d9ebbaa37f5911a9","type":"comment","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Rain Forecast","info":"","x":170,"y":760,"wires":[]},{"id":"eeecfc1e8864e39f","type":"api-call-service","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Turn off Boolean","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_off","areaId":[],"deviceId":[],"entityId":["input_boolean.irrigation_rain_forecast_delay"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":700,"y":760,"wires":[[]]},{"id":"89487a4efedec1db","type":"inject","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"*/30","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"1800","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":800,"wires":[["2c45af5b3ee5cf0a","c3cb1c7d15767014"]]},{"id":"1e4b3bc7c25b294f","type":"function","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Rain Chance","func":"// Check next 4 precipitation_probability values\n// HA Template: \n// {% for j in state_attr(\"weather.kcll_daynight\",\"forecast\")[:4] %}\n// {{ j.precipitation_probability }}\n// {% endfor %}\n\nvar forecast_override = false\n\n// if (parseFloat(msg.payload) > 40) {\n// forecast_override = true\n// }\n \nfor (var i = 0; i < 4; i++) {\n if (parseFloat(msg.data.attributes.forecast[i].precipitation_probability) >= 60) {\n forecast_override = true\n }\n}\n\n// top = proceed\n// bottom = overridden\nif (forecast_override === true) {\n return [ null, {forecast_override} ];\n} \nelse {\n return [ {forecast_override}, null ];\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":490,"y":800,"wires":[["eeecfc1e8864e39f"],["1d9a4d0bb4645f32"]]},{"id":"2c45af5b3ee5cf0a","type":"api-current-state","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Weather","server":"e1dc0b88.463bb8","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"weather.kcll_daynight","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":300,"y":800,"wires":[["1e4b3bc7c25b294f"]]},{"id":"d7e50e7a2810667d","type":"api-call-service","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Turn on Boolean","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_on","areaId":[],"deviceId":[],"entityId":["input_boolean.irrigation_wind_delay"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":700,"y":1000,"wires":[[]]},{"id":"28936ec687ee4eb0","type":"comment","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Wind","info":"","x":150,"y":920,"wires":[]},{"id":"974833b6a2eca853","type":"api-call-service","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Turn off Boolean","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_off","areaId":[],"deviceId":[],"entityId":["input_boolean.irrigation_wind_delay"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":700,"y":920,"wires":[[]]},{"id":"478a5a84d38ba181","type":"inject","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"*/5","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"300","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":960,"wires":[["c01fd0612615e927"]]},{"id":"c01fd0612615e927","type":"api-current-state","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Wind <= 10 MPH","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"10","halt_if_type":"num","halt_if_compare":"lte","entity_id":"sensor.nws_wind_speed","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":330,"y":960,"wires":[["974833b6a2eca853"],["d7e50e7a2810667d"]]},{"id":"219b37105a8304f1","type":"api-current-state","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Rainfall Delay","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_rainfall_delay","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":260,"y":1480,"wires":[["dcdeabc7.780578"],["d01fbafafbb34692"]]},{"id":"e7430e17f0b24ed8","type":"api-current-state","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Rain Forecast Delay","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_rain_forecast_delay","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":280,"y":1600,"wires":[["862ad27a.d347d"],["f5684be88477322f"]]},{"id":"b6e7d5b8891bba6d","type":"api-current-state","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Wind Delay","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_wind_delay","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":250,"y":1700,"wires":[["8d4bfe8e.ee805"],["a3d75225807b70eb"]]},{"id":"339ee0ada21856e0","type":"api-current-state","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Wind Delay","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_wind_delay","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":250,"y":1820,"wires":[["8d4bfe8e.ee805"],["336585d4eee0ca73"]]},{"id":"ed6e3d4225582e20","type":"api-current-state","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Rainfall Delay","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_rainfall_delay","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":260,"y":2820,"wires":[["f587589f.d739e8"],["f7ac7a90f3da2298"]]},{"id":"593bee0e8c958df8","type":"api-current-state","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Rain Forecast Delay","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_rain_forecast_delay","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":280,"y":2940,"wires":[["4fae5b92.a9cd44"],["67916c3a5554a794","4fae5b92.a9cd44"]]},{"id":"d01fbafafbb34692","type":"api-call-service","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.lawn_irrigation_reason"],"data":"{\"value\":\"Rainfall\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":630,"y":1500,"wires":[[]]},{"id":"f5684be88477322f","type":"api-call-service","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.lawn_irrigation_reason"],"data":"{\"value\":\"Rain Forecasted\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":630,"y":1620,"wires":[[]]},{"id":"336585d4eee0ca73","type":"api-call-service","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.lawn_irrigation_reason"],"data":"{\"value\":\"Wind\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":630,"y":1820,"wires":[[]]},{"id":"b3c4a3638c17629e","type":"api-call-service","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Clear Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.lawn_irrigation_reason"],"data":"{\"value\":\"None\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":260,"y":1900,"wires":[["815fddc0.6604c"]]},{"id":"67916c3a5554a794","type":"api-call-service","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.front_bed_irrigation_reason"],"data":"{\"value\":\"Rain Forecasted\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":630,"y":2960,"wires":[[]]},{"id":"f7ac7a90f3da2298","type":"api-call-service","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.front_bed_irrigation_reason"],"data":"{\"value\":\"Rainfall\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":630,"y":2840,"wires":[[]]},{"id":"45c5dbbbd8ce50a1","type":"api-call-service","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.front_bed_irrigation_reason"],"data":"{\"value\":\"Automation Off\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":630,"y":2640,"wires":[[]]},{"id":"2fc67b25514de5a5","type":"api-call-service","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.lawn_irrigation_reason"],"data":"{\"value\":\"Force Run\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":450,"y":1360,"wires":[["5420d0eed32223fb"]]},{"id":"08e3098cf183e086","type":"link in","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["5420d0eed32223fb"],"x":325,"y":1960,"wires":[["815fddc0.6604c"]]},{"id":"abb8777dd08aa743","type":"api-call-service","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.front_bed_irrigation_reason"],"data":"{\"value\":\"Force Run\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":450,"y":2700,"wires":[["fdcfa1521191fa40"]]},{"id":"d8637d8d96b68fca","type":"api-call-service","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Clear Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.front_bed_irrigation_reason"],"data":"{\"value\":\"None\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":260,"y":3040,"wires":[["418058c4.af3158"]]},{"id":"b403eec7866aea22","type":"link in","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["fdcfa1521191fa40"],"x":325,"y":3100,"wires":[["418058c4.af3158"]]},{"id":"f2c9c3a5b8b11a64","type":"switch","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Continue?","property":"data.continue","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"num"},{"t":"eq","v":"1","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":1230,"y":2060,"wires":[["287dd3b1af5dc2d0"],["bf015af2161c5ec2"]]},{"id":"9896327569c234da","type":"link in","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"","links":["af4788fe.215ba8"],"x":95,"y":2060,"wires":[["e95ac52f03478921"]]},{"id":"e95ac52f03478921","type":"template","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Lawn Zones","field":"all_zones","fieldType":"msg","format":"json","syntax":"mustache","template":"[\n {\n \"zone\": \"switch.irrigation_front_lawn\",\n \"name\": \"Front lawn\"\n },\n {\n \"zone\": \"switch.irrigation_left_and_main_rear_lawn\",\n \"name\": \"Left and main rear lawn\"\n },\n {\n \"zone\": \"switch.irrigation_front_and_right_rear_lawn\",\n \"name\": \"Front and right rear lawn\"\n },\n {\n \"zone\": \"switch.irrigation_side_lawn\",\n \"name\": \"Side lawn\"\n }\n]","output":"json","x":290,"y":2060,"wires":[["287dd3b1af5dc2d0"]]},{"id":"174186fb5d054240","type":"api-render-template","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Evaluate Template","server":"e1dc0b88.463bb8","version":0,"template":"","resultsLocation":"data.continue","resultsLocationType":"msg","templateLocation":"template","templateLocationType":"msg","x":1050,"y":2060,"wires":[["f2c9c3a5b8b11a64"]]},{"id":"287dd3b1af5dc2d0","type":"array-loop","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Loop Through Zones","key":"al287dd3b1af5dc2d0","keyType":"msg","reset":true,"resetValue":"value-null","array":"all_zones","arrayType":"msg","x":220,"y":2120,"wires":[["74cd40702021e86d","acdcc72fea065aac"],["224d30a98f52c287"]]},{"id":"74cd40702021e86d","type":"template","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Zone Settings Lawn","field":"zones","fieldType":"msg","format":"json","syntax":"mustache","template":"[\n {\n \"zone\": \"switch.irrigation_front_lawn\",\n \"time\": 15,\n \"name\": \"Front lawn\"\n },\n {\n \"zone\": \"switch.irrigation_left_and_main_rear_lawn\",\n \"time\": 15,\n \"name\": \"Left and main rear lawn\"\n },\n {\n \"zone\": \"switch.irrigation_front_and_right_rear_lawn\",\n \"time\": 15,\n \"name\": \"Front and right rear lawn\"\n },\n {\n \"zone\": \"switch.irrigation_side_lawn\",\n \"time\": 10,\n \"name\": \"Side lawn\"\n },\n {\n \"zone\": \"switch.irrigation_front_lawn\",\n \"time\": 15,\n \"name\": \"Front lawn\"\n },\n {\n \"zone\": \"switch.irrigation_left_and_main_rear_lawn\",\n \"time\": 15,\n \"name\": \"Left and main rear lawn\"\n },\n {\n \"zone\": \"switch.irrigation_front_and_right_rear_lawn\",\n \"time\": 15,\n \"name\": \"Front and right rear lawn\"\n },\n {\n \"zone\": \"switch.irrigation_side_lawn\",\n \"time\": 10,\n \"name\": \"Side lawn\"\n }\n]","output":"json","x":460,"y":2180,"wires":[["151eb6ba5b2d39cd"]]},{"id":"bf015af2161c5ec2","type":"function","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Append Run Zones","func":"if (typeof msg.run_zones === 'undefined'){\n msg.run_zones = []\n}\n\n// Add zone to run_zones\nmsg.run_zones.push(msg.payload.zone)\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":210,"y":2180,"wires":[["287dd3b1af5dc2d0"]]},{"id":"151eb6ba5b2d39cd","type":"array-loop","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Loop Through Zones","key":"al287dd3b1af5dc2d0","keyType":"msg","reset":true,"resetValue":"value-null","array":"zones","arrayType":"msg","x":720,"y":2180,"wires":[[],["45ee74d06e9cac2c"]]},{"id":"45ee74d06e9cac2c","type":"switch","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"If Zone in Run Zone","property":"run_zones","propertyType":"msg","rules":[{"t":"cont","v":"payload.zone","vt":"msg"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":710,"y":2240,"wires":[["8d3c8370996be2da"],["151eb6ba5b2d39cd"]]},{"id":"95a54981805b22f2","type":"api-call-service","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Turn On Zone","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":[],"data":"{ \"entity_id\": payload.zone}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":880,"y":2320,"wires":[["02d1e639f7ac6596","7b985932412db47d"]]},{"id":"a4b3eba196a504dc","type":"api-call-service","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Turn Off Zone","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":[],"data":"{ \"entity_id\": payload.zone}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":540,"y":2500,"wires":[["6ea0448df1383ec2"]]},{"id":"02d1e639f7ac6596","type":"change","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Set Delay Variable","rules":[{"t":"set","p":"delay","pt":"msg","to":"payload.time* 60000","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":550,"y":2380,"wires":[["863b8fa63f210ebe"]]},{"id":"8d3c8370996be2da","type":"api-call-service","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Turn On Master Valve","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.irrigation_master_valve"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":560,"y":2320,"wires":[["b1c9631973c2f4b1"]]},{"id":"863b8fa63f210ebe","type":"stoptimer-varidelay","z":"f602e6ba.609d28","g":"a08dae6118c91c19","duration":"5","durationType":"num","units":"Millisecond","payloadtype":"num","payloadval":"0","name":"Delay","reporting":"every_second","persist":false,"ignoretimerpass":false,"x":510,"y":2440,"wires":[["a4b3eba196a504dc","de509d99b9d965b3"],[],["7d8374976c01e3dc"]]},{"id":"7d8374976c01e3dc","type":"mqtt out","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Publish Time Remaining","topic":"sensor/irrigation_time_remaining","qos":"","retain":"","broker":"546e31ed.0db1c","x":790,"y":2460,"wires":[]},{"id":"b0debe46542c4c67","type":"api-call-service","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Notify via Wrapper","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"script","service":"notify_wrapper","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": alert \t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":990,"y":2420,"wires":[[]]},{"id":"de509d99b9d965b3","type":"function","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Create msg object","func":"var message = \"Sprinkler auto-run: \" + msg.payload.name + \" ran for \" + msg.payload.time + \" minutes\"\n\nreturn { alert: message };","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":2420,"wires":[["b0debe46542c4c67"]]},{"id":"b1c9631973c2f4b1","type":"delay","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"2s","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"outputs":1,"x":730,"y":2320,"wires":[["95a54981805b22f2"]]},{"id":"6ea0448df1383ec2","type":"delay","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Delay 10","pauseType":"delay","timeout":"10","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"outputs":1,"x":320,"y":2440,"wires":[["151eb6ba5b2d39cd"]]},{"id":"224d30a98f52c287","type":"api-current-state","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Force Run","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_force_run","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":510,"y":2060,"wires":[["bf015af2161c5ec2"],["38affe5cc680d076"]]},{"id":"5a27d31bfb4a6990","type":"comment","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Actually Handle Watering","info":"","x":1150,"y":2340,"wires":[]},{"id":"197853479ad9eeda","type":"comment","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Decide Which Zones to Run","info":"","x":1020,"y":2160,"wires":[]},{"id":"7b985932412db47d","type":"debug","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Log Zone On","active":false,"tosidebar":true,"console":true,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1100,"y":2280,"wires":[]},{"id":"acdcc72fea065aac","type":"debug","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Log Run Zones","active":false,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":350,"y":2260,"wires":[]},{"id":"f78cdb84200eb171","type":"api-call-service","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.front_bed_irrigation_reason"],"data":"{\"value\":\"Recently Ran\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":750,"y":3380,"wires":[[]]},{"id":"93965a61d2c4f5de","type":"api-current-state","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"< 1\" in 5 Days","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"0.5","halt_if_type":"num","halt_if_compare":"gte","entity_id":"sensor.neighbor_5in1_rain_last_5_days","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":420,"y":620,"wires":[["dd9855ca4017c8c0"],["47f1a8018e58e032"]]},{"id":"54bad548.7e9fcc","type":"ha-get-entities","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Get \"On\" Sprinklers","server":"e1dc0b88.463bb8","version":1,"rules":[{"property":"entity_id","logic":"starts_with","value":"switch.irrigation","valueType":"str"},{"property":"entity_id","logic":"does_not_include","value":"switch.irrigation_master_valve,switch.irrigation_24v_power,switch.irrigation_drip","valueType":"str"},{"property":"state","logic":"is","value":"on","valueType":"str"}],"outputType":"array","outputEmptyResults":true,"outputLocationType":"msg","outputLocation":"payload","outputResultsCount":1,"x":390,"y":100,"wires":[["bcbf413e.7b188"]]},{"id":"5a10cd93.8e94b4","type":"inject","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"60","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":170,"y":100,"wires":[["54bad548.7e9fcc"]]},{"id":"a77808ff.3f1288","type":"switch","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"On Longer than 26 minutes?","property":"payload[0].timeSinceChangedMs","propertyType":"msg","rules":[{"t":"gte","v":"1600000","vt":"num"}],"checkall":"true","repair":false,"outputs":1,"x":720,"y":60,"wires":[["54ae6ec3.1bc63"]]},{"id":"54ae6ec3.1bc63","type":"api-call-service","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Turn Off Zone","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":[],"data":"{ \"entity_id\": payload[0].entity_id }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":980,"y":60,"wires":[[]]},{"id":"bcbf413e.7b188","type":"switch","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"More Than 0 Entities?","property":"payload","propertyType":"msg","rules":[{"t":"nempty"},{"t":"empty"}],"checkall":"true","repair":false,"outputs":2,"x":400,"y":160,"wires":[["a77808ff.3f1288","3b848bce.76aea4"],["656ad2cd6fb99f57"]]},{"id":"3b848bce.76aea4","type":"change","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Reset Delay","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":670,"y":100,"wires":[["cdd3b7ef.04a618"]]},{"id":"43dedcca.ac7734","type":"api-call-service","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Turn Off Master","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":["switch.irrigation_master_valve"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1480,"y":180,"wires":[[]]},{"id":"c42e6d62.7a24c","type":"api-current-state","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Master On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"switch.irrigation_master_valve","state_type":"str","blockInputOverrides":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":750,"y":200,"wires":[["cdd3b7ef.04a618"],["3b848bce.76aea4"]]},{"id":"cdd3b7ef.04a618","type":"trigger","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Wait 1m","op1":"","op2":"0","op1type":"nul","op2type":"str","duration":"1","extend":false,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":880,"y":120,"wires":[["5e9007a27732bba9"]]},{"id":"63f07877e73b952a","type":"switch","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"More Than 0 Entities?","property":"payload","propertyType":"msg","rules":[{"t":"nempty"},{"t":"empty"}],"checkall":"true","repair":false,"outputs":2,"x":1100,"y":180,"wires":[[],["749afd72791a5127"]]},{"id":"5e9007a27732bba9","type":"ha-get-entities","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Get \"On\" Sprinklers","server":"e1dc0b88.463bb8","version":1,"rules":[{"property":"entity_id","logic":"starts_with","value":"switch.irrigation","valueType":"str"},{"property":"entity_id","logic":"does_not_include","value":"switch.irrigation_master_valve,switch.irrigation_24v_power","valueType":"str"},{"property":"state","logic":"is","value":"on","valueType":"str"}],"outputType":"array","outputEmptyResults":true,"outputLocationType":"msg","outputLocation":"payload","outputResultsCount":1,"x":1070,"y":120,"wires":[["63f07877e73b952a"]]},{"id":"061b74f643477dd9","type":"switch","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"More Than 0 Entities?","property":"payload","propertyType":"msg","rules":[{"t":"nempty"},{"t":"empty"}],"checkall":"true","repair":false,"outputs":2,"x":1380,"y":120,"wires":[["43dedcca.ac7734"],[]]},{"id":"749afd72791a5127","type":"trigger","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Wait 1m","op1":"","op2":"0","op1type":"nul","op2type":"str","duration":"5","extend":false,"overrideDelay":false,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":1260,"y":60,"wires":[["061b74f643477dd9"]]},{"id":"656ad2cd6fb99f57","type":"function","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"clear msg","func":"msg = {}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":200,"wires":[["c42e6d62.7a24c"]]},{"id":"c3cb1c7d15767014","type":"api-current-state","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Weather","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"50","halt_if_type":"num","halt_if_compare":"gte","entity_id":"sensor.precip_probability","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":300,"y":860,"wires":[["1d9a4d0bb4645f32"],["eeecfc1e8864e39f"]]},{"id":"38affe5cc680d076","type":"template","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Template: Zone Last Ran >= 71 hours","field":"template","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{%- set entity_name = \"input_datetime{{ payload.zone }}\" | regex_replace(find='switch', replace='', ignorecase=False) -%}\n{%- set time = (as_timestamp(now()) - as_timestamp(states(entity_name+\"_last_start\"))) | int -%}\n{% if time >= 71*3600 %}1{% else %}0{% endif %}","output":"str","x":790,"y":2060,"wires":[["174186fb5d054240"]]},{"id":"62b5545bc6d6e627","type":"template","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Template: Zone Last Ran >= 23 hours","field":"template","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{%- set entity_name = \"input_datetime{{ zones.zone }}\" | regex_replace(find='switch', replace='', ignorecase=False) -%}\n{%- set time = (as_timestamp(now()) - as_timestamp(states(entity_name+\"_last_start\"))) | int -%}\n{% if time >= 23*3600 %}1{% else %}0{% endif %}","output":"str","x":310,"y":3260,"wires":[["aa53225140781dd7"]]}] \ No newline at end of file +[{"id":"9584418c.dafc2","type":"tab","label":"Automations","disabled":false,"info":""},{"id":"f602e6ba.609d28","type":"tab","label":"Irrigation","disabled":false,"info":""},{"id":"9cfe6331fbc680d5","type":"group","z":"9584418c.dafc2","name":"Delivery Logo Object Detection","style":{"label":true},"nodes":["ed80a3f.522526","f3a3e80f.3e8e38","6f08d11c854dfb00","9b7c5535c74a94a3","d8a16fd91366d112","bcaf3569e7816922","d58f6ef71c326040","42be35f83b764861","b2a5543693ac851e","c13f0f20a56d6af5","7151828122e3b80c","bace446bfa7b343d","5acbb2cbdbdea368","c061be05c01527e0","e263410e9a3af7d8","d9e9a93275328762","a12e93d199527cae","b4b8f84a.7e57a8","63fd5090444c9cad","2dfdead1d2e3b78b","c1fe21bcb3184137"],"x":54,"y":2099,"w":1372,"h":322},{"id":"3c4349a7eea9bd3b","type":"group","z":"9584418c.dafc2","name":"Set Cameras Online","style":{"label":true},"nodes":["bd19a17005513c2f","24d1a94e275e5e44","58d0c98797e19829","7a8e43b6f7c84bac","ab66afa5b576de3f","ccf5998fdf8ee50d"],"x":54,"y":1839,"w":492,"h":242},{"id":"35da177d9e2fd258","type":"group","z":"9584418c.dafc2","name":"Virtual Radar Server","style":{"label":true},"nodes":["a9a323de66b6f772","ee139512bcad0966","7da69a7e8ecadc7c","26e32b1d7824356a","3a82b835.c57d48","91afebbf8b9edf05","5684b08aacd6d225","4ca1a5ad47ce7a18","ba68e03143ba4af8","5f1d1b471a1c7cbb","2cd08c8da06afaf6","ea911291f04c7d18","43e5fa289c7550ff","97761f13f8e5c31b","ea239028eda07991"],"x":54,"y":1499,"w":1272,"h":322},{"id":"bd2acc7efb5be5fd","type":"group","z":"9584418c.dafc2","name":"Front Porch Light Occupancy Brightness","style":{"label":true},"nodes":["3f2a2e4d99057b69","3e399d83e4e7f4c3","59f5bc2571b0f12f","c68c969a6b8c2833","b1a99d9698d831b2","17b35d69307a8455","d11c183fff8d848d","fae7fa701710e258","1ef176bec8ed5da0","254a48eabb9cf476"],"x":54,"y":1279,"w":1092,"h":202},{"id":"11e25fc28c23144c","type":"group","z":"9584418c.dafc2","name":"Front House Lights","style":{"label":true},"nodes":["86bc310cbc0562af","2fb6a7afb6502a32","8c55985bffebd56a"],"x":54,"y":1119,"w":472,"h":142},{"id":"b808f2d7ae539c87","type":"group","z":"9584418c.dafc2","name":"Indoor Lights Dim Evening","style":{"label":true},"nodes":["e93027cb.6a6308","fc81cfda.29ff5","8ee35d65.a7569","41b918d5.7ce018","5420f9c0.5356c8","77184c93.8790d4","39a5ce57.78e3d2","ea19fe14.80749","ea2604f9.4cdf98","8a82f465.846018","d8ad0651.bf7a18","d9cc182cc3eb2a93","cde7b3c9ca39891b","1457bf6605a50448","fa90c550.d6c948"],"x":54,"y":659,"w":1073,"h":444},{"id":"9df353d4c0fc9a54","type":"group","z":"9584418c.dafc2","name":"Server Rack Temperature","style":{"label":true},"nodes":["73550501.be7fbc","7dff3ae1.e36a04","88822bfe.2cc598","96b5207d.407dd","b259f0eb.3e83","c7ff978f.ff0728","29b17ed7.fab972"],"x":54,"y":459,"w":932,"h":182},{"id":"18fe74aea06a1180","type":"group","z":"9584418c.dafc2","name":"AC Stale Air","style":{"label":true},"nodes":["ebe84a6f70b4bc2f","cf1c689e51b98aec","6af7abba85612dd9","8b6280c5c448720c","9ce46ce21d8cc964","2b6721107586ceae","830c3ddd08ef396c"],"x":54,"y":299,"w":1132,"h":142},{"id":"cf3a0410bcf837ae","type":"group","z":"9584418c.dafc2","name":"Door Alerts","style":{"label":true},"nodes":["2022689a.938918","8ec438b6.4eb2e8","9c1d9c7c.ed9c7","896f5b34.7b4328","c5124616.c9bd48","f9d93af6.184028","3314ec9f.ca8994","5c24f744.30fcb8","6aa388d0.707768","cf758271.d4fd6","5a740c2d.009864","c5c85c0aa2d8c8ca","28fa66cd.af058a","aee87977a0670889"],"x":54,"y":19,"w":1012,"h":262},{"id":"3cf0491ac33aecfa","type":"group","z":"f602e6ba.609d28","name":"Max Time and Master Valve Control","style":{"label":true},"nodes":["54bad548.7e9fcc","5a10cd93.8e94b4","a77808ff.3f1288","54ae6ec3.1bc63","bcbf413e.7b188","3b848bce.76aea4","43dedcca.ac7734","c42e6d62.7a24c","cdd3b7ef.04a618","63f07877e73b952a","5e9007a27732bba9","061b74f643477dd9","749afd72791a5127","656ad2cd6fb99f57"],"x":54,"y":19,"w":1532,"h":222},{"id":"43a30fe5a5052c22","type":"group","z":"f602e6ba.609d28","name":"Custom Water","style":{"label":true},"nodes":["d269f175.c9dc6","3367e45f.cc981c","116d5bb3.ee92a4","80df47d5.602888","fb46876c.845298","98eeafa7.bd2b9","565ee5c1.561bfc","22a20603.86a06a","a8d96e.1f00969","808e6a81.92e2e8","883f2c00.1d94e8","e42ff3d9.593dc","76160bc4.8cd644","e2c37b65c5582c2b","860a4c61d7557dc9"],"x":54,"y":259,"w":1452,"h":262},{"id":"a9182c2cc04d2d9a","type":"group","z":"f602e6ba.609d28","name":"Irrigation Delays","style":{"label":true},"nodes":["dd9855ca4017c8c0","c3a696a117416327","27f2580e35031830","9cb8187c669c6485","47f1a8018e58e032","427f7fa58d86cc59","1d9a4d0bb4645f32","d9ebbaa37f5911a9","eeecfc1e8864e39f","89487a4efedec1db","1e4b3bc7c25b294f","2c45af5b3ee5cf0a","d7e50e7a2810667d","28936ec687ee4eb0","974833b6a2eca853","478a5a84d38ba181","c01fd0612615e927","93965a61d2c4f5de","c3cb1c7d15767014"],"x":54,"y":539,"w":752,"h":502},{"id":"0f07749a4e1672ad","type":"group","z":"f602e6ba.609d28","name":"Supply Voltage Control","style":{"label":true},"nodes":["1ae21386.a831bc","117145a7.67e99a","882aff35f788008b"],"x":54,"y":1059,"w":472,"h":142},{"id":"a08dae6118c91c19","type":"group","z":"f602e6ba.609d28","name":"Run Lawn","style":{"label":true},"nodes":["f2c9c3a5b8b11a64","9896327569c234da","e95ac52f03478921","174186fb5d054240","287dd3b1af5dc2d0","74cd40702021e86d","bf015af2161c5ec2","151eb6ba5b2d39cd","45ee74d06e9cac2c","95a54981805b22f2","a4b3eba196a504dc","02d1e639f7ac6596","8d3c8370996be2da","863b8fa63f210ebe","7d8374976c01e3dc","b0debe46542c4c67","de509d99b9d965b3","b1c9631973c2f4b1","6ea0448df1383ec2","224d30a98f52c287","5a27d31bfb4a6990","197853479ad9eeda","7b985932412db47d","acdcc72fea065aac","38affe5cc680d076"],"x":54,"y":2019,"w":1272,"h":522},{"id":"79694877249c9902","type":"group","z":"f602e6ba.609d28","name":"Attempt Lawn","style":{"label":true},"nodes":["3b656b89.1ac154","493b435f.c9851c","7b12e66f.57d068","8c060f00.cf577","4422f61c.847d88","dcdeabc7.780578","722d03d6.2ff77c","af4788fe.215ba8","c90fd5e6.c5c678","862ad27a.d347d","83edf648.3f9ed8","8d4bfe8e.ee805","815fddc0.6604c","06d6255efdc31c47","5420d0eed32223fb","3ff9ce03ef7b554b","576b66fa1bd202a3","a3d75225807b70eb","219b37105a8304f1","e7430e17f0b24ed8","b6e7d5b8891bba6d","339ee0ada21856e0","d01fbafafbb34692","f5684be88477322f","336585d4eee0ca73","b3c4a3638c17629e","2fc67b25514de5a5","08e3098cf183e086"],"x":54,"y":1219,"w":672,"h":782},{"id":"68ec980b932fdba7","type":"group","z":"f602e6ba.609d28","name":"Attempt Front Beds","style":{"label":true},"nodes":["583f46a3.fc4c38","d9147878.b61cf8","c7e5552e.7f8a08","6bcf06fb.9ca748","f587589f.d739e8","d9d17e8f.590e6","d9f893eb.834f3","9d851699.6a8458","4fae5b92.a9cd44","418058c4.af3158","7350c911a0b1a86d","fdcfa1521191fa40","4f2902edc77f2d3b","f6881b4bf93c27c5","ed6e3d4225582e20","593bee0e8c958df8","67916c3a5554a794","f7ac7a90f3da2298","45c5dbbbd8ce50a1","abb8777dd08aa743","d8637d8d96b68fca","b403eec7866aea22"],"x":54,"y":2559,"w":672,"h":582},{"id":"55a2162532da4e14","type":"group","z":"f602e6ba.609d28","name":"Run Front Beds","style":{"label":true},"nodes":["a2ab7368.923fb","a31e3daf.17207","21ced698.708b5a","c661d489.9c9bc8","accc6697.196268","487ff788.8c5c98","2238b09b.1b5b5","84258ddd.41da4","9129b06e.d8925","5ce1803b.06628","aa53225140781dd7","8113d83074ff7701","d83b5ff7a2212931","f78cdb84200eb171","62b5545bc6d6e627"],"x":54,"y":3159,"w":1332,"h":262},{"id":"59ea88a27ef998e7","type":"group","z":"9584418c.dafc2","name":"Drone Delivery Logo Object Detection","style":{"label":true},"nodes":["4e2d750742dc8890","cdc9c2c982e3fe5f","300267d7c89b0955","1ae58f8afe36e04c","5c59c5c412e759ce","aa523c5cbfe26949","b4392caec775b305","81d6e9a99eb61c67","8bec0433aa6e51fa","1aa9e39b6be88864","ec51454057c055e2","765c7c5a61100728","1bda1e8b7f76e5f3","14855ff357d5fbad","a95b4fa60f1238d7","081d788e92e34986","9799e777bb06f63f","6d56b297fcfe0016","2f18405339079200","b4d7bb6e129bacea","b442c20392c7ce60","ec6b4698123ebc34"],"x":54,"y":2439,"w":1412,"h":282},{"id":"cb7e3560a0078392","type":"group","z":"9584418c.dafc2","name":"Global Entry Schedule","style":{"label":true},"nodes":["5123f652827fa902","970920516fa379e8","51f2291060d07336","91d3d26774f9468e","7415468104c18108","b8a4a1ee4e15f778","79c00f8c61888f52","a61d605915dc23ff","c44a5c4d6d17ee9f","fa9f2ef8fecf1de2","7d01abce7bc68291","b7c50947c4507d03","1480d9470754a6a3","ca8d58af48d7b7c5","414a38bf0735b27c","c0546e86d17e99e9","d5ab0aa6d198ba81","88d3b091fc333998","1b266e9b338a4dfe","85644b2ab18e7141","041a81d375ec985d","bfbece91f0b61e8b","f3b23466b80725e0"],"x":54,"y":2739,"w":1102,"h":342},{"id":"26b2ac79d4c32bda","type":"group","z":"9584418c.dafc2","name":"Timelapse","style":{"label":true},"nodes":["83e2179938d08d58","59e4459459f077c9","089b07fa48286f29","7ff9bf1a917cbf50","a826a8c498d6d1e3"],"x":54,"y":3099,"w":612,"h":262},{"id":"6f393a92ae952332","type":"group","z":"9584418c.dafc2","name":"Faucet Auto Drip","style":{"label":true},"nodes":["08b26d8311cd9187","716e8fabff85ffb9","7b988b93a658f526","7fe1e564efbd46af","16e1a3e2f53e6bdf","d85faf19968afde1"],"x":54,"y":3379,"w":1032,"h":202},{"id":"e28fc796ce042622","type":"group","z":"9584418c.dafc2","name":"Generic Listener to Push Notifications from SMTP Inbox","style":{"label":true},"nodes":["7eb1a3d60fccbc76","cb1f141562c8fd2b","1cd709e001bf5e89","7f48460e08988c9e","24fc1882c8436738"],"x":54,"y":3599,"w":892,"h":142},{"id":"445e81780ba935ac","type":"group","z":"9584418c.dafc2","name":"License Plate Garage Door","style":{"label":true},"nodes":["5caa1a9942bc27ee","9b25e9a8817a7d8e","ae58df44bf002167","7c060a1e3c0ff12e","4fc565f7b86648dc","220bca8570d66770","184d6d5272648136","500ee424e3f6b6a1","39be459cb7126ab9","6f27f3028b1805e2","004c0ae121925ea2","89d145fdfdd9fe04","5218eca8a79a79a5","1fce953ec4b1ee3d","b70d2ca780b98259","8c5272ae89e85e74","8067ec66aa846765","6648e0bdaa2d8170"],"x":54,"y":3899,"w":1392,"h":322},{"id":"e1dc0b88.463bb8","type":"server","name":"Home Assistant","version":5,"addon":false,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":false,"cacheJson":true,"heartbeat":true,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true},{"id":"546e31ed.0db1c","type":"mqtt-broker","name":"Mosquitto","broker":"10.0.1.22","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"9f81fd881d01a666","type":"position-config","name":"","isValide":"true","longitude":"0","latitude":"0","angleType":"deg","timeZoneOffset":"99","timeZoneDST":"0","stateTimeFormat":"3","stateDateFormat":"12","contextStore":""},{"id":"4f8f8feffed26998","type":"sqlitedb","db":"/data/amazon.db","mode":"RWC"},{"id":"96b8babe5c0a6107","type":"deepstack-server","proto":"http","host":"codeproject","port":"32168","version":"v1","rejectUnauthorized":true},{"id":"27555ce732fc54b0","type":"global-config","name":"global-config","env":[{"name":"bb_pass","value":"PASSWORD","type":"str"},{"name":"bb_number","value":"19402326788","type":"str"},{"name":"plate_andrew","value":"BNW7211","type":"str"}]},{"id":"169e2bac20a4c980","type":"deepstack-server","proto":"http","host":"codeproject","port":"32168","version":"v1/vision/alpr","rejectUnauthorized":true},{"id":"2022689a.938918","type":"api-call-service","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Notify Via Wrapper: Opened 1 Minute","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"script","service":"notify_wrapper","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": \"The \" & $lowercase(msg.data.new_state.attributes.friendly_name) & \" has been opened for 1 minute\"\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":890,"y":120,"wires":[[]]},{"id":"8ec438b6.4eb2e8","type":"api-current-state","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Door Notify On","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"true","halt_if_type":"bool","halt_if_compare":"is","entity_id":"input_boolean.door_notify","state_type":"habool","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":360,"y":60,"wires":[["c5124616.c9bd48"],[]]},{"id":"9c1d9c7c.ed9c7","type":"change","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Reset If Closed","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":360,"y":220,"wires":[["5c24f744.30fcb8","cf758271.d4fd6","5a740c2d.009864","28fa66cd.af058a"]]},{"id":"896f5b34.7b4328","type":"api-call-service","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Notify Via Wrapper","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"script","service":"notify_wrapper","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": payload, \"data\": {\"priority\": 1} \t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":950,"y":60,"wires":[[]]},{"id":"c5124616.c9bd48","type":"template","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Opened","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{{ data.new_state.attributes.friendly_name }} opened","output":"str","x":740,"y":60,"wires":[["896f5b34.7b4328"]]},{"id":"f9d93af6.184028","type":"server-state-changed","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Door Opened","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"binary_sensor.*_door$","entityIdType":"regex","outputInitially":false,"stateType":"habool","ifState":"true","ifStateType":"bool","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":150,"y":100,"wires":[["8ec438b6.4eb2e8","5c24f744.30fcb8","cf758271.d4fd6","5a740c2d.009864","28fa66cd.af058a"],["9c1d9c7c.ed9c7"]]},{"id":"73550501.be7fbc","type":"trigger-state","z":"9584418c.dafc2","d":true,"g":"9df353d4c0fc9a54","name":"Rack Temperature","server":"e1dc0b88.463bb8","version":4,"inputs":1,"outputs":2,"exposeAsEntityConfig":"","entityId":"sensor.rack_exhaust_temperature","entityIdType":"exact","debugEnabled":false,"constraints":[],"customOutputs":[],"outputInitially":false,"stateType":"num","enableInput":true,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"x":170,"y":560,"wires":[["7dff3ae1.e36a04"],[]]},{"id":"7dff3ae1.e36a04","type":"switch","z":"9584418c.dafc2","g":"9df353d4c0fc9a54","name":"Above 90?","property":"payload","propertyType":"msg","rules":[{"t":"gt","v":"95","vt":"num"},{"t":"lte","v":"90","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":350,"y":560,"wires":[["29b17ed7.fab972"],["96b5207d.407dd"]]},{"id":"88822bfe.2cc598","type":"api-call-service","z":"9584418c.dafc2","g":"9df353d4c0fc9a54","name":"Turn on Fan","server":"e1dc0b88.463bb8","version":5,"domain":"homeassistant","service":"turn_on","areaId":[],"deviceId":[],"entityId":["fan.rack_fan"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":true,"outputProperties":[],"queue":"none","x":710,"y":500,"wires":[[]]},{"id":"96b5207d.407dd","type":"api-current-state","z":"9584418c.dafc2","g":"9df353d4c0fc9a54","name":"Rack Fan","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"true","halt_if_type":"bool","halt_if_compare":"is","entity_id":"fan.rack_fan","state_type":"habool","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":540,"y":580,"wires":[["c7ff978f.ff0728"],[]]},{"id":"b259f0eb.3e83","type":"api-call-service","z":"9584418c.dafc2","g":"9df353d4c0fc9a54","name":"Turn off fan","server":"e1dc0b88.463bb8","version":5,"domain":"homeassistant","service":"turn_off","areaId":[],"deviceId":[],"entityId":["fan.rack_fan"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":true,"outputProperties":[],"queue":"none","x":890,"y":540,"wires":[[]]},{"id":"e93027cb.6a6308","type":"api-current-state","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"Master Bedroom Lamps On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.master_bedroom_lamps","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":680,"y":702,"wires":[["fc81cfda.29ff5"],[]]},{"id":"fc81cfda.29ff5","type":"api-call-service","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"Set brightness to 128","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":[],"data":"{\"brightness\":\"128\",\"transition\":5, \"entity_id\": msg.data.entity_id}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1001,"y":700,"wires":[[]]},{"id":"c7ff978f.ff0728","type":"api-current-state","z":"9584418c.dafc2","g":"9df353d4c0fc9a54","name":"Rack fan auto off?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.rack_fan_auto_off","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":730,"y":600,"wires":[["b259f0eb.3e83"],[]]},{"id":"29b17ed7.fab972","type":"api-current-state","z":"9584418c.dafc2","g":"9df353d4c0fc9a54","name":"Rack Fan","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"true","halt_if_type":"bool","halt_if_compare":"is","entity_id":"fan.rack_fan","state_type":"habool","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":540,"y":520,"wires":[[],["88822bfe.2cc598"]]},{"id":"3314ec9f.ca8994","type":"server-state-changed","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Garage Opened","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"cover.garage_door","entityIdType":"regex","outputInitially":false,"stateType":"str","ifState":"open","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":160,"y":160,"wires":[["8ec438b6.4eb2e8"],[]]},{"id":"8ee35d65.a7569","type":"api-current-state","z":"9584418c.dafc2","d":true,"g":"b808f2d7ae539c87","name":"Kitchen Cans On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.kitchen_can_lights","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":650,"y":942,"wires":[["5420f9c0.5356c8"],[]]},{"id":"41b918d5.7ce018","type":"api-current-state","z":"9584418c.dafc2","d":true,"g":"b808f2d7ae539c87","name":"Kitchen Table On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.kitchen_table_light","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":650,"y":1062,"wires":[["d8ad0651.bf7a18"],[]]},{"id":"5420f9c0.5356c8","type":"api-call-service","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"Set brightness to 40","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":[],"data":"{\"brightness\":\"40\",\"transition\": \"5\", \"entity_id\": msg.data.entity_id}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1000,"y":842,"wires":[[]]},{"id":"77184c93.8790d4","type":"api-current-state","z":"9584418c.dafc2","d":true,"g":"b808f2d7ae539c87","name":"Kitchen Sink On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.kitchen_sink_light","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":650,"y":882,"wires":[["5420f9c0.5356c8"],[]]},{"id":"39a5ce57.78e3d2","type":"api-current-state","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"Living Room Cans On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.living_room_can_lights","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":670,"y":822,"wires":[["5420f9c0.5356c8"],[]]},{"id":"5c24f744.30fcb8","type":"trigger","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Wait 5m","op1":"","op2":"5","op1type":"nul","op2type":"str","duration":"5","extend":false,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":620,"y":160,"wires":[["6aa388d0.707768","aee87977a0670889"]]},{"id":"6aa388d0.707768","type":"api-call-service","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Alexa Announce Opened","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"alexa_media","areaId":[],"deviceId":[],"entityId":[],"data":"{\"message\":\"The\" & $lowercase(msg.data.new_state.attributes.friendly_name) & \"has been opened for\" & msg.payload & \" minutes.\",\"data\":{\"method\":\"all\",\"type\":\"announce\"},\"target\":[\"Office\",\"Kitchen\",\"Master\",\"Living Room\"]}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":850,"y":220,"wires":[[]]},{"id":"cf758271.d4fd6","type":"trigger","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Wait 10m","op1":"","op2":"10","op1type":"nul","op2type":"str","duration":"10","extend":false,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":620,"y":200,"wires":[["6aa388d0.707768"]]},{"id":"5a740c2d.009864","type":"trigger","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Wait 15m","op1":"","op2":"15","op1type":"nul","op2type":"str","duration":"15","extend":false,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":620,"y":240,"wires":[["6aa388d0.707768"]]},{"id":"ea19fe14.80749","type":"api-current-state","z":"9584418c.dafc2","d":true,"g":"b808f2d7ae539c87","name":"Entryway On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.entryway_light","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":640,"y":1002,"wires":[["5420f9c0.5356c8"],[]]},{"id":"ea2604f9.4cdf98","type":"api-current-state","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"Living Room Sconces On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"light.living_room_sconces","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":680,"y":762,"wires":[["fc81cfda.29ff5"],[]]},{"id":"8a82f465.846018","type":"comment","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"100% = 255","info":"","x":970,"y":773,"wires":[]},{"id":"d8ad0651.bf7a18","type":"api-call-service","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"Set brightness to 80","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":[],"data":"{\"brightness\":\"80\",\"transition\": \"5\", \"entity_id\": msg.data.entity_id}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1000,"y":922,"wires":[[]]},{"id":"86bc310cbc0562af","type":"inject","z":"9584418c.dafc2","g":"11e25fc28c23144c","name":"At 10:30PM","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"30 22 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":170,"y":1200,"wires":[["2fb6a7afb6502a32","8c55985bffebd56a"]]},{"id":"2fb6a7afb6502a32","type":"api-call-service","z":"9584418c.dafc2","g":"11e25fc28c23144c","name":"Front Porch Lights Off","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_off","areaId":[],"deviceId":[],"entityId":["light.front_porch_lights"],"data":"{ \"transition\": 5 }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":400,"y":1220,"wires":[[]]},{"id":"3f2a2e4d99057b69","type":"server-state-changed","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Front Door Motion","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"binary_sensor.front_door_all_occupancy","entityIdType":"exact","outputInitially":false,"stateType":"habool","ifState":"true","ifStateType":"bool","ifStateOperator":"is","outputOnlyOnStateChange":false,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":170,"y":1380,"wires":[["17b35d69307a8455","d11c183fff8d848d"],[]]},{"id":"3e399d83e4e7f4c3","type":"api-call-service","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Front Porch Lights to 254","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":["light.front_porch_lights"],"data":"{\"brightness\":\"254\",\"transition\":2}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":710,"y":1360,"wires":[["1ef176bec8ed5da0","59f5bc2571b0f12f"]]},{"id":"59f5bc2571b0f12f","type":"delay","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"","pauseType":"delay","timeout":"60","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":560,"y":1440,"wires":[["c68c969a6b8c2833"]]},{"id":"c68c969a6b8c2833","type":"api-call-service","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Front Porch Lights Off","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_off","areaId":[],"deviceId":[],"entityId":["light.front_porch_lights"],"data":"{ \"transition\": 5 }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":780,"y":1440,"wires":[["254a48eabb9cf476"]]},{"id":"d9cc182cc3eb2a93","type":"inject","z":"9584418c.dafc2","d":true,"g":"b808f2d7ae539c87","name":"At 10 PM","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 22 * * 3","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":160,"y":742,"wires":[["1457bf6605a50448"]]},{"id":"b1a99d9698d831b2","type":"server-state-changed","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Front Door Open","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"binary_sensor.front_door","entityIdType":"exact","outputInitially":false,"stateType":"habool","ifState":"true","ifStateType":"bool","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":160,"y":1440,"wires":[["17b35d69307a8455","d11c183fff8d848d"],[]]},{"id":"17b35d69307a8455","type":"within-time-switch","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"","nameInt":"","positionConfig":"9f81fd881d01a666","startTime":"22:30","startTimeType":"entered","startOffset":0,"startOffsetType":"none","startOffsetMultiplier":60000,"endTime":"sunriseStart","endTimeType":"pdsTime","endOffset":"-30","endOffsetType":"num","endOffsetMultiplier":60000,"timeRestrictions":0,"timeRestrictionsType":"none","timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","propertyStart":"","propertyStartType":"none","propertyStartCompare":"true","propertyStartThreshold":"","propertyStartThresholdType":"num","startTimeAlt":"","startTimeAltType":"entered","startOffsetAlt":0,"startOffsetAltType":"none","startOffsetAltMultiplier":60000,"propertyEnd":"","propertyEndType":"none","propertyEndCompare":"true","propertyEndThreshold":"","propertyEndThresholdType":"num","endTimeAlt":"","endTimeAltType":"entered","endOffsetAlt":0,"endOffsetAltType":"none","endOffsetAltMultiplier":60000,"withinTimeValue":"","withinTimeValueType":"msgInput","outOfTimeValue":"","outOfTimeValueType":"msgInput","tsCompare":"0","x":400,"y":1380,"wires":[["3e399d83e4e7f4c3"],[]]},{"id":"d11c183fff8d848d","type":"change","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Reset","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":350,"y":1440,"wires":[["59f5bc2571b0f12f"]]},{"id":"a9a323de66b6f772","type":"http request","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Get Aircraft","method":"GET","ret":"obj","paytoqs":"ignore","url":"http://vrs:8080/VirtualRadar/AircraftList.json","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"Content-Type","valueType":"other","valueValue":"application/json"}],"x":610,"y":1660,"wires":[["7da69a7e8ecadc7c","91afebbf8b9edf05","4ca1a5ad47ce7a18","2cd08c8da06afaf6","43e5fa289c7550ff"]]},{"id":"ee139512bcad0966","type":"inject","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Every 20 Seconds","props":[],"repeat":"20","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":190,"y":1660,"wires":[["ea239028eda07991"]]},{"id":"7da69a7e8ecadc7c","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Amazon","func":"var alert = {}\nvar message = \"Airborne:\\n\"\n\nfor (var i = 0; i < msg.payload.acList.length; i++) {\n if (typeof msg.payload.acList[i].Reg !== \"undefined\" && typeof msg.payload.acList[i].Man !== \"undefined\") {\n if (msg.payload.acList[i].Man.toLowerCase().includes(\"amazon\")) {\n //if (msg.payload.acList[i].Reg.endsWith(\"PA\") && msg.payload.acList[i].Man.toLowerCase().includes(\"amazon\")) {\n alert[msg.payload.acList[i].Reg] = msg.payload.acList[i].Icao\n }\n }\n}\n\nif (Object.keys(alert).length > 0) {\n for (const [key, value] of Object.entries(alert)) {\n message += key + \": https://globe.adsbexchange.com/?icao=\" + value + \"\\n\"\n }\n return { payload: message + \"https://vrs.aneis.ch\" }\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":780,"y":1660,"wires":[["5684b08aacd6d225"]]},{"id":"26e32b1d7824356a","type":"api-call-service","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Notify Via Signal","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"signal_adsb","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": payload \t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1200,"y":1660,"wires":[[]]},{"id":"3a82b835.c57d48","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Rate Limiter","func":"var interval = (1000*60*10); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1010,"y":1600,"wires":[["26e32b1d7824356a"]]},{"id":"91afebbf8b9edf05","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Interesting Tail #","func":"var alert = {}\nvar message = \"Interesting:\\n\"\n// N518GS George Strait\n// N628TS Elon\n// N898TS Taylor Swift\n// N621MM Taylor Swift\n// 82-8000 AF1\n// 92-9000 AF1\n// N5DA Don Adams Prop\n// N4DA Don Adams Lear\n// N68885 Zuckerberg\n// N681JK JB\n// N635PA\n// N628PA\n// N636PA\nvar interesting = [\"N68885\", \"N518GS\", \"N628TS\", \"82-8000\", \"92-9000\", \"N621MM\", \"N898TS\", \"N681JK\", \"N635PA\", \"N628PA\", \"N636PA\"]\n\nfor (var i = 0; i < msg.payload.acList.length; i++) {\n if (typeof msg.payload.acList[i].Reg !== \"undefined\") {\n if (interesting.includes(msg.payload.acList[i].Reg)) {\n alert[msg.payload.acList[i].Reg] = msg.payload.acList[i].Icao\n }\n }\n}\n\nif (Object.keys(alert).length > 0) {\n for (const [key, value] of Object.entries(alert)) {\n message += key + \": https://globe.adsbexchange.com/?icao=\" + value + \"\\n\"\n }\n return { payload: message + \"https://vrs.aneis.ch\" }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":1600,"wires":[["3a82b835.c57d48"]]},{"id":"5684b08aacd6d225","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Rate Limiter","func":"var interval = (1000*60); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1010,"y":1660,"wires":[["26e32b1d7824356a"]]},{"id":"4ca1a5ad47ce7a18","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Amazon Landing","func":"var alert = {}\nvar message = \"Landing:\\n\"\n\nfor (var i = 0; i < msg.payload.acList.length; i++) {\n if (typeof msg.payload.acList[i].Reg !== \"undefined\" && typeof msg.payload.acList[i].Man !== \"undefined\") {\n //if (msg.payload.acList[i].Reg.endsWith(\"PA\") && msg.payload.acList[i].Man.toLowerCase().includes(\"amazon\")) {\n if (msg.payload.acList[i].Man.toLowerCase().includes(\"amazon\")) {\n if (msg.payload.acList[i].Alt < 50){\n alert[msg.payload.acList[i].Reg] = msg.payload.acList[i].Icao\n }\n }\n }\n}\n\nif (Object.keys(alert).length > 0) {\n for (const [key, value] of Object.entries(alert)) {\n message += key + \": https://globe.adsbexchange.com/?icao=\" + value + \"\\n\"\n }\n return { payload: message + \"https://vrs.aneis.ch\" }\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":810,"y":1720,"wires":[["ba68e03143ba4af8"]]},{"id":"ba68e03143ba4af8","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Rate Limiter","func":"var interval = (1000*60); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1010,"y":1720,"wires":[["26e32b1d7824356a"]]},{"id":"5f1d1b471a1c7cbb","type":"sqlite","z":"9584418c.dafc2","g":"35da177d9e2fd258","mydb":"4f8f8feffed26998","sqlquery":"msg.topic","sql":"","name":"Amazon","x":1000,"y":1780,"wires":[["ea911291f04c7d18"]]},{"id":"2cd08c8da06afaf6","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Write Amazon Landing","func":"var sql = \"\"\n\nfor (var i = 0; i < msg.payload.acList.length; i++) {\n var latlong = \"0,0\"\n if (typeof msg.payload.acList[i].Reg !== \"undefined\" && typeof msg.payload.acList[i].Lat !== \"undefined\" && typeof msg.payload.acList[i].Long !== \"undefined\") {\n //if (msg.payload.acList[i].Reg.endsWith(\"PA\") && msg.payload.acList[i].Man.toLowerCase().includes(\"amazon\")) {\n if (msg.payload.acList[i].Man.toLowerCase().includes(\"amazon\")) {\n if (msg.payload.acList[i].Alt < 50){\n latlong = msg.payload.acList[i].Lat + \",\" + msg.payload.acList[i].Long.toString()\n sql += `INSERT INTO deliveries (timestamp, registration, latlong, altitude) VALUES (\"${Date.now()}\", \"${msg.payload.acList[i].Reg}\", \"${latlong}\", \"${msg.payload.acList[i].Alt}\"); `\n }\n }\n }\n}\n\nif (sql.length > 0){\n msg.topic = sql\n return msg;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":820,"y":1780,"wires":[["5f1d1b471a1c7cbb"]]},{"id":"ea911291f04c7d18","type":"api-call-service","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Generate Heatmap","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"shell_command","service":"generate_heatmap","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1210,"y":1780,"wires":[[]]},{"id":"cde7b3c9ca39891b","type":"link in","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"","links":["1457bf6605a50448"],"x":325,"y":722,"wires":[["e93027cb.6a6308","ea2604f9.4cdf98","39a5ce57.78e3d2","77184c93.8790d4","8ee35d65.a7569","ea19fe14.80749","41b918d5.7ce018"]]},{"id":"1457bf6605a50448","type":"link out","z":"9584418c.dafc2","g":"b808f2d7ae539c87","name":"","links":["cde7b3c9ca39891b"],"x":295,"y":722,"wires":[]},{"id":"8c55985bffebd56a","type":"api-call-service","z":"9584418c.dafc2","g":"11e25fc28c23144c","name":"Front Sconces Off","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_off","areaId":[],"deviceId":[],"entityId":["light.front_sconces"],"data":"{ \"transition\": 5 }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":390,"y":1160,"wires":[[]]},{"id":"fae7fa701710e258","type":"server-state-changed","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Front Door Unlock","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"lock.front_door","entityIdType":"exact","outputInitially":false,"stateType":"str","ifState":"unlocked","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":false,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":170,"y":1320,"wires":[["17b35d69307a8455","d11c183fff8d848d"],[]]},{"id":"ebe84a6f70b4bc2f","type":"inject","z":"9584418c.dafc2","g":"18fe74aea06a1180","name":"Every 30 Minutes","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"1800","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":190,"y":340,"wires":[["830c3ddd08ef396c"]]},{"id":"cf1c689e51b98aec","type":"api-current-state","z":"9584418c.dafc2","g":"18fe74aea06a1180","name":"Thermostat Idle","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"Idle","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.thermostat_state","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":440,"y":340,"wires":[["6af7abba85612dd9"],[]]},{"id":"6af7abba85612dd9","type":"function","z":"9584418c.dafc2","g":"18fe74aea06a1180","name":"Idle > 2 hours","func":"// If last changed > 3 hours\nif (parseInt(msg.payload.timeSinceChangedMs) > 3600000*2) {\n return msg;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":560,"y":400,"wires":[["8b6280c5c448720c"]]},{"id":"8b6280c5c448720c","type":"api-call-service","z":"9584418c.dafc2","g":"18fe74aea06a1180","name":"Turn AC Fan on Low","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"climate","service":"set_fan_mode","areaId":[],"deviceId":[],"entityId":["climate.thermostat"],"data":"{\"fan_mode\":\"low\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":760,"y":340,"wires":[["9ce46ce21d8cc964"]]},{"id":"9ce46ce21d8cc964","type":"delay","z":"9584418c.dafc2","g":"18fe74aea06a1180","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":900,"y":400,"wires":[["2b6721107586ceae"]]},{"id":"2b6721107586ceae","type":"api-call-service","z":"9584418c.dafc2","g":"18fe74aea06a1180","name":"Turn AC Fan on Auto","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"climate","service":"set_fan_mode","areaId":[],"deviceId":[],"entityId":["climate.thermostat"],"data":"{\"fan_mode\":\"auto\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1060,"y":340,"wires":[[]]},{"id":"830c3ddd08ef396c","type":"api-current-state","z":"9584418c.dafc2","g":"18fe74aea06a1180","name":"Attic > 100","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"100","halt_if_type":"num","halt_if_compare":"gt","entity_id":"sensor.netatmo_home_attic_temperature","state_type":"str","blockInputOverrides":true,"outputProperties":[{"property":"attic","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":290,"y":400,"wires":[["cf1c689e51b98aec"],[]]},{"id":"43e5fa289c7550ff","type":"function","z":"9584418c.dafc2","d":true,"g":"35da177d9e2fd258","name":"Speedy","func":"var alert = {}\nvar message = \"Speedy:\\n\"\n\nfor (var i = 0; i < msg.payload.acList.length; i++) {\n if (typeof msg.payload.acList[i].Reg !== \"undefined\") {\n if (typeof msg.payload.acList[i].Spd == \"number\") {\n if (msg.payload.acList[i].Spd > 600) {\n alert[msg.payload.acList[i].Reg] = msg.payload.acList[i].Icao\n }\n }\n }\n}\n\nif (Object.keys(alert).length > 0) {\n for (const [key, value] of Object.entries(alert)) {\n message += key + \": https://globe.adsbexchange.com/?icao=\" + value + \"\\n\"\n }\n return { payload: message + \"https://vrs.aneis.ch\" }\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":780,"y":1540,"wires":[["97761f13f8e5c31b"]]},{"id":"97761f13f8e5c31b","type":"function","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"Rate Limiter","func":"var interval = (1000*60*10); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1010,"y":1540,"wires":[["26e32b1d7824356a"]]},{"id":"ed80a3f.522526","type":"server-state-changed","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Vehicle Detected","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"sensor.street_car_count","entityIdType":"exact","outputInitially":false,"stateType":"str","ifState":"0","ifStateType":"num","ifStateOperator":"gt","outputOnlyOnStateChange":false,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":160,"y":2200,"wires":[["bcaf3569e7816922"],[]]},{"id":"f3a3e80f.3e8e38","type":"function","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Image to Payload","func":"msg = {\n payload: msg.payload,\n event_id: msg.event_id,\n loops: msg.loops\n};\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":930,"y":2200,"wires":[["e263410e9a3af7d8"]]},{"id":"6f08d11c854dfb00","type":"file","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Write File","filename":"/data/logo.jpg","filenameType":"str","appendNewline":true,"createDir":false,"overwriteFile":"true","encoding":"none","x":1000,"y":2260,"wires":[["b2a5543693ac851e"]]},{"id":"9b7c5535c74a94a3","type":"function","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Output msg","func":"msg = {\n payload: msg.outlinedImage,\n detection_result: msg.payload[0].label,\n event_id: msg.event_id\n};\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":850,"y":2260,"wires":[["6f08d11c854dfb00"]]},{"id":"d8a16fd91366d112","type":"switch","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Match Found","property":"payload","propertyType":"msg","rules":[{"t":"nempty"}],"checkall":"true","repair":false,"outputs":1,"x":430,"y":2260,"wires":[["63fd5090444c9cad"]]},{"id":"bcaf3569e7816922","type":"http request","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Get Events","method":"GET","ret":"txt","paytoqs":"ignore","url":"http://frigate:5000/api/events?cameras=driveway&labels=car&has_snapshot=1&zones=street&in_progress=1&limit=1","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":350,"y":2200,"wires":[["d58f6ef71c326040"]]},{"id":"d58f6ef71c326040","type":"function","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Extract Event ID","func":"if (JSON.parse(msg.payload).length > 0) {\n msg = {\n event_id: JSON.parse(msg.payload)[0].id,\n };\n return msg;\n}\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":540,"y":2200,"wires":[["c13f0f20a56d6af5"]]},{"id":"bd19a17005513c2f","type":"inject","z":"9584418c.dafc2","g":"3c4349a7eea9bd3b","name":"Every 15 Minutes","props":[],"repeat":"900","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":190,"y":1940,"wires":[["24d1a94e275e5e44","ab66afa5b576de3f","7a8e43b6f7c84bac","58d0c98797e19829","ccf5998fdf8ee50d"]]},{"id":"24d1a94e275e5e44","type":"http request","z":"9584418c.dafc2","g":"3c4349a7eea9bd3b","name":"Set Doorbell Online","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.34/cgi-bin/configManager.cgi?action=setConfig&VSP_PaaS.Online=true","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":410,"y":2000,"wires":[[]]},{"id":"42be35f83b764861","type":"http request","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Add SubLabel","method":"POST","ret":"txt","paytoqs":"ignore","url":"http://frigate:5000/api/events/{{{event_id}}}/sub_label","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"Content-type","valueType":"other","valueValue":"application/json"}],"x":1320,"y":2340,"wires":[[]]},{"id":"b2a5543693ac851e","type":"function","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Detection to payload","func":"var new_msg = {\n payload: { \"subLabel\": msg.detection_result },\n detection_result: msg.detection_result,\n event_id: msg.event_id\n};\nvar msg = new_msg\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1180,"y":2260,"wires":[["42be35f83b764861"]]},{"id":"c13f0f20a56d6af5","type":"http request","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Get Current Image","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://frigate:1984/api/frame.jpeg?src=driveway&h=1000","tls":"","persist":true,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":730,"y":2200,"wires":[["f3a3e80f.3e8e38"]]},{"id":"7151828122e3b80c","type":"deepstack-custom-model","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Post to Deepstack","server":"96b8babe5c0a6107","confidence":"60","customModel":"delivery","drawPredictions":true,"outlineColor":"red","custom":"","outputs":1,"x":190,"y":2260,"wires":[["5acbb2cbdbdea368","bace446bfa7b343d"]]},{"id":"ea239028eda07991","type":"within-time-switch","z":"9584418c.dafc2","g":"35da177d9e2fd258","name":"","nameInt":"","positionConfig":"9f81fd881d01a666","startTime":"08:00:00","startTimeType":"entered","startOffset":0,"startOffsetType":"none","startOffsetMultiplier":60000,"endTime":"21:00:00","endTimeType":"entered","endOffset":0,"endOffsetType":"none","endOffsetMultiplier":60000,"timeRestrictions":0,"timeRestrictionsType":"none","timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","propertyStart":"","propertyStartType":"none","propertyStartCompare":"true","propertyStartThreshold":"","propertyStartThresholdType":"num","startTimeAlt":"","startTimeAltType":"entered","startOffsetAlt":0,"startOffsetAltType":"none","startOffsetAltMultiplier":60000,"propertyEnd":"","propertyEndType":"none","propertyEndCompare":"true","propertyEndThreshold":"","propertyEndThresholdType":"num","endTimeAlt":"","endTimeAltType":"entered","endOffsetAlt":0,"endOffsetAltType":"none","endOffsetAltMultiplier":60000,"withinTimeValue":"true","withinTimeValueType":"msgInput","outOfTimeValue":"false","outOfTimeValueType":"msgInput","tsCompare":"0","x":410,"y":1660,"wires":[["a9a323de66b6f772"],[]]},{"id":"58d0c98797e19829","type":"http request","z":"9584418c.dafc2","d":true,"g":"3c4349a7eea9bd3b","name":"Set Camera 1 Online","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.32/cgi-bin/configManager.cgi?action=setConfig&VSP_PaaS.Online=true","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":420,"y":1880,"wires":[[]]},{"id":"7a8e43b6f7c84bac","type":"http request","z":"9584418c.dafc2","d":true,"g":"3c4349a7eea9bd3b","name":"Set Camera 2 Online","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.33/cgi-bin/configManager.cgi?action=setConfig&VSP_PaaS.Online=true","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":420,"y":1920,"wires":[[]]},{"id":"ab66afa5b576de3f","type":"http request","z":"9584418c.dafc2","d":true,"g":"3c4349a7eea9bd3b","name":"Set Camera 3 Online","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.35/cgi-bin/configManager.cgi?action=setConfig&VSP_PaaS.Online=true","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":420,"y":1960,"wires":[[]]},{"id":"ccf5998fdf8ee50d","type":"http request","z":"9584418c.dafc2","d":true,"g":"3c4349a7eea9bd3b","name":"Set PTZ Online","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.36/cgi-bin/configManager.cgi?action=setConfig&VSP_PaaS.Online=true","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":400,"y":2040,"wires":[[]]},{"id":"1ef176bec8ed5da0","type":"api-call-service","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Doorbell Ring Light On","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":["light.front_door_ring_light"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1020,"y":1340,"wires":[[]]},{"id":"254a48eabb9cf476","type":"api-call-service","z":"9584418c.dafc2","g":"bd2acc7efb5be5fd","name":"Doorbell Ring Light Off","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"light","service":"turn_off","areaId":[],"deviceId":[],"entityId":["light.front_door_ring_light"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1020,"y":1440,"wires":[[]]},{"id":"4e2d750742dc8890","type":"server-state-changed","z":"9584418c.dafc2","d":true,"g":"59ea88a27ef998e7","name":"Drone Motion Detected","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"binary_sensor.drone_detect_motion","entityIdType":"exact","outputInitially":false,"stateType":"str","ifState":"on","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":false,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":180,"y":2480,"wires":[["9799e777bb06f63f"],[]]},{"id":"cdc9c2c982e3fe5f","type":"function","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Image to Payload","func":"msg = {\n payload: msg.payload,\n loops: msg.loops\n};\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":890,"y":2480,"wires":[["b4392caec775b305"]]},{"id":"300267d7c89b0955","type":"debug","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Deepstack Output","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":420,"y":2620,"wires":[]},{"id":"1ae58f8afe36e04c","type":"http request","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Get Current Image","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://frigate:5000/api/bullet/latest.jpg?quality=100","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":670,"y":2480,"wires":[["cdc9c2c982e3fe5f"]]},{"id":"5c59c5c412e759ce","type":"deepstack-custom-model","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Post to Deepstack","server":"96b8babe5c0a6107","confidence":"40","customModel":"delivery","drawPredictions":true,"outlineColor":"red","custom":"","outputs":1,"x":190,"y":2540,"wires":[["300267d7c89b0955","aa523c5cbfe26949","2f18405339079200"]]},{"id":"aa523c5cbfe26949","type":"image","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"","width":"800","data":"outlinedImage","dataType":"msg","thumbnail":false,"active":true,"pass":true,"outputs":1,"x":200,"y":2680,"wires":[[]]},{"id":"b4392caec775b305","type":"jimp-image","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"","data":"payload","dataType":"msg","ret":"buf","parameter1":"380","parameter1Type":"num","parameter2":"0","parameter2Type":"num","parameter3":"170","parameter3Type":"num","parameter4":"170","parameter4Type":"num","parameter5":"","parameter5Type":"msg","parameter6":"","parameter6Type":"msg","parameter7":"","parameter7Type":"msg","parameter8":"","parameter8Type":"msg","sendProperty":"payload","sendPropertyType":"msg","parameterCount":4,"jimpFunction":"crop","selectedJimpFunction":{"name":"crop","fn":"crop","description":"crop to the given region","parameters":[{"name":"x","type":"num","required":true,"hint":"the x coordinate to crop form"},{"name":"y","type":"num","required":true,"hint":"the y coordinate to crop form"},{"name":"w","type":"num","required":true,"hint":"the width of the crop region"},{"name":"h","type":"num","required":true,"hint":"the height of the crop region"}]},"x":1050,"y":2480,"wires":[["5c59c5c412e759ce","081d788e92e34986"]]},{"id":"81d6e9a99eb61c67","type":"switch","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Match Found","property":"payload","propertyType":"msg","rules":[{"t":"nempty"}],"checkall":"true","repair":false,"outputs":1,"x":690,"y":2540,"wires":[["8bec0433aa6e51fa"]]},{"id":"8bec0433aa6e51fa","type":"function","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Output msg","func":"var oldmsg = msg;\n\nmsg = {\n payload: msg.outlinedImage,\n detection_result: msg.payload[0].label,\n};\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":890,"y":2540,"wires":[["1aa9e39b6be88864","b4d7bb6e129bacea"]]},{"id":"1aa9e39b6be88864","type":"file","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Write File","filename":"/data/logo.jpg","filenameType":"str","appendNewline":true,"createDir":false,"overwriteFile":"true","encoding":"none","x":1060,"y":2540,"wires":[["ec51454057c055e2"]]},{"id":"ec51454057c055e2","type":"function","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Detection to payload","func":"var new_msg = {\n payload: { \"subLabel\": msg.detection_result },\n detection_result: msg.detection_result,\n event_id: msg.event_id\n};\nvar msg = new_msg\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1260,"y":2540,"wires":[["6d56b297fcfe0016"]]},{"id":"765c7c5a61100728","type":"http request","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Create Event","method":"POST","ret":"txt","paytoqs":"ignore","url":"http://frigate:5000/api/events/drone_detect/PrimeAir/create","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"Content-type","valueType":"other","valueValue":"application/json"}],"x":1270,"y":2600,"wires":[[]]},{"id":"1bda1e8b7f76e5f3","type":"http request","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Create Event","method":"POST","ret":"txt","paytoqs":"ignore","url":"http://frigate:5000/api/events/back_porch/PrimeAir/create","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"Content-type","valueType":"other","valueValue":"application/json"}],"x":1270,"y":2640,"wires":[[]]},{"id":"14855ff357d5fbad","type":"mqtt out","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"","topic":"frigate/events","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"546e31ed.0db1c","x":1360,"y":2680,"wires":[]},{"id":"a95b4fa60f1238d7","type":"function","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Build MQTT","func":"msg.payload = {'type':'update', 'after':{'label':'PrimeAir'}}\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1190,"y":2680,"wires":[["14855ff357d5fbad"]]},{"id":"081d788e92e34986","type":"image","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"","width":"800","data":"payload","dataType":"msg","thumbnail":false,"active":true,"pass":true,"outputs":1,"x":1000,"y":2680,"wires":[[]]},{"id":"9799e777bb06f63f","type":"within-time-switch","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"","nameInt":"","positionConfig":"9f81fd881d01a666","startTime":"08:30:00","startTimeType":"entered","startOffset":0,"startOffsetType":"none","startOffsetMultiplier":60000,"endTime":"15:30:00","endTimeType":"entered","endOffset":0,"endOffsetType":"none","endOffsetMultiplier":60000,"timeRestrictions":0,"timeRestrictionsType":"none","timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","propertyStart":"","propertyStartType":"none","propertyStartCompare":"true","propertyStartThreshold":"","propertyStartThresholdType":"num","startTimeAlt":"","startTimeAltType":"entered","startOffsetAlt":0,"startOffsetAltType":"none","startOffsetAltMultiplier":60000,"propertyEnd":"","propertyEndType":"none","propertyEndCompare":"true","propertyEndThreshold":"","propertyEndThresholdType":"num","endTimeAlt":"","endTimeAltType":"entered","endOffsetAlt":0,"endOffsetAltType":"none","endOffsetAltMultiplier":60000,"withinTimeValue":"true","withinTimeValueType":"msgInput","outOfTimeValue":"false","outOfTimeValueType":"msgInput","tsCompare":"0","x":430,"y":2480,"wires":[["1ae58f8afe36e04c"],[]]},{"id":"6d56b297fcfe0016","type":"function","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Rate Limiter","func":"var interval = (1000*30); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1070,"y":2600,"wires":[["a95b4fa60f1238d7","1bda1e8b7f76e5f3","765c7c5a61100728","b442c20392c7ce60"]]},{"id":"2f18405339079200","type":"while-loop","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Loop \"payload.length == 0\"","condi":"msg.payload.length == 0","limit":true,"limitTime":"10","time":"loops","timeType":"msg","x":460,"y":2540,"wires":[["81d6e9a99eb61c67"],["1ae58f8afe36e04c"]]},{"id":"bace446bfa7b343d","type":"while-loop","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Loop \"msg.payload.length == 0\"","condi":"msg.payload.length == 0","limit":true,"limitTime":"4","time":"loops","timeType":"msg","x":240,"y":2340,"wires":[["d8a16fd91366d112"],["c13f0f20a56d6af5"]]},{"id":"b4d7bb6e129bacea","type":"debug","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Write Match Image","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":740,"y":2600,"wires":[]},{"id":"b442c20392c7ce60","type":"debug","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Call Frigate API","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":750,"y":2680,"wires":[]},{"id":"5acbb2cbdbdea368","type":"image","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"","width":"800","data":"outlinedImage","dataType":"msg","thumbnail":false,"active":true,"pass":true,"outputs":1,"x":200,"y":2380,"wires":[[]]},{"id":"c061be05c01527e0","type":"image","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"","width":"800","data":"payload","dataType":"msg","thumbnail":false,"active":true,"pass":true,"outputs":1,"x":1060,"y":2380,"wires":[[]]},{"id":"ec6b4698123ebc34","type":"inject","z":"9584418c.dafc2","g":"59ea88a27ef998e7","name":"Manually Create Event","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":1280,"y":2480,"wires":[["6d56b297fcfe0016"]]},{"id":"e263410e9a3af7d8","type":"jimp-image","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"","data":"payload","dataType":"msg","ret":"buf","parameter1":"650","parameter1Type":"num","parameter2":"0","parameter2Type":"num","parameter3":"625","parameter3Type":"num","parameter4":"130","parameter4Type":"num","parameter5":"","parameter5Type":"msg","parameter6":"","parameter6Type":"msg","parameter7":"","parameter7Type":"msg","parameter8":"","parameter8Type":"msg","sendProperty":"payload","sendPropertyType":"msg","parameterCount":4,"jimpFunction":"crop","selectedJimpFunction":{"name":"crop","fn":"crop","description":"crop to the given region","parameters":[{"name":"x","type":"num","required":true,"hint":"the x coordinate to crop form"},{"name":"y","type":"num","required":true,"hint":"the y coordinate to crop form"},{"name":"w","type":"num","required":true,"hint":"the width of the crop region"},{"name":"h","type":"num","required":true,"hint":"the height of the crop region"}]},"x":1110,"y":2200,"wires":[["7151828122e3b80c","a12e93d199527cae","c061be05c01527e0"]]},{"id":"5123f652827fa902","type":"inject","z":"9584418c.dafc2","d":true,"g":"cb7e3560a0078392","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"30","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":170,"y":2860,"wires":[["970920516fa379e8","88d3b091fc333998"]]},{"id":"970920516fa379e8","type":"http request","z":"9584418c.dafc2","d":true,"g":"cb7e3560a0078392","name":"PHX","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://ttp.cbp.dhs.gov/schedulerapi/slot-availability?locationId=7160","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":330,"y":2860,"wires":[["51f2291060d07336"]]},{"id":"51f2291060d07336","type":"function","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"11/07","func":"var oldmsg = msg;\nvar match = false\nvar slots = ''\n\nfor (var i = 0; i < msg.payload.availableSlots.length; i++) {\n if (msg.payload.availableSlots[i].startTimestamp.includes('2023-11-07')){\n console.log(msg.payload.availableSlots[i].startTimestamp)\n slots += msg.payload.availableSlots[i].startTimestamp + ' '\n match = true\n }\n}\n\nmsg = {\n payload: \"PHX: \" + slots + \"https://ttp.cbp.dhs.gov/schedulerui/schedule-interview/location?lang=en&vo=true&returnUrl=ttp-external&service=UP\",\n 'match': match\n};\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":470,"y":2860,"wires":[["7415468104c18108","a61d605915dc23ff"]]},{"id":"91d3d26774f9468e","type":"debug","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"HOU","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":630,"y":2820,"wires":[]},{"id":"7415468104c18108","type":"debug","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"PHX","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":630,"y":2900,"wires":[]},{"id":"b8a4a1ee4e15f778","type":"api-call-service","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Notify Via Signal","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"signal_self","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": msg.payload\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":960,"y":2860,"wires":[[]]},{"id":"79c00f8c61888f52","type":"switch","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"","property":"match","propertyType":"msg","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":610,"y":2780,"wires":[["c44a5c4d6d17ee9f"]]},{"id":"a61d605915dc23ff","type":"switch","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"","property":"match","propertyType":"msg","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":610,"y":2860,"wires":[["fa9f2ef8fecf1de2"]]},{"id":"c44a5c4d6d17ee9f","type":"function","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Rate Limiter","func":"var interval = (1000*600); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":2780,"wires":[["d5ab0aa6d198ba81"]]},{"id":"fa9f2ef8fecf1de2","type":"function","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Rate Limiter","func":"var interval = (1000*600); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":2860,"wires":[["b8a4a1ee4e15f778"]]},{"id":"7d01abce7bc68291","type":"function","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"All","func":"var oldmsg = msg;\nvar slots = msg.payload.availableSlots\n\n// Pass message if slots not empty\nif(slots.length > 0){\n msg.message = slots[0].startTimestamp\n return msg;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":470,"y":2940,"wires":[["1480d9470754a6a3","b7c50947c4507d03"]]},{"id":"b7c50947c4507d03","type":"switch","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"","property":"payload","propertyType":"msg","rules":[{"t":"nempty"}],"checkall":"true","repair":false,"outputs":1,"x":610,"y":2940,"wires":[["ca8d58af48d7b7c5","414a38bf0735b27c"]]},{"id":"1480d9470754a6a3","type":"debug","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"DAL","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":630,"y":2980,"wires":[]},{"id":"ca8d58af48d7b7c5","type":"function","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Rate Limiter","func":"var interval = (1000*120); // minimum interval between messages (ms)\ncontext.lastTime = context.lastTime || 0;\n\nvar now = Date.now();\n\nif (now-context.lastTime > interval) {\n context.lastTime = now;\n return msg;\n} else {\n return null;\n}","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":2940,"wires":[["414a38bf0735b27c","bfbece91f0b61e8b"]]},{"id":"414a38bf0735b27c","type":"api-call-service","z":"9584418c.dafc2","d":true,"g":"cb7e3560a0078392","name":"Notify Via Signal","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"signal_self","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": \"Dallas https://ttp.cbp.dhs.gov/schedulerui/schedule-interview/location?lang=en&vo=true&returnUrl=ttp-external&service=UP\"\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":960,"y":2940,"wires":[[]]},{"id":"c0546e86d17e99e9","type":"function","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"11/03","func":"var oldmsg = msg;\nvar match = false\nvar slots = ''\n\nfor (var i = 0; i < msg.payload.availableSlots.length; i++) {\n if (msg.payload.availableSlots[i].startTimestamp.includes('2023-11-03')){\n console.log(msg.payload.availableSlots[i].startTimestamp)\n slots += msg.payload.availableSlots[i].startTimestamp + ' '\n match = true\n }\n}\n\nmsg = {\n payload: \"HOU: \" + slots + \"https://ttp.cbp.dhs.gov/schedulerui/schedule-interview/location?lang=en&vo=true&returnUrl=ttp-external&service=UP\",\n 'match': match\n};\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":470,"y":2780,"wires":[["91d3d26774f9468e","79c00f8c61888f52"]]},{"id":"d5ab0aa6d198ba81","type":"api-call-service","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Notify Via Signal","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"signal_self","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": msg.payload\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":960,"y":2780,"wires":[[]]},{"id":"83e2179938d08d58","type":"api-call-service","z":"9584418c.dafc2","g":"26b2ac79d4c32bda","name":"Timelapse Snapshots","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"camera","service":"snapshot","areaId":[],"deviceId":[],"entityId":["camera.back_porch","camera.bullet","camera.driveway","camera.front_door"],"data":"{\"filename\":\"/config/media/images/{{ entity_id.entity_id }}/{{ now().strftime('%Y%m%d-%H%M%S') }}.webp\"}","dataType":"json","mergeContext":"","mustacheAltTags":true,"outputProperties":[],"queue":"none","x":540,"y":3220,"wires":[[]]},{"id":"59e4459459f077c9","type":"time-inject","z":"9584418c.dafc2","g":"26b2ac79d4c32bda","name":"Golden Hour Dawn End","nameInt":"⏲ golden hour dawn end = $!{lblInject}!","positionConfig":"9f81fd881d01a666","props":[],"injectTypeSelect":"time","intervalCount":1,"intervalCountType":"num","intervalCountMultiplier":60000,"time":"goldenHourDawnEnd","timeType":"pdsTime","offset":0,"offsetType":"none","offsetMultiplier":60000,"timeEnd":"","timeEndType":"entered","timeEndOffset":0,"timeEndOffsetType":"none","timeEndOffsetMultiplier":60000,"timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","property":"","propertyType":"none","propertyCompare":"true","propertyThreshold":"","propertyThresholdType":"num","timeAlt":"","timeAltType":"entered","timeAltDays":"*","timeAltOnlyOddDays":false,"timeAltOnlyEvenDays":false,"timeAltOnlyOddWeeks":false,"timeAltOnlyEvenWeeks":false,"timeAltMonths":"*","timeAltOffset":0,"timeAltOffsetType":"none","timeAltOffsetMultiplier":60000,"once":false,"onceDelay":0.1,"recalcTime":2,"x":200,"y":3140,"wires":[["83e2179938d08d58"]]},{"id":"089b07fa48286f29","type":"time-inject","z":"9584418c.dafc2","g":"26b2ac79d4c32bda","name":"Golden Hour Dusk Start","nameInt":"⏲ golden hour dusk start = $!{lblInject}!","positionConfig":"9f81fd881d01a666","props":[],"injectTypeSelect":"time","intervalCount":1,"intervalCountType":"num","intervalCountMultiplier":60000,"time":"goldenHourDuskStart","timeType":"pdsTime","offset":0,"offsetType":"none","offsetMultiplier":60000,"timeEnd":"","timeEndType":"entered","timeEndOffset":0,"timeEndOffsetType":"none","timeEndOffsetMultiplier":60000,"timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","property":"","propertyType":"none","propertyCompare":"true","propertyThreshold":"","propertyThresholdType":"num","timeAlt":"","timeAltType":"entered","timeAltDays":"*","timeAltOnlyOddDays":false,"timeAltOnlyEvenDays":false,"timeAltOnlyOddWeeks":false,"timeAltOnlyEvenWeeks":false,"timeAltMonths":"*","timeAltOffset":0,"timeAltOffsetType":"none","timeAltOffsetMultiplier":60000,"once":false,"onceDelay":0.1,"recalcTime":2,"x":200,"y":3320,"wires":[["83e2179938d08d58"]]},{"id":"7ff9bf1a917cbf50","type":"time-inject","z":"9584418c.dafc2","g":"26b2ac79d4c32bda","name":"Golden Hour Dusk Start - 3h","nameInt":"⏲ golden hour dusk start↶ = $!{lblInject}!","positionConfig":"9f81fd881d01a666","props":[],"injectTypeSelect":"time","intervalCount":1,"intervalCountType":"num","intervalCountMultiplier":60000,"time":"goldenHourDuskStart","timeType":"pdsTime","offset":"-3","offsetType":"num","offsetMultiplier":3600000,"timeEnd":"","timeEndType":"entered","timeEndOffset":0,"timeEndOffsetType":"none","timeEndOffsetMultiplier":60000,"timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","property":"","propertyType":"none","propertyCompare":"true","propertyThreshold":"","propertyThresholdType":"num","timeAlt":"","timeAltType":"entered","timeAltDays":"*","timeAltOnlyOddDays":false,"timeAltOnlyEvenDays":false,"timeAltOnlyOddWeeks":false,"timeAltOnlyEvenWeeks":false,"timeAltMonths":"*","timeAltOffset":0,"timeAltOffsetType":"none","timeAltOffsetMultiplier":60000,"once":false,"onceDelay":0.1,"recalcTime":2,"x":220,"y":3260,"wires":[["83e2179938d08d58"]]},{"id":"a826a8c498d6d1e3","type":"time-inject","z":"9584418c.dafc2","g":"26b2ac79d4c32bda","name":"Golden Hour Dawn End + 3h","nameInt":"⏲ golden hour dawn end↷ = $!{lblInject}!","positionConfig":"9f81fd881d01a666","props":[],"injectTypeSelect":"time","intervalCount":1,"intervalCountType":"num","intervalCountMultiplier":60000,"time":"goldenHourDawnEnd","timeType":"pdsTime","offset":"3","offsetType":"num","offsetMultiplier":3600000,"timeEnd":"","timeEndType":"entered","timeEndOffset":0,"timeEndOffsetType":"none","timeEndOffsetMultiplier":60000,"timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","property":"","propertyType":"none","propertyCompare":"true","propertyThreshold":"","propertyThresholdType":"num","timeAlt":"","timeAltType":"entered","timeAltDays":"*","timeAltOnlyOddDays":false,"timeAltOnlyEvenDays":false,"timeAltOnlyOddWeeks":false,"timeAltOnlyEvenWeeks":false,"timeAltMonths":"*","timeAltOffset":0,"timeAltOffsetType":"none","timeAltOffsetMultiplier":60000,"once":false,"onceDelay":0.1,"recalcTime":2,"x":220,"y":3200,"wires":[["83e2179938d08d58"]]},{"id":"c5c85c0aa2d8c8ca","type":"server-state-changed","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Safe Opened","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"binary_sensor.large_safe","entityIdType":"exact","outputInitially":false,"stateType":"habool","ifState":"true","ifStateType":"bool","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":530,"y":80,"wires":[["c5124616.c9bd48"],[]]},{"id":"fa90c550.d6c948","type":"inject","z":"9584418c.dafc2","d":true,"g":"b808f2d7ae539c87","name":"At 8 PM","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 20 * * 1,2,4,5,6,0","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":160,"y":700,"wires":[["1457bf6605a50448"]]},{"id":"08b26d8311cd9187","type":"inject","z":"9584418c.dafc2","d":true,"g":"6f393a92ae952332","name":"Every 5 minutes","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"300","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":190,"y":3480,"wires":[["716e8fabff85ffb9","7b988b93a658f526","d85faf19968afde1"]]},{"id":"716e8fabff85ffb9","type":"api-current-state","z":"9584418c.dafc2","g":"6f393a92ae952332","name":"Attic Temperature < 34","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"34","halt_if_type":"num","halt_if_compare":"lt","entity_id":"sensor.netatmo_home_attic_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":420,"y":3420,"wires":[["16e1a3e2f53e6bdf"],[]]},{"id":"7b988b93a658f526","type":"api-current-state","z":"9584418c.dafc2","g":"6f393a92ae952332","name":"Thermostat Outdoor Temperature <= 35","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"35","halt_if_type":"num","halt_if_compare":"lte","entity_id":"sensor.thermostat_outdoor_ambient_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":480,"y":3480,"wires":[["16e1a3e2f53e6bdf"],[]]},{"id":"7fe1e564efbd46af","type":"api-call-service","z":"9584418c.dafc2","g":"6f393a92ae952332","name":"Turn on Faucet Drip","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.bhyve_1"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":970,"y":3480,"wires":[[]]},{"id":"16e1a3e2f53e6bdf","type":"api-current-state","z":"9584418c.dafc2","g":"6f393a92ae952332","name":"Faucet Drip Off?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"switch.bhyve_1","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":780,"y":3480,"wires":[["7fe1e564efbd46af"],[]]},{"id":"d85faf19968afde1","type":"api-current-state","z":"9584418c.dafc2","g":"6f393a92ae952332","name":"Compost External Temperature < 34","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"34","halt_if_type":"num","halt_if_compare":"lt","entity_id":"sensor.compost_external_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":470,"y":3540,"wires":[["16e1a3e2f53e6bdf"],[]]},{"id":"504a90c2bb116cda","type":"inject","z":"9584418c.dafc2","name":"On Demand","props":[],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":690,"y":1920,"wires":[["f7c82af0e299c914"]]},{"id":"f7c82af0e299c914","type":"http request","z":"9584418c.dafc2","name":"Enable Overlay","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.32/cgi-bin/configManager.cgi?action=setConfig&VideoWidget[0].CustomTitle[1].EncodeBlend=true","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":900,"y":1920,"wires":[[]]},{"id":"aa9d132ce4c33794","type":"http request","z":"9584418c.dafc2","name":"Set Overlay Text","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.32/cgi-bin/configManager.cgi?action=setConfig&VideoWidget[0].CustomTitle[1].Text={{{payload}}}°F","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":1140,"y":1980,"wires":[[]]},{"id":"8f9a073f4ebb3133","type":"inject","z":"9584418c.dafc2","name":"On Demand */5","props":[],"repeat":"300","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":700,"y":1980,"wires":[["446f812e8b1f4307"]]},{"id":"acd933c5c0eddc8b","type":"http request","z":"9584418c.dafc2","name":"Disable Overlay","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://10.0.0.32/cgi-bin/configManager.cgi?action=setConfig&VideoWidget[0].CustomTitle[1].EncodeBlend=false","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"digest","senderr":false,"headers":[],"x":900,"y":2040,"wires":[[]]},{"id":"6d26bb1db9ea5e67","type":"inject","z":"9584418c.dafc2","name":"On Demand","props":[],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":690,"y":2040,"wires":[["acd933c5c0eddc8b"]]},{"id":"446f812e8b1f4307","type":"api-current-state","z":"9584418c.dafc2","name":"Outdoor Temperature","server":"e1dc0b88.463bb8","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.433_weather_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":920,"y":1980,"wires":[["aa9d132ce4c33794"]]},{"id":"7eb1a3d60fccbc76","type":"Mailin SMTP","z":"9584418c.dafc2","g":"e28fc796ce042622","name":"Recieve Mail","port":25,"x":150,"y":3660,"wires":[["1cd709e001bf5e89"]]},{"id":"cb1f141562c8fd2b","type":"api-call-service","z":"9584418c.dafc2","g":"e28fc796ce042622","name":"Notify Cellular Priority 1","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"cellular_message","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": payload.html, \"data\": {\"priority\": 1} \t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":810,"y":3640,"wires":[[]]},{"id":"88d3b091fc333998","type":"http request","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"DAL","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://ttp.cbp.dhs.gov/schedulerapi/slot-availability?locationId=5300","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":330,"y":2940,"wires":[["7d01abce7bc68291"]]},{"id":"1cd709e001bf5e89","type":"within-time-switch","z":"9584418c.dafc2","g":"e28fc796ce042622","name":"","nameInt":"","positionConfig":"9f81fd881d01a666","startTime":"09:00:00","startTimeType":"entered","startOffset":0,"startOffsetType":"none","startOffsetMultiplier":60000,"endTime":"22:00:00","endTimeType":"entered","endOffset":0,"endOffsetType":"none","endOffsetMultiplier":60000,"timeRestrictions":0,"timeRestrictionsType":"none","timeDays":"*","timeOnlyOddDays":false,"timeOnlyEvenDays":false,"timeOnlyOddWeeks":false,"timeOnlyEvenWeeks":false,"timeMonths":"*","timedatestart":"","timedateend":"","propertyStart":"","propertyStartType":"none","propertyStartCompare":"true","propertyStartThreshold":"","propertyStartThresholdType":"num","startTimeAlt":"","startTimeAltType":"entered","startOffsetAlt":0,"startOffsetAltType":"none","startOffsetAltMultiplier":60000,"propertyEnd":"","propertyEndType":"none","propertyEndCompare":"true","propertyEndThreshold":"","propertyEndThresholdType":"num","endTimeAlt":"","endTimeAltType":"entered","endOffsetAlt":0,"endOffsetAltType":"none","endOffsetAltMultiplier":60000,"withinTimeValue":"true","withinTimeValueType":"msgInput","outOfTimeValue":"false","outOfTimeValueType":"msgInput","tsCompare":"0","x":370,"y":3660,"wires":[["24fc1882c8436738"],["7f48460e08988c9e"]]},{"id":"7f48460e08988c9e","type":"api-call-service","z":"9584418c.dafc2","g":"e28fc796ce042622","name":"Notify Cellular Priority 0","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"cellular_message","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": payload.html, \"data\": {\"priority\": 0} \t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":810,"y":3700,"wires":[[]]},{"id":"24fc1882c8436738","type":"api-current-state","z":"9584418c.dafc2","g":"e28fc796ce042622","name":"Andrew Home?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"home","halt_if_type":"str","halt_if_compare":"is","entity_id":"person.andrew","state_type":"habool","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":580,"y":3640,"wires":[["cb1f141562c8fd2b"],["7f48460e08988c9e"]]},{"id":"d9e9a93275328762","type":"inject","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":780,"y":2140,"wires":[["c13f0f20a56d6af5"]]},{"id":"a12e93d199527cae","type":"file","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Write File","filename":"/data/input.jpg","filenameType":"str","appendNewline":true,"createDir":false,"overwriteFile":"true","encoding":"none","x":1200,"y":2140,"wires":[[]]},{"id":"f8a0990e2842810d","type":"server-state-changed","z":"9584418c.dafc2","name":"Dead Zwave Node","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"_node_status","entityIdType":"substring","outputInitially":false,"stateType":"str","ifState":"dead","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":170,"y":3800,"wires":[["1ba5d7539019ce84"],[]]},{"id":"1ba5d7539019ce84","type":"api-call-service","z":"9584418c.dafc2","name":"Notify Via Signal","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"signal_homeassistant","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": topic & \" has died\" }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":420,"y":3800,"wires":[[]]},{"id":"1b266e9b338a4dfe","type":"debug","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"BB Debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1040,"y":3040,"wires":[]},{"id":"85644b2ab18e7141","type":"http request","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"BlueBubbles","method":"POST","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"andrew-bb","valueType":"other","valueValue":"true"}],"x":870,"y":3040,"wires":[["1b266e9b338a4dfe"]]},{"id":"041a81d375ec985d","type":"function","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Build BB Message","func":"msg.url = msg.payload + \"/api/v1/message/text?password=\" + env.get(\"bb_pass\")\nmsg.payload = {\n \"chatGuid\": \"iMessage;-;+\" + env.get(\"bb_number\"),\n \"message\": msg.message + \" https://ttp.cbp.dhs.gov/schedulerui/schedule-interview/location?lang=en&vo=true&returnUrl=ttp-external&service=UP\",\n \"method\": \"private-api\"\n}\n\nreturn msg;\n\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":670,"y":3040,"wires":[["85644b2ab18e7141"]]},{"id":"bfbece91f0b61e8b","type":"api-current-state","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Get BlueBubbles URL","server":"e1dc0b88.463bb8","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_text.bluebubbles_url","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":250,"y":3040,"wires":[["f3b23466b80725e0"]]},{"id":"f3b23466b80725e0","type":"json","z":"9584418c.dafc2","g":"cb7e3560a0078392","name":"Object to JSON","property":"message","action":"str","pretty":false,"x":460,"y":3040,"wires":[["041a81d375ec985d"]]},{"id":"b4b8f84a.7e57a8","type":"jimp-image","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Annotate","data":"outlinedImage","dataType":"msg","ret":"buf","parameter1":"FONT_SANS_16_WHITE","parameter1Type":"jimpFont","parameter2":"10","parameter2Type":"num","parameter3":"0","parameter3Type":"num","parameter4":"timestamp","parameter4Type":"msg","parameter5":"HORIZONTAL_ALIGN_LEFT","parameter5Type":"AlignX","parameter6":"VERTICAL_ALIGN_TOP","parameter6Type":"AlignY","parameter7":"","parameter7Type":"auto","parameter8":"","parameter8Type":"auto","sendProperty":"outlinedImage","parameterCount":8,"jimpFunction":"print2","selectedJimpFunction":{"name":"print aligned","fn":"print","description":"Print text to the image","parameters":[{"name":"font|str","type":"jimpFont","required":true,"hint":"font to print. NOTE: This can be one of the presets or the path to a fnt file"},{"name":"x","type":"num","required":true,"hint":"x coordinate to print text"},{"name":"y","type":"num","required":true,"hint":"y coordinate to print text"},{"name":"text","group":"options","type":"str","required":true,"hint":"text to print"},{"name":"alignmentX","group":"options","type":"AlignX","required":false,"hint":"X Alignment"},{"name":"alignmentY","group":"options","type":"AlignY","required":false,"hint":"Y Alignment"},{"name":"maxWidth","type":"auto|num","required":false,"hint":"wrap text at maxWidth"},{"name":"maxHeight","type":"auto|num","required":false,"hint":"max height"}]},"x":700,"y":2260,"wires":[["9b7c5535c74a94a3","2dfdead1d2e3b78b"]],"icon":"font-awesome/fa-image"},{"id":"63fd5090444c9cad","type":"api-render-template","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Time","server":"e1dc0b88.463bb8","version":0,"template":"{{ now().strftime(\"%m-%d-%YT%H:%M:%S\") }}","resultsLocation":"timestamp","resultsLocationType":"msg","templateLocation":"","templateLocationType":"none","x":570,"y":2260,"wires":[["b4b8f84a.7e57a8"]]},{"id":"2dfdead1d2e3b78b","type":"debug","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Post Annotate","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":560,"y":2360,"wires":[]},{"id":"c1fe21bcb3184137","type":"debug","z":"9584418c.dafc2","g":"9cfe6331fbc680d5","name":"Post Output msg","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":810,"y":2360,"wires":[]},{"id":"28fa66cd.af058a","type":"trigger","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Wait 1m","op1":"","op2":"1","op1type":"nul","op2type":"str","duration":"1","extend":false,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":620,"y":120,"wires":[["2022689a.938918"]]},{"id":"aee87977a0670889","type":"api-call-service","z":"9584418c.dafc2","g":"cf3a0410bcf837ae","name":"Notify Via Wrapper: Opened 5 Minutes","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"script","service":"notify_wrapper","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": \"The \" & $lowercase(msg.data.new_state.attributes.friendly_name) & \" has been opened for 5 minutes\"\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":890,"y":160,"wires":[[]]},{"id":"5caa1a9942bc27ee","type":"function","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"Image to Payload","func":"msg = {\n payload: msg.payload,\n event_id: msg.event_id,\n loops: msg.loops,\n looking_for: msg.looking_for\n};\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":970,"y":3960,"wires":[["ae58df44bf002167","4fc565f7b86648dc","39be459cb7126ab9"]]},{"id":"9b25e9a8817a7d8e","type":"http request","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"Get Current Image","method":"GET","ret":"bin","paytoqs":"ignore","url":"http://frigate:1984/api/frame.jpeg?src=driveway","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":770,"y":3980,"wires":[["5caa1a9942bc27ee"]]},{"id":"ae58df44bf002167","type":"jimp-image","z":"9584418c.dafc2","d":true,"g":"445e81780ba935ac","name":"","data":"payload","dataType":"msg","ret":"buf","parameter1":"1000","parameter1Type":"num","parameter2":"250","parameter2Type":"num","parameter3":"1500","parameter3Type":"num","parameter4":"1000","parameter4Type":"num","parameter5":"","parameter5Type":"msg","parameter6":"","parameter6Type":"msg","parameter7":"","parameter7Type":"msg","parameter8":"","parameter8Type":"msg","sendProperty":"payload","sendPropertyType":"msg","parameterCount":4,"jimpFunction":"crop","selectedJimpFunction":{"name":"crop","fn":"crop","description":"crop to the given region","parameters":[{"name":"x","type":"num","required":true,"hint":"the x coordinate to crop form"},{"name":"y","type":"num","required":true,"hint":"the y coordinate to crop form"},{"name":"w","type":"num","required":true,"hint":"the width of the crop region"},{"name":"h","type":"num","required":true,"hint":"the height of the crop region"}]},"x":1150,"y":3940,"wires":[["4fc565f7b86648dc","39be459cb7126ab9"]]},{"id":"7c060a1e3c0ff12e","type":"inject","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":160,"y":3940,"wires":[["1fce953ec4b1ee3d"]]},{"id":"4fc565f7b86648dc","type":"deepstack-object-detection","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"","server":"169e2bac20a4c980","confidence":"70","drawPredictions":false,"printLabel":false,"outlineColor":"pink","custom":"","filters":[],"outputs":1,"x":1330,"y":3960,"wires":[["6f27f3028b1805e2"]]},{"id":"220bca8570d66770","type":"debug","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"Log Plate","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":350,"y":4100,"wires":[]},{"id":"184d6d5272648136","type":"server-state-changed","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"Vehicle Detected","server":"e1dc0b88.463bb8","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"sensor.driveway_far_car_count","entityIdType":"exact","outputInitially":false,"stateType":"str","ifState":"0","ifStateType":"num","ifStateOperator":"gt","outputOnlyOnStateChange":false,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":160,"y":3980,"wires":[["b70d2ca780b98259"],[]]},{"id":"500ee424e3f6b6a1","type":"while-loop","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"No Match","condi":"msg.payload != msg.looking_for","limit":true,"limitTime":"10","time":"loops","timeType":"msg","x":540,"y":4040,"wires":[["5218eca8a79a79a5"],["9b25e9a8817a7d8e","89d145fdfdd9fe04"]]},{"id":"39be459cb7126ab9","type":"image","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"","width":"1200","data":"payload","dataType":"msg","thumbnail":false,"active":true,"pass":true,"outputs":1,"x":340,"y":4180,"wires":[[]]},{"id":"6f27f3028b1805e2","type":"change","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"Plate to Payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload[0].plate","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":360,"y":4040,"wires":[["500ee424e3f6b6a1","220bca8570d66770"]]},{"id":"004c0ae121925ea2","type":"debug","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"Found","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":830,"y":4100,"wires":[]},{"id":"89d145fdfdd9fe04","type":"http request","z":"9584418c.dafc2","d":true,"g":"445e81780ba935ac","name":"Test Image","method":"GET","ret":"bin","paytoqs":"ignore","url":"https://vps.aneis.ch/ss.png","tls":"","persist":true,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":750,"y":3940,"wires":[["5caa1a9942bc27ee"]]},{"id":"5218eca8a79a79a5","type":"switch","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"If Match","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"plate_andrew","vt":"env"}],"checkall":"true","repair":false,"outputs":1,"x":720,"y":4040,"wires":[["004c0ae121925ea2","8c5272ae89e85e74"]]},{"id":"1fce953ec4b1ee3d","type":"change","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"","rules":[{"t":"set","p":"looking_for","pt":"msg","to":"plate_andrew","tot":"env"}],"action":"","property":"","from":"","to":"","reg":false,"x":530,"y":3960,"wires":[["89d145fdfdd9fe04","9b25e9a8817a7d8e"]]},{"id":"b70d2ca780b98259","type":"api-current-state","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"Andrew in Car","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"binary_sensor.andrew_phone_car_connected","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":340,"y":3960,"wires":[["1fce953ec4b1ee3d"],[]]},{"id":"8c5272ae89e85e74","type":"api-current-state","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"Garage Closed","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"closed","halt_if_type":"str","halt_if_compare":"is","entity_id":"cover.garage_door","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":900,"y":4040,"wires":[["8067ec66aa846765"],[]]},{"id":"8067ec66aa846765","type":"api-call-service","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"Open Garage","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"cover","service":"open_cover","areaId":[],"deviceId":[],"entityId":["cover.garage_door"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1100,"y":4040,"wires":[["6648e0bdaa2d8170"]]},{"id":"6648e0bdaa2d8170","type":"api-call-service","z":"9584418c.dafc2","g":"445e81780ba935ac","name":"Notify Via Signal","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"notify","service":"signal_self","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": \"Garage opened by ALPR\" \t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1300,"y":4040,"wires":[[]]},{"id":"d269f175.c9dc6","type":"server-events","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Custom Water Event Fired","server":"e1dc0b88.463bb8","version":3,"exposeAsEntityConfig":"","eventType":"irrigation_custom_water","eventData":"","waitForRunning":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"$outputData(\"eventData\").event_type","valueType":"jsonata"},{"property":"event_type","propertyType":"msg","value":"$outputData(\"eventData\").event_type","valueType":"jsonata"}],"x":190,"y":340,"wires":[["883f2c00.1d94e8"]]},{"id":"3367e45f.cc981c","type":"function","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"++","func":"if ( (msg.i += 1) < msg.zones.length ) return msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":670,"y":400,"wires":[["116d5bb3.ee92a4"]]},{"id":"116d5bb3.ee92a4","type":"function","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"For Each","func":"if( msg.i == undefined ) msg.i = 0;\n\nmsg.payload = msg.zones[ msg.i ];\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":840,"y":340,"wires":[["565ee5c1.561bfc","80df47d5.602888","e2c37b65c5582c2b"]]},{"id":"80df47d5.602888","type":"api-call-service","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Turn On Zone","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":[],"data":"{ \"entity_id\": payload.zone}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1060,"y":340,"wires":[[]]},{"id":"fb46876c.845298","type":"api-call-service","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Turn Off Zone","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":[],"data":"{ \"entity_id\": payload.zone}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1320,"y":400,"wires":[["98eeafa7.bd2b9","860a4c61d7557dc9"]]},{"id":"98eeafa7.bd2b9","type":"delay","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Delay 5","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"outputs":1,"x":980,"y":480,"wires":[["3367e45f.cc981c"]]},{"id":"565ee5c1.561bfc","type":"change","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Set Delay Variable","rules":[{"t":"set","p":"delay","pt":"msg","to":"payload.time* 60000","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":890,"y":400,"wires":[["22a20603.86a06a"]]},{"id":"22a20603.86a06a","type":"stoptimer-varidelay","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","duration":"5","durationType":"num","units":"Millisecond","payloadtype":"num","payloadval":"0","name":"Delay","reporting":"every_second","persist":false,"x":1090,"y":400,"wires":[["fb46876c.845298"],[],["a8d96e.1f00969"]]},{"id":"a8d96e.1f00969","type":"mqtt out","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Publish Time Remaining","topic":"sensor/irrigation_time_remaining","qos":"","retain":"","broker":"546e31ed.0db1c","x":1350,"y":340,"wires":[]},{"id":"3b656b89.1ac154","type":"inject","z":"f602e6ba.609d28","g":"79694877249c9902","name":"3:00 Attempt","props":[{"p":"payload"}],"repeat":"","crontab":"00 03 * * 2,5","once":false,"onceDelay":0.1,"topic":"","payload":"[{\"zone\":\"switch.irrigation_front_beds\",\"time\":10,\"name\":\"Front beds\"},{\"zone\":\"switch.irrigation_front_lawn\",\"time\":20,\"name\":\"Front lawn\"},{\"zone\":\"switch.irrigation_left_and_main_rear_lawn\",\"time\":20,\"name\":\"Left and main rear lawn\"},{\"zone\":\"switch.irrigation_front_and_right_rear_lawn\",\"time\":20,\"name\":\"Front and right rear lawn\"},{\"zone\":\"switch.irrigation_side_lawn\",\"time\":20,\"name\":\"Side lawn\"}]","payloadType":"json","x":180,"y":1280,"wires":[["493b435f.c9851c"]]},{"id":"493b435f.c9851c","type":"api-current-state","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Schedule Enabled","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.lawn_irrigation_scheduling","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":410,"y":1280,"wires":[["8c060f00.cf577"],["7b12e66f.57d068"]]},{"id":"7b12e66f.57d068","type":"api-call-service","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.lawn_irrigation_reason"],"data":"{\"value\":\"Automation Off\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":630,"y":1300,"wires":[[]]},{"id":"8c060f00.cf577","type":"link out","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["f1cbfe0.7dfb4","576b66fa1bd202a3"],"x":595,"y":1260,"wires":[]},{"id":"4422f61c.847d88","type":"link in","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["3ff9ce03ef7b554b"],"x":135,"y":1480,"wires":[["219b37105a8304f1"]]},{"id":"dcdeabc7.780578","type":"link out","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["1eaa857e.b6b8db","c90fd5e6.c5c678","b8fe96458628f202"],"x":595,"y":1460,"wires":[]},{"id":"722d03d6.2ff77c","type":"link in","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["8d4bfe8e.ee805","d67106b42368e630"],"x":135,"y":1900,"wires":[["b3c4a3638c17629e"]]},{"id":"af4788fe.215ba8","type":"link out","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["405789f7.0727a8","eb1a5268c1aec843","9896327569c234da"],"x":595,"y":1900,"wires":[]},{"id":"c90fd5e6.c5c678","type":"link in","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["dcdeabc7.780578","89d715ddf12d2195"],"x":135,"y":1600,"wires":[["e7430e17f0b24ed8"]]},{"id":"862ad27a.d347d","type":"link out","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["83edf648.3f9ed8"],"x":595,"y":1580,"wires":[]},{"id":"808e6a81.92e2e8","type":"api-call-service","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Turn On Master Valve","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.irrigation_master_valve"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":460,"y":400,"wires":[["e42ff3d9.593dc"]]},{"id":"883f2c00.1d94e8","type":"api-current-state","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"24v Power","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"switch.irrigation_24v_power","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":250,"y":400,"wires":[["808e6a81.92e2e8"],["808e6a81.92e2e8"]]},{"id":"e42ff3d9.593dc","type":"delay","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Delay 5","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"outputs":1,"x":480,"y":340,"wires":[["76160bc4.8cd644"]]},{"id":"76160bc4.8cd644","type":"change","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"","rules":[{"t":"set","p":"zones","pt":"msg","to":"payload.event.zones","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":660,"y":340,"wires":[["116d5bb3.ee92a4"]]},{"id":"83edf648.3f9ed8","type":"link in","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["862ad27a.d347d","1bb3825011174363"],"x":135,"y":1700,"wires":[["b6e7d5b8891bba6d"]]},{"id":"8d4bfe8e.ee805","type":"link out","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["722d03d6.2ff77c"],"x":595,"y":1720,"wires":[]},{"id":"583f46a3.fc4c38","type":"inject","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"5:00 Attempt","props":[{"p":"payload"}],"repeat":"","crontab":"00 05 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"[{\"zone\":\"switch.irrigation_front_beds\",\"time\":10,\"name\":\"Front beds\"},{\"zone\":\"switch.irrigation_front_lawn\",\"time\":20,\"name\":\"Front lawn\"},{\"zone\":\"switch.irrigation_left_and_main_rear_lawn\",\"time\":20,\"name\":\"Left and main rear lawn\"},{\"zone\":\"switch.irrigation_front_and_right_rear_lawn\",\"time\":20,\"name\":\"Front and right rear lawn\"},{\"zone\":\"switch.irrigation_side_lawn\",\"time\":20,\"name\":\"Side lawn\"}]","payloadType":"json","x":180,"y":2620,"wires":[["d9147878.b61cf8"]]},{"id":"d9147878.b61cf8","type":"api-current-state","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Schedule Enabled","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.front_bed_irrigation_scheduling","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":410,"y":2620,"wires":[["c7e5552e.7f8a08"],["45c5dbbbd8ce50a1"]]},{"id":"c7e5552e.7f8a08","type":"link out","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["f1cbfe0.7dfb4","f6881b4bf93c27c5"],"x":595,"y":2600,"wires":[]},{"id":"6bcf06fb.9ca748","type":"link in","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["4f2902edc77f2d3b"],"x":135,"y":2820,"wires":[["ed6e3d4225582e20"]]},{"id":"f587589f.d739e8","type":"link out","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["1eaa857e.b6b8db","9d851699.6a8458"],"x":595,"y":2800,"wires":[]},{"id":"d9d17e8f.590e6","type":"link in","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["4fae5b92.a9cd44"],"x":135,"y":3040,"wires":[["d8637d8d96b68fca"]]},{"id":"d9f893eb.834f3","type":"link out","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["5ce1803b.06628"],"x":595,"y":3040,"wires":[]},{"id":"9d851699.6a8458","type":"link in","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["f587589f.d739e8"],"x":135,"y":2940,"wires":[["593bee0e8c958df8"]]},{"id":"4fae5b92.a9cd44","type":"link out","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["d9d17e8f.590e6"],"x":595,"y":2920,"wires":[]},{"id":"a2ab7368.923fb","type":"template","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Zone Settings Front Beds","field":"zones","fieldType":"msg","format":"json","syntax":"mustache","template":"{\n \"zone\": \"switch.irrigation_front_beds\",\n \"time\": 20,\n \"name\": \"Front beds\"\n}","output":"json","x":250,"y":3200,"wires":[["62b5545bc6d6e627"]]},{"id":"a31e3daf.17207","type":"api-call-service","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Turn On Master Valve","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.irrigation_master_valve"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":560,"y":3200,"wires":[["21ced698.708b5a"]]},{"id":"21ced698.708b5a","type":"delay","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"2s","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"outputs":1,"x":730,"y":3200,"wires":[["c661d489.9c9bc8"]]},{"id":"c661d489.9c9bc8","type":"api-call-service","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Turn On Zone","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":[],"data":"{ \"entity_id\": msg.zones.zone}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":880,"y":3200,"wires":[["accc6697.196268"]]},{"id":"accc6697.196268","type":"change","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Set Delay Variable","rules":[{"t":"set","p":"delay","pt":"msg","to":"msg.zones.time* 60000","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":1090,"y":3200,"wires":[["487ff788.8c5c98"]]},{"id":"487ff788.8c5c98","type":"stoptimer-varidelay","z":"f602e6ba.609d28","g":"55a2162532da4e14","duration":"5","durationType":"num","units":"Millisecond","payloadtype":"num","payloadval":"0","name":"Delay","reporting":"every_second","persist":false,"ignoretimerpass":false,"x":850,"y":3260,"wires":[["2238b09b.1b5b5","9129b06e.d8925"],[],["84258ddd.41da4"]]},{"id":"2238b09b.1b5b5","type":"api-call-service","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Turn Off Zone","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":[],"data":"{ \"entity_id\": msg.zones.zone}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":900,"y":3340,"wires":[[]]},{"id":"84258ddd.41da4","type":"mqtt out","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Publish Time Remaining","topic":"sensor/irrigation_time_remaining","qos":"","retain":"","broker":"546e31ed.0db1c","x":1130,"y":3320,"wires":[]},{"id":"9129b06e.d8925","type":"function","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Create msg object","func":"var message = \"Sprinkler auto-run: \" + msg.zones.name + \" ran for \" + msg.zones.time + \" minutes\"\n\nreturn { alert: message };","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1050,"y":3260,"wires":[["d83b5ff7a2212931"]]},{"id":"5ce1803b.06628","type":"link in","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"","links":["db46e0c1.f9ab5","d9f893eb.834f3"],"x":95,"y":3200,"wires":[["a2ab7368.923fb"]]},{"id":"815fddc0.6604c","type":"api-call-service","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Turn On 24v","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.irrigation_24v_power"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":470,"y":1900,"wires":[["af4788fe.215ba8"]]},{"id":"418058c4.af3158","type":"api-call-service","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Turn On 24v","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.irrigation_24v_power"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":470,"y":3040,"wires":[["d9f893eb.834f3"]]},{"id":"1ae21386.a831bc","type":"inject","z":"f602e6ba.609d28","g":"0f07749a4e1672ad","name":"06:00 24v Off","props":[],"repeat":"","crontab":"00 06 * * *","once":false,"onceDelay":0.1,"topic":"","x":180,"y":1140,"wires":[["117145a7.67e99a","882aff35f788008b"]]},{"id":"117145a7.67e99a","type":"api-call-service","z":"f602e6ba.609d28","g":"0f07749a4e1672ad","name":"Turn Off 24v","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":["switch.irrigation_24v_power"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":390,"y":1100,"wires":[[]]},{"id":"06d6255efdc31c47","type":"api-current-state","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Force Run","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_force_run","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":250,"y":1380,"wires":[["2fc67b25514de5a5"],["3ff9ce03ef7b554b"]]},{"id":"5420d0eed32223fb","type":"link out","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["f1cbfe0.7dfb4","08e3098cf183e086"],"x":595,"y":1360,"wires":[]},{"id":"3ff9ce03ef7b554b","type":"link out","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["f1cbfe0.7dfb4","4422f61c.847d88","8524a273a6a8ffd0"],"x":595,"y":1400,"wires":[]},{"id":"576b66fa1bd202a3","type":"link in","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["8c060f00.cf577"],"x":135,"y":1380,"wires":[["06d6255efdc31c47"]]},{"id":"7350c911a0b1a86d","type":"api-current-state","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Force Run","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_force_run","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":250,"y":2720,"wires":[["abb8777dd08aa743"],["4f2902edc77f2d3b"]]},{"id":"fdcfa1521191fa40","type":"link out","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["f1cbfe0.7dfb4","b403eec7866aea22"],"x":595,"y":2700,"wires":[]},{"id":"4f2902edc77f2d3b","type":"link out","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["f1cbfe0.7dfb4","6bcf06fb.9ca748"],"x":595,"y":2740,"wires":[]},{"id":"f6881b4bf93c27c5","type":"link in","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["c7e5552e.7f8a08"],"x":135,"y":2720,"wires":[["7350c911a0b1a86d"]]},{"id":"882aff35f788008b","type":"api-call-service","z":"f602e6ba.609d28","g":"0f07749a4e1672ad","name":"Turn Off Force Run","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_off","areaId":[],"deviceId":[],"entityId":["input_boolean.irrigation_force_run"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":410,"y":1160,"wires":[[]]},{"id":"a3d75225807b70eb","type":"delay","z":"f602e6ba.609d28","g":"79694877249c9902","name":"30 Minute Delay","pauseType":"delay","timeout":"30","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":280,"y":1760,"wires":[["339ee0ada21856e0"]]},{"id":"e2c37b65c5582c2b","type":"api-call-service","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Turn Off Start/Stop tracking","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":["automation.store_sprinkler_start_stop_times"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1060,"y":300,"wires":[[]]},{"id":"860a4c61d7557dc9","type":"api-call-service","z":"f602e6ba.609d28","g":"43a30fe5a5052c22","name":"Turn On Start/Stop tracking","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["automation.store_sprinkler_start_stop_times"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1360,"y":460,"wires":[[]]},{"id":"aa53225140781dd7","type":"api-render-template","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Evaluate Template","server":"e1dc0b88.463bb8","version":0,"template":"","resultsLocation":"data.continue","resultsLocationType":"msg","templateLocation":"template","templateLocationType":"msg","x":250,"y":3320,"wires":[["8113d83074ff7701"]]},{"id":"8113d83074ff7701","type":"switch","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Last Ran >= Template Hrs Ago","property":"data.continue","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"num"},{"t":"eq","v":"0","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":530,"y":3320,"wires":[["a31e3daf.17207"],["f78cdb84200eb171"]]},{"id":"d83b5ff7a2212931","type":"api-call-service","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Notify via Wrapper","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"script","service":"notify_wrapper","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": alert \t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1270,"y":3260,"wires":[[]]},{"id":"dd9855ca4017c8c0","type":"api-call-service","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Turn on Boolean","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_on","areaId":[],"deviceId":[],"entityId":["input_boolean.irrigation_rainfall_delay"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":700,"y":580,"wires":[[]]},{"id":"c3a696a117416327","type":"function","z":"f602e6ba.609d28","d":true,"g":"a9182c2cc04d2d9a","name":"Check Rainfall","func":"var rain_override = false\n\nfor (var i = 0; i < msg.payload.length; i++) {\n if (parseFloat(msg.payload[i].state) > 0.25) {\n rain_override = true\n }\n}\n\n// top = proceed\n// bottom = overridden\nif (rain_override === true) {\n return [ null, {rain_override} ];\n} \nelse {\n return [ {rain_override}, null ];\n}","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":680,"wires":[["47f1a8018e58e032"],["dd9855ca4017c8c0"]]},{"id":"27f2580e35031830","type":"api-get-history","z":"f602e6ba.609d28","d":true,"g":"a9182c2cc04d2d9a","name":"Rainfall 120h","server":"e1dc0b88.463bb8","version":1,"startDate":"","endDate":"","entityId":"sensor.netatmo_home_rain_sum_rain_today_inches","entityIdType":"equals","useRelativeTime":true,"relativeTime":"120h","flatten":true,"outputType":"array","outputLocationType":"msg","outputLocation":"payload","x":310,"y":680,"wires":[["c3a696a117416327"]]},{"id":"9cb8187c669c6485","type":"comment","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Rainfall","info":"","x":150,"y":600,"wires":[]},{"id":"47f1a8018e58e032","type":"api-call-service","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Turn off Boolean","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_off","areaId":[],"deviceId":[],"entityId":["input_boolean.irrigation_rainfall_delay"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":700,"y":660,"wires":[[]]},{"id":"427f7fa58d86cc59","type":"inject","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"*/30","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"1800","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":640,"wires":[["27f2580e35031830","93965a61d2c4f5de"]]},{"id":"1d9a4d0bb4645f32","type":"api-call-service","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Turn on Boolean","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_on","areaId":[],"deviceId":[],"entityId":["input_boolean.irrigation_rain_forecast_delay"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":700,"y":840,"wires":[[]]},{"id":"d9ebbaa37f5911a9","type":"comment","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Rain Forecast","info":"","x":170,"y":760,"wires":[]},{"id":"eeecfc1e8864e39f","type":"api-call-service","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Turn off Boolean","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_off","areaId":[],"deviceId":[],"entityId":["input_boolean.irrigation_rain_forecast_delay"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":700,"y":760,"wires":[[]]},{"id":"89487a4efedec1db","type":"inject","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"*/30","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"1800","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":800,"wires":[["2c45af5b3ee5cf0a","c3cb1c7d15767014"]]},{"id":"1e4b3bc7c25b294f","type":"function","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Rain Chance","func":"// Check next 4 precipitation_probability values\n// HA Template: \n// {% for j in state_attr(\"weather.kcll_daynight\",\"forecast\")[:4] %}\n// {{ j.precipitation_probability }}\n// {% endfor %}\n\nvar forecast_override = false\n\n// if (parseFloat(msg.payload) > 40) {\n// forecast_override = true\n// }\n \nfor (var i = 0; i < 4; i++) {\n if (parseFloat(msg.data.attributes.forecast[i].precipitation_probability) >= 60) {\n forecast_override = true\n }\n}\n\n// top = proceed\n// bottom = overridden\nif (forecast_override === true) {\n return [ null, {forecast_override} ];\n} \nelse {\n return [ {forecast_override}, null ];\n}","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":490,"y":800,"wires":[["eeecfc1e8864e39f"],["1d9a4d0bb4645f32"]]},{"id":"2c45af5b3ee5cf0a","type":"api-current-state","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Weather","server":"e1dc0b88.463bb8","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"weather.kcll_daynight","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":300,"y":800,"wires":[["1e4b3bc7c25b294f"]]},{"id":"d7e50e7a2810667d","type":"api-call-service","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Turn on Boolean","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_on","areaId":[],"deviceId":[],"entityId":["input_boolean.irrigation_wind_delay"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":700,"y":1000,"wires":[[]]},{"id":"28936ec687ee4eb0","type":"comment","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Wind","info":"","x":150,"y":920,"wires":[]},{"id":"974833b6a2eca853","type":"api-call-service","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Turn off Boolean","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"homeassistant","service":"turn_off","areaId":[],"deviceId":[],"entityId":["input_boolean.irrigation_wind_delay"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":700,"y":920,"wires":[[]]},{"id":"478a5a84d38ba181","type":"inject","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"*/5","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"300","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":960,"wires":[["c01fd0612615e927"]]},{"id":"c01fd0612615e927","type":"api-current-state","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Wind <= 10 MPH","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"10","halt_if_type":"num","halt_if_compare":"lte","entity_id":"sensor.nws_wind_speed","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":330,"y":960,"wires":[["974833b6a2eca853"],["d7e50e7a2810667d"]]},{"id":"219b37105a8304f1","type":"api-current-state","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Rainfall Delay","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_rainfall_delay","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":260,"y":1480,"wires":[["dcdeabc7.780578"],["d01fbafafbb34692"]]},{"id":"e7430e17f0b24ed8","type":"api-current-state","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Rain Forecast Delay","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_rain_forecast_delay","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":280,"y":1600,"wires":[["862ad27a.d347d"],["f5684be88477322f"]]},{"id":"b6e7d5b8891bba6d","type":"api-current-state","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Wind Delay","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_wind_delay","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":250,"y":1700,"wires":[["8d4bfe8e.ee805"],["a3d75225807b70eb"]]},{"id":"339ee0ada21856e0","type":"api-current-state","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Wind Delay","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_wind_delay","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":250,"y":1820,"wires":[["8d4bfe8e.ee805"],["336585d4eee0ca73"]]},{"id":"ed6e3d4225582e20","type":"api-current-state","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Rainfall Delay","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_rainfall_delay","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":260,"y":2820,"wires":[["f587589f.d739e8"],["f7ac7a90f3da2298"]]},{"id":"593bee0e8c958df8","type":"api-current-state","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Rain Forecast Delay","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_rain_forecast_delay","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":280,"y":2940,"wires":[["4fae5b92.a9cd44"],["67916c3a5554a794","4fae5b92.a9cd44"]]},{"id":"d01fbafafbb34692","type":"api-call-service","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.lawn_irrigation_reason"],"data":"{\"value\":\"Rainfall\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":630,"y":1500,"wires":[[]]},{"id":"f5684be88477322f","type":"api-call-service","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.lawn_irrigation_reason"],"data":"{\"value\":\"Rain Forecasted\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":630,"y":1620,"wires":[[]]},{"id":"336585d4eee0ca73","type":"api-call-service","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.lawn_irrigation_reason"],"data":"{\"value\":\"Wind\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":630,"y":1820,"wires":[[]]},{"id":"b3c4a3638c17629e","type":"api-call-service","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Clear Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.lawn_irrigation_reason"],"data":"{\"value\":\"None\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":260,"y":1900,"wires":[["815fddc0.6604c"]]},{"id":"67916c3a5554a794","type":"api-call-service","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.front_bed_irrigation_reason"],"data":"{\"value\":\"Rain Forecasted\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":630,"y":2960,"wires":[[]]},{"id":"f7ac7a90f3da2298","type":"api-call-service","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.front_bed_irrigation_reason"],"data":"{\"value\":\"Rainfall\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":630,"y":2840,"wires":[[]]},{"id":"45c5dbbbd8ce50a1","type":"api-call-service","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.front_bed_irrigation_reason"],"data":"{\"value\":\"Automation Off\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":630,"y":2640,"wires":[[]]},{"id":"2fc67b25514de5a5","type":"api-call-service","z":"f602e6ba.609d28","g":"79694877249c9902","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.lawn_irrigation_reason"],"data":"{\"value\":\"Force Run\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":450,"y":1360,"wires":[["5420d0eed32223fb"]]},{"id":"08e3098cf183e086","type":"link in","z":"f602e6ba.609d28","g":"79694877249c9902","name":"","links":["5420d0eed32223fb"],"x":325,"y":1960,"wires":[["815fddc0.6604c"]]},{"id":"abb8777dd08aa743","type":"api-call-service","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.front_bed_irrigation_reason"],"data":"{\"value\":\"Force Run\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":450,"y":2700,"wires":[["fdcfa1521191fa40"]]},{"id":"d8637d8d96b68fca","type":"api-call-service","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"Clear Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.front_bed_irrigation_reason"],"data":"{\"value\":\"None\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":260,"y":3040,"wires":[["418058c4.af3158"]]},{"id":"b403eec7866aea22","type":"link in","z":"f602e6ba.609d28","g":"68ec980b932fdba7","name":"","links":["fdcfa1521191fa40"],"x":325,"y":3100,"wires":[["418058c4.af3158"]]},{"id":"f2c9c3a5b8b11a64","type":"switch","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Continue?","property":"data.continue","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"num"},{"t":"eq","v":"1","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":1230,"y":2060,"wires":[["287dd3b1af5dc2d0"],["bf015af2161c5ec2"]]},{"id":"9896327569c234da","type":"link in","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"","links":["af4788fe.215ba8"],"x":95,"y":2060,"wires":[["e95ac52f03478921"]]},{"id":"e95ac52f03478921","type":"template","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Lawn Zones","field":"all_zones","fieldType":"msg","format":"json","syntax":"mustache","template":"[\n {\n \"zone\": \"switch.irrigation_front_lawn\",\n \"name\": \"Front lawn\"\n },\n {\n \"zone\": \"switch.irrigation_left_and_main_rear_lawn\",\n \"name\": \"Left and main rear lawn\"\n },\n {\n \"zone\": \"switch.irrigation_front_and_right_rear_lawn\",\n \"name\": \"Front and right rear lawn\"\n },\n {\n \"zone\": \"switch.irrigation_side_lawn\",\n \"name\": \"Side lawn\"\n }\n]","output":"json","x":290,"y":2060,"wires":[["287dd3b1af5dc2d0"]]},{"id":"174186fb5d054240","type":"api-render-template","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Evaluate Template","server":"e1dc0b88.463bb8","version":0,"template":"","resultsLocation":"data.continue","resultsLocationType":"msg","templateLocation":"template","templateLocationType":"msg","x":1050,"y":2060,"wires":[["f2c9c3a5b8b11a64"]]},{"id":"287dd3b1af5dc2d0","type":"array-loop","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Loop Through Zones","key":"al287dd3b1af5dc2d0","keyType":"msg","reset":true,"resetValue":"value-null","array":"all_zones","arrayType":"msg","x":220,"y":2120,"wires":[["74cd40702021e86d","acdcc72fea065aac"],["224d30a98f52c287"]]},{"id":"74cd40702021e86d","type":"template","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Zone Settings Lawn","field":"zones","fieldType":"msg","format":"json","syntax":"mustache","template":"[\n {\n \"zone\": \"switch.irrigation_front_lawn\",\n \"time\": 15,\n \"name\": \"Front lawn\"\n },\n {\n \"zone\": \"switch.irrigation_left_and_main_rear_lawn\",\n \"time\": 15,\n \"name\": \"Left and main rear lawn\"\n },\n {\n \"zone\": \"switch.irrigation_front_and_right_rear_lawn\",\n \"time\": 15,\n \"name\": \"Front and right rear lawn\"\n },\n {\n \"zone\": \"switch.irrigation_side_lawn\",\n \"time\": 10,\n \"name\": \"Side lawn\"\n },\n {\n \"zone\": \"switch.irrigation_front_lawn\",\n \"time\": 15,\n \"name\": \"Front lawn\"\n },\n {\n \"zone\": \"switch.irrigation_left_and_main_rear_lawn\",\n \"time\": 15,\n \"name\": \"Left and main rear lawn\"\n },\n {\n \"zone\": \"switch.irrigation_front_and_right_rear_lawn\",\n \"time\": 15,\n \"name\": \"Front and right rear lawn\"\n },\n {\n \"zone\": \"switch.irrigation_side_lawn\",\n \"time\": 10,\n \"name\": \"Side lawn\"\n }\n]","output":"json","x":460,"y":2180,"wires":[["151eb6ba5b2d39cd"]]},{"id":"bf015af2161c5ec2","type":"function","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Append Run Zones","func":"if (typeof msg.run_zones === 'undefined'){\n msg.run_zones = []\n}\n\n// Add zone to run_zones\nmsg.run_zones.push(msg.payload.zone)\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":210,"y":2180,"wires":[["287dd3b1af5dc2d0"]]},{"id":"151eb6ba5b2d39cd","type":"array-loop","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Loop Through Zones","key":"al287dd3b1af5dc2d0","keyType":"msg","reset":true,"resetValue":"value-null","array":"zones","arrayType":"msg","x":720,"y":2180,"wires":[[],["45ee74d06e9cac2c"]]},{"id":"45ee74d06e9cac2c","type":"switch","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"If Zone in Run Zone","property":"run_zones","propertyType":"msg","rules":[{"t":"cont","v":"payload.zone","vt":"msg"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":710,"y":2240,"wires":[["8d3c8370996be2da"],["151eb6ba5b2d39cd"]]},{"id":"95a54981805b22f2","type":"api-call-service","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Turn On Zone","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":[],"data":"{ \"entity_id\": payload.zone}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":880,"y":2320,"wires":[["02d1e639f7ac6596","7b985932412db47d"]]},{"id":"a4b3eba196a504dc","type":"api-call-service","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Turn Off Zone","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":[],"data":"{ \"entity_id\": payload.zone}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":540,"y":2500,"wires":[["6ea0448df1383ec2"]]},{"id":"02d1e639f7ac6596","type":"change","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Set Delay Variable","rules":[{"t":"set","p":"delay","pt":"msg","to":"payload.time* 60000","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":550,"y":2380,"wires":[["863b8fa63f210ebe"]]},{"id":"8d3c8370996be2da","type":"api-call-service","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Turn On Master Valve","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.irrigation_master_valve"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":560,"y":2320,"wires":[["b1c9631973c2f4b1"]]},{"id":"863b8fa63f210ebe","type":"stoptimer-varidelay","z":"f602e6ba.609d28","g":"a08dae6118c91c19","duration":"5","durationType":"num","units":"Millisecond","payloadtype":"num","payloadval":"0","name":"Delay","reporting":"every_second","persist":false,"ignoretimerpass":false,"x":510,"y":2440,"wires":[["a4b3eba196a504dc","de509d99b9d965b3"],[],["7d8374976c01e3dc"]]},{"id":"7d8374976c01e3dc","type":"mqtt out","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Publish Time Remaining","topic":"sensor/irrigation_time_remaining","qos":"","retain":"","broker":"546e31ed.0db1c","x":790,"y":2460,"wires":[]},{"id":"b0debe46542c4c67","type":"api-call-service","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Notify via Wrapper","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"script","service":"notify_wrapper","areaId":[],"deviceId":[],"entityId":[],"data":"{\t \"message\": alert \t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":990,"y":2420,"wires":[[]]},{"id":"de509d99b9d965b3","type":"function","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Create msg object","func":"var message = \"Sprinkler auto-run: \" + msg.payload.name + \" ran for \" + msg.payload.time + \" minutes\"\n\nreturn { alert: message };","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":2420,"wires":[["b0debe46542c4c67"]]},{"id":"b1c9631973c2f4b1","type":"delay","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"2s","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"outputs":1,"x":730,"y":2320,"wires":[["95a54981805b22f2"]]},{"id":"6ea0448df1383ec2","type":"delay","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Delay 10","pauseType":"delay","timeout":"10","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"outputs":1,"x":320,"y":2440,"wires":[["151eb6ba5b2d39cd"]]},{"id":"224d30a98f52c287","type":"api-current-state","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Force Run","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.irrigation_force_run","state_type":"str","blockInputOverrides":false,"outputProperties":[],"for":0,"forType":"num","forUnits":"minutes","x":510,"y":2060,"wires":[["bf015af2161c5ec2"],["38affe5cc680d076"]]},{"id":"5a27d31bfb4a6990","type":"comment","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Actually Handle Watering","info":"","x":1150,"y":2340,"wires":[]},{"id":"197853479ad9eeda","type":"comment","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Decide Which Zones to Run","info":"","x":1020,"y":2160,"wires":[]},{"id":"7b985932412db47d","type":"debug","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Log Zone On","active":false,"tosidebar":true,"console":true,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1100,"y":2280,"wires":[]},{"id":"acdcc72fea065aac","type":"debug","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Log Run Zones","active":false,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":350,"y":2260,"wires":[]},{"id":"f78cdb84200eb171","type":"api-call-service","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Set Reason","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.front_bed_irrigation_reason"],"data":"{\"value\":\"Recently Ran\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":750,"y":3380,"wires":[[]]},{"id":"93965a61d2c4f5de","type":"api-current-state","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"< 1\" in 5 Days","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"0.5","halt_if_type":"num","halt_if_compare":"gte","entity_id":"sensor.neighbor_5in1_rain_last_5_days","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":420,"y":620,"wires":[["dd9855ca4017c8c0"],["47f1a8018e58e032"]]},{"id":"54bad548.7e9fcc","type":"ha-get-entities","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Get \"On\" Sprinklers","server":"e1dc0b88.463bb8","version":1,"rules":[{"property":"entity_id","logic":"starts_with","value":"switch.irrigation","valueType":"str"},{"property":"entity_id","logic":"does_not_include","value":"switch.irrigation_master_valve,switch.irrigation_24v_power,switch.irrigation_drip","valueType":"str"},{"property":"state","logic":"is","value":"on","valueType":"str"}],"outputType":"array","outputEmptyResults":true,"outputLocationType":"msg","outputLocation":"payload","outputResultsCount":1,"x":390,"y":100,"wires":[["bcbf413e.7b188"]]},{"id":"5a10cd93.8e94b4","type":"inject","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"60","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":170,"y":100,"wires":[["54bad548.7e9fcc"]]},{"id":"a77808ff.3f1288","type":"switch","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"On Longer than 26 minutes?","property":"payload[0].timeSinceChangedMs","propertyType":"msg","rules":[{"t":"gte","v":"1600000","vt":"num"}],"checkall":"true","repair":false,"outputs":1,"x":720,"y":60,"wires":[["54ae6ec3.1bc63"]]},{"id":"54ae6ec3.1bc63","type":"api-call-service","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Turn Off Zone","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":[],"data":"{ \"entity_id\": payload[0].entity_id }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":980,"y":60,"wires":[[]]},{"id":"bcbf413e.7b188","type":"switch","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"More Than 0 Entities?","property":"payload","propertyType":"msg","rules":[{"t":"nempty"},{"t":"empty"}],"checkall":"true","repair":false,"outputs":2,"x":400,"y":160,"wires":[["a77808ff.3f1288","3b848bce.76aea4"],["656ad2cd6fb99f57"]]},{"id":"3b848bce.76aea4","type":"change","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Reset Delay","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":670,"y":100,"wires":[["cdd3b7ef.04a618"]]},{"id":"43dedcca.ac7734","type":"api-call-service","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Turn Off Master","server":"e1dc0b88.463bb8","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":["switch.irrigation_master_valve"],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1480,"y":180,"wires":[[]]},{"id":"c42e6d62.7a24c","type":"api-current-state","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Master On?","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"switch.irrigation_master_valve","state_type":"str","blockInputOverrides":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":750,"y":200,"wires":[["cdd3b7ef.04a618"],["3b848bce.76aea4"]]},{"id":"cdd3b7ef.04a618","type":"trigger","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Wait 1m","op1":"","op2":"0","op1type":"nul","op2type":"str","duration":"1","extend":false,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":880,"y":120,"wires":[["5e9007a27732bba9"]]},{"id":"63f07877e73b952a","type":"switch","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"More Than 0 Entities?","property":"payload","propertyType":"msg","rules":[{"t":"nempty"},{"t":"empty"}],"checkall":"true","repair":false,"outputs":2,"x":1100,"y":180,"wires":[[],["749afd72791a5127"]]},{"id":"5e9007a27732bba9","type":"ha-get-entities","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Get \"On\" Sprinklers","server":"e1dc0b88.463bb8","version":1,"rules":[{"property":"entity_id","logic":"starts_with","value":"switch.irrigation","valueType":"str"},{"property":"entity_id","logic":"does_not_include","value":"switch.irrigation_master_valve,switch.irrigation_24v_power","valueType":"str"},{"property":"state","logic":"is","value":"on","valueType":"str"}],"outputType":"array","outputEmptyResults":true,"outputLocationType":"msg","outputLocation":"payload","outputResultsCount":1,"x":1070,"y":120,"wires":[["63f07877e73b952a"]]},{"id":"061b74f643477dd9","type":"switch","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"More Than 0 Entities?","property":"payload","propertyType":"msg","rules":[{"t":"nempty"},{"t":"empty"}],"checkall":"true","repair":false,"outputs":2,"x":1380,"y":120,"wires":[["43dedcca.ac7734"],[]]},{"id":"749afd72791a5127","type":"trigger","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"Wait 1m","op1":"","op2":"0","op1type":"nul","op2type":"str","duration":"5","extend":false,"overrideDelay":false,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":1260,"y":60,"wires":[["061b74f643477dd9"]]},{"id":"656ad2cd6fb99f57","type":"function","z":"f602e6ba.609d28","g":"3cf0491ac33aecfa","name":"clear msg","func":"msg = {}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":200,"wires":[["c42e6d62.7a24c"]]},{"id":"c3cb1c7d15767014","type":"api-current-state","z":"f602e6ba.609d28","g":"a9182c2cc04d2d9a","name":"Weather","server":"e1dc0b88.463bb8","version":3,"outputs":2,"halt_if":"50","halt_if_type":"num","halt_if_compare":"gte","entity_id":"sensor.precip_probability","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","x":300,"y":860,"wires":[["1d9a4d0bb4645f32"],["eeecfc1e8864e39f"]]},{"id":"38affe5cc680d076","type":"template","z":"f602e6ba.609d28","g":"a08dae6118c91c19","name":"Template: Zone Last Ran >= 71 hours","field":"template","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{%- set entity_name = \"input_datetime{{ payload.zone }}\" | regex_replace(find='switch', replace='', ignorecase=False) -%}\n{%- set time = (as_timestamp(now()) - as_timestamp(states(entity_name+\"_last_start\"))) | int -%}\n{% if time >= 71*3600 %}1{% else %}0{% endif %}","output":"str","x":790,"y":2060,"wires":[["174186fb5d054240"]]},{"id":"62b5545bc6d6e627","type":"template","z":"f602e6ba.609d28","g":"55a2162532da4e14","name":"Template: Zone Last Ran >= 23 hours","field":"template","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"{%- set entity_name = \"input_datetime{{ zones.zone }}\" | regex_replace(find='switch', replace='', ignorecase=False) -%}\n{%- set time = (as_timestamp(now()) - as_timestamp(states(entity_name+\"_last_start\"))) | int -%}\n{% if time >= 23*3600 %}1{% else %}0{% endif %}","output":"str","x":310,"y":3260,"wires":[["aa53225140781dd7"]]}] \ No newline at end of file diff --git a/extras/appdaemon/apps/apps.yaml b/extras/appdaemon/apps/apps.yaml index ff85bc6f..b92a35a9 100644 --- a/extras/appdaemon/apps/apps.yaml +++ b/extras/appdaemon/apps/apps.yaml @@ -290,11 +290,11 @@ Backyard Flood Lights with Person Detection: module: door_open class: DoorLight constrain_end_time: sunrise - 01:00:00 - constrain_start_time: sunset + 00:30:00 + constrain_start_time: sunset trigger_sensor: binary_sensor.backyard_person_occupancy,binary_sensor.backyard_porch_person_occupancy toggle_entity: switch.backyard_flood_lights # Seconds to turn entity on when triggered - time_on: "30" + time_on: "300" Doorbell Ring Light: module: entity_timer diff --git a/extras/docker-compose/homeassistant/docker-compose.yml b/extras/docker-compose/homeassistant/docker-compose.yml index a776d7e2..e0ac0c57 100644 --- a/extras/docker-compose/homeassistant/docker-compose.yml +++ b/extras/docker-compose/homeassistant/docker-compose.yml @@ -207,6 +207,8 @@ services: - PORT=11111 - POWER_TOGGLE_WEBHOOK=http://10.0.1.22:8123/api/webhook/xxx - TZ=America/Chicago + - LOG_LEVEL=DEBUG + volumes: - /etc/localtime:/etc/localtime:ro devices: diff --git a/extras/docker-compose/other/docker-compose.yml b/extras/docker-compose/other/docker-compose.yml index a6f73278..35db391e 100644 --- a/extras/docker-compose/other/docker-compose.yml +++ b/extras/docker-compose/other/docker-compose.yml @@ -498,7 +498,7 @@ services: privileged: true restart: always #image: ghcr.io/blakeblackshear/frigate:stable - image: ghcr.io/blakeblackshear/frigate:dev-ca8ef70 + image: ghcr.io/blakeblackshear/frigate:dev-adb043e shm_size: "256mb" devices: - /dev/bus/usb:/dev/bus/usb @@ -514,7 +514,8 @@ services: # Two below needed for 2way stream - "8555:8555/tcp" - "8555:8555/udp" - - "127.0.0.1:1984:1984" # Expose localhost only for Home Assistant (go2rtc) + #- "127.0.0.1:1984:1984" # Expose localhost only for Home Assistant (go2rtc) + - 1984:1984/tcp labels: # HTTPS for CF - traefik.enable=true diff --git a/extras/docker-compose/unified/docker-compose.yml b/extras/docker-compose/unified/docker-compose.yml index b17206b0..b1a35849 100644 --- a/extras/docker-compose/unified/docker-compose.yml +++ b/extras/docker-compose/unified/docker-compose.yml @@ -208,6 +208,8 @@ services: - PORT=11111 - POWER_TOGGLE_WEBHOOK=http://10.0.1.22:8123/api/webhook/xxx - TZ=America/Chicago + - LOG_LEVEL=DEBUG + volumes: - /etc/localtime:/etc/localtime:ro devices: @@ -711,7 +713,7 @@ services: privileged: true restart: always #image: ghcr.io/blakeblackshear/frigate:stable - image: ghcr.io/blakeblackshear/frigate:dev-ca8ef70 + image: ghcr.io/blakeblackshear/frigate:dev-adb043e shm_size: "256mb" devices: - /dev/bus/usb:/dev/bus/usb @@ -727,7 +729,8 @@ services: # Two below needed for 2way stream - "8555:8555/tcp" - "8555:8555/udp" - - "127.0.0.1:1984:1984" # Expose localhost only for Home Assistant (go2rtc) + #- "127.0.0.1:1984:1984" # Expose localhost only for Home Assistant (go2rtc) + - 1984:1984/tcp labels: # HTTPS for CF - traefik.enable=true diff --git a/images/nodered_1.png b/images/nodered_1.png index 799d598a..323bcaa2 100644 Binary files a/images/nodered_1.png and b/images/nodered_1.png differ diff --git a/images/nodered_2.png b/images/nodered_2.png index 874f1efc..6a2e6af5 100644 Binary files a/images/nodered_2.png and b/images/nodered_2.png differ diff --git a/packages/blinds.yaml b/packages/blinds.yaml index 9f34a149..8a12a204 100644 --- a/packages/blinds.yaml +++ b/packages/blinds.yaml @@ -24,6 +24,11 @@ group: entities: - cover.office_blind_left - cover.office_blind_right + master_bedroom_blinds: + name: Master Bedroom Blinds + entities: + - cover.master_bedroom_blind_left + - cover.master_bedroom_blind_right cover: - platform: template @@ -53,6 +58,43 @@ cover: mdi:window-closed {% endif %} + - platform: template + covers: + master_bedroom_blinds: + friendly_name: "Master Bedroom Blinds" + open_cover: + # Calling with script.turn_on results in non-blocking vs. calling script directly + service: script.turn_on + target: + entity_id: script.blinds_group + data: + variables: + modus: "open" + group: master_bedroom + close_cover: + service: script.turn_on + target: + entity_id: script.blinds_group + data: + variables: + modus: "close" + group: master_bedroom + stop_cover: + service: script.turn_on + target: + entity_id: script.blinds_group + data: + variables: + modus: "stop" + group: master_bedroom + value_template: "{{is_state('sensor.master_bedroom_blinds', 'open')}}" + icon_template: >- + {% if is_state('sensor.master_bedroom_blinds', 'open') %} + mdi:window-open + {% else %} + mdi:window-closed + {% endif %} + - platform: template covers: office_blinds: @@ -122,6 +164,16 @@ sensor: closed {% endif %} + master_bedroom_blinds: + value_template: >- + {% if is_state('cover.master_bedroom_blind_left', 'open') %} + open + {% elif is_state('cover.master_bedroom_blind_right', 'open') %} + open + {% else %} + closed + {% endif %} + office_blinds: value_template: >- {% if is_state('cover.office_blind_left', 'open') %} @@ -153,17 +205,21 @@ script: entity_id: > {% if group == "guest_bedroom" %} {{ expand('group.guest_bedroom_blinds') | map(attribute='entity_id') | list}} + {% elif group == "master_bedroom" %} + {{ expand('group.master_bedroom_blinds') | map(attribute='entity_id') | list}} {% elif group == "dining_room" %} {{ expand('group.dining_room_blinds') | map(attribute='entity_id') | list}} {% elif group == "office" %} {{ expand('group.office_blinds') | map(attribute='entity_id') | list}} {% endif %} - - delay: "00:01:00" + - delay: "00:01:30" - service: "cover.{{modus}}_cover" target: entity_id: > {% if group == "guest_bedroom" %} {{ expand('group.guest_bedroom_blinds') | map(attribute='entity_id') | list}} + {% elif group == "master_bedroom" %} + {{ expand('group.master_bedroom_blinds') | map(attribute='entity_id') | list}} {% elif group == "dining_room" %} {{ expand('group.dining_room_blinds') | map(attribute='entity_id') | list}} {% elif group == "office" %} @@ -175,6 +231,8 @@ script: entity_id: > {% if group == "guest_bedroom" %} {{ expand('group.guest_bedroom_blinds') | map(attribute='entity_id') | list}} + {% elif group == "master_bedroom" %} + {{ expand('group.master_bedroom_blinds') | map(attribute='entity_id') | list}} {% elif group == "dining_room" %} {{ expand('group.dining_room_blinds') | map(attribute='entity_id') | list}} {% elif group == "office" %} @@ -256,10 +314,12 @@ automation: - cover.guest_bedroom_blind_right - cover.office_blind_left - cover.office_blind_right + - cover.master_bedroom_blind_left + - cover.master_bedroom_blind_right to: - opening - closing - for: "00:01:00" + for: "00:01:30" action: - service: homeassistant.update_entity target: diff --git a/packages/frigate.yaml b/packages/frigate.yaml index 88aeeff2..94d2c413 100644 --- a/packages/frigate.yaml +++ b/packages/frigate.yaml @@ -364,7 +364,7 @@ automation: entity_id: binary_sensor.garage_interior_door from: 'off' to: 'on' - condition: "{{ is_state('binary_sensor.security_status','on') }}" + condition: "{{ is_state('input_boolean.security_status','on') }}" action: - if: "{{ trigger.id == 'garage_door' }}" then: @@ -426,7 +426,7 @@ automation: # entity_id: # - camera.ptz # - camera.front_door - # - camera.driveway + # - casmera.driveway # - camera.back_porch - alias: Frigate Timelapse Creation @@ -519,6 +519,7 @@ shell_command: frigate_create_event: "curl -X POST --data '''{ 'duration': 30, 'include_recording': true }''' http://localhost:5000/api/events/{{camera}}/{{label}}/create" create_timelapse: /config/scripts/frigate_timelapse.sh {{ camera }} commit_frigate_changes: ssh nuc '/opt/homeassistant/scripts/commit_frigate_changes.sh' + # get_timelapse_snapshot: /config/scripts/get_timelapse_snapshot.sh {{ camera }} timer: frigate_notification_snooze: @@ -540,6 +541,15 @@ media_player: # media_content_type: audio/mpeg script: + # get_timelapse_snapshots: + # sequence: + # - service: shell_command.get_timelapse_snapshot + # data: + # camera: driveway + # height: 480 + # width: 704 + # file: '{{ "/config/media/images/camera.driveway" + "/" + now().strftime("%Y%m%d-%H%M%S") + ".jpg" }}' + doorbell_not_interested: sequence: # - service: tts.speak diff --git a/packages/irrigation.yaml b/packages/irrigation.yaml index f70387e5..fcd0c6ee 100644 --- a/packages/irrigation.yaml +++ b/packages/irrigation.yaml @@ -195,20 +195,20 @@ automation: - platform: state entity_id: - switch.bhyve_1 - - switch.bhyve_2 - - switch.bhyve_3 + # - switch.bhyve_2 + # - switch.bhyve_3 - platform: homeassistant event: start action: - service: python_script.bhyve_next_watering data: entity_id: switch.bhyve_1 - - service: python_script.bhyve_next_watering - data: - entity_id: switch.bhyve_2 - - service: python_script.bhyve_next_watering - data: - entity_id: switch.bhyve_3 + # - service: python_script.bhyve_next_watering + # data: + # entity_id: switch.bhyve_2 + # - service: python_script.bhyve_next_watering + # data: + # entity_id: switch.bhyve_3 - alias: Store Sprinkler Start/Stop Times id: "store_sprinkler_times" diff --git a/packages/leak_detection.yaml b/packages/leak_detection.yaml index 480d6719..6540b994 100644 --- a/packages/leak_detection.yaml +++ b/packages/leak_detection.yaml @@ -47,7 +47,10 @@ automation: and states('sensor.flume_sensor_home_current') | float > 0 and is_state('switch.irrigation_master_valve', 'off') and not is_state('switch.bhyve_1','on') + and not is_state('switch.bhyve_2','on') and is_state('group.trackers', 'not_home' ) + and not (now().hour == 9 and now().minute in [0,1,2,3,4,5,7,8,9,10]) + and not (now().hour == 9 and now().minute in [15,16,17,18,19,20]) and is_state('input_boolean.guest_mode', 'off') }}" then: - service: script.notify_wrapper @@ -60,7 +63,10 @@ automation: and states('sensor.flume_sensor_home_current') | float > 2.5 and is_state('switch.irrigation_master_valve', 'off') and not is_state('switch.bhyve_1','on') + and not is_state('switch.bhyve_2','on') and is_state('group.trackers', 'home' ) + and not (now().hour == 9 and now().minute in [0,1,2,3,4,5,7,8,9,10]) + and not (now().hour == 9 and now().minute in [15,16,17,18,19,20]) and is_state('input_boolean.guest_mode', 'off') }}" then: - service: script.notify_wrapper diff --git a/scripts.yaml b/scripts.yaml index 92803efa..aa1b0c98 100644 --- a/scripts.yaml +++ b/scripts.yaml @@ -99,6 +99,8 @@ master_bedroom_wakeup: # - service: script.turn_on # entity_id: # - script.christmas_wakeup + - service: cover.open_cover + entity_id: cover.master_bedroom_blinds - service: switch.turn_off data: entity_id: switch.master_bedroom_ceiling_fan @@ -120,12 +122,14 @@ master_bedroom_wakeup: master_bedroom_bedtime: sequence: + - service: cover.close_cover + entity_id: cover.master_bedroom_blinds # - service: script.turn_on # Calling this way allows the sequence to continue without blocking # entity_id: script.christmas_goodnight - service: script.appdaemon_ac_night - #- service: switch.turn_on - # data: - # entity_id: switch.master_bedroom_ceiling_fan + - service: switch.turn_on + data: + entity_id: switch.master_bedroom_ceiling_fan #- service: switch.turn_on # data: # entity_id: switch.master_bedroom_sound_machine @@ -321,4 +325,4 @@ andrew_phone_launch_watch_manager: data: package_name: "com.samsung.android.app.watchmanager" ttl: 0 - priority: high \ No newline at end of file + priority: high diff --git a/scripts/get_timelapse_snapshot.sh b/scripts/get_timelapse_snapshot.sh new file mode 100755 index 00000000..c9f4bd53 --- /dev/null +++ b/scripts/get_timelapse_snapshot.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# WIP.. sort of.. + +camera=$1 +height=$2 +width=$3 +file=$4 + +wget -O $4 http://10.0.1.22:1984/api/frame.jpeg?src=$1&h=$2&h=$3&q=60 diff --git a/ui-lovelace/04-master.yaml b/ui-lovelace/04-master.yaml index 98871195..17651493 100644 --- a/ui-lovelace/04-master.yaml +++ b/ui-lovelace/04-master.yaml @@ -18,5 +18,6 @@ cards: entity: light.master_bedroom_lamps - entity: switch.master_closet_light name: Closet Light + - cover.master_bedroom_blinds - !include .cards/spotify.yaml diff --git a/www/community/lovelace-wallpanel/wallpanel.js b/www/community/lovelace-wallpanel/wallpanel.js index 80a5f162..52d88a40 100644 --- a/www/community/lovelace-wallpanel/wallpanel.js +++ b/www/community/lovelace-wallpanel/wallpanel.js @@ -107,7 +107,7 @@ class ScreenWakeLock { } } -const version = "4.25.0"; +const version = "4.25.1"; const defaultConfig = { enabled: false, enabled_on_tabs: [], @@ -1616,6 +1616,9 @@ class WallpanelView extends HuiView { } val = date.toLocaleDateString(elHass.__hass.locale.language, options); } + if (typeof val === 'object') { + val = JSON.stringify(val); + } return prefix + val + suffix; }); infoElement.innerHTML = html; @@ -1778,7 +1781,7 @@ class WallpanelView extends HuiView { http.send(); } - updateImageFromUrl(img, url) { + fillPlaceholders(url) { let width = this.screensaverContainer.clientWidth; let height = this.screensaverContainer.clientHeight; let timestamp_ms = Date.now(); @@ -1787,12 +1790,20 @@ class WallpanelView extends HuiView { url = url.replace(/\${height}/g, height); url = url.replace(/\${timestamp_ms}/g, timestamp_ms); url = url.replace(/\${timestamp}/g, timestamp); - img.imageUrl = url; - logger.debug(`Updating image '${img.id}' from '${url}'`); + return url; + } + + updateImageFromUrl(img, url) { + const realUrl = this.fillPlaceholders(url); + if (realUrl != url && imageInfoCache[url]) { + imageInfoCache[realUrl] = imageInfoCache[url]; + } + img.imageUrl = realUrl; + logger.debug(`Updating image '${img.id}' from '${realUrl}'`); if (imageSourceType() == "media-entity") { - this.updateImageUrlWithHttpFetch(img, url); + this.updateImageUrlWithHttpFetch(img, realUrl); } else { - img.src = url; + img.src = realUrl; } } diff --git a/www/community/lovelace-wallpanel/wallpanel.js.gz b/www/community/lovelace-wallpanel/wallpanel.js.gz index 1efc18af..0e8c19b8 100644 Binary files a/www/community/lovelace-wallpanel/wallpanel.js.gz and b/www/community/lovelace-wallpanel/wallpanel.js.gz differ