From 088878a6936d602d08117558d8ff8f5cf527650a Mon Sep 17 00:00:00 2001 From: Smart Home Cambodia Date: Wed, 12 Jul 2023 22:23:45 +0700 Subject: [PATCH] New Addon Simple Schedule --- simple-scheduler/CHANGELOG.md | 118 +++ simple-scheduler/Dockerfile | 21 + simple-scheduler/README.md | 81 ++ simple-scheduler/asset/MQTT.MD | 61 ++ simple-scheduler/asset/docker_install.MD | 31 + simple-scheduler/asset/logo.png | Bin 0 -> 100952 bytes simple-scheduler/asset/mqtt_addon.png | Bin 0 -> 7867 bytes simple-scheduler/asset/mqtt_discovery.png | Bin 0 -> 38792 bytes simple-scheduler/asset/mqtt_integration.png | Bin 0 -> 7272 bytes simple-scheduler/build.yaml | 10 + simple-scheduler/config.yaml | 21 + simple-scheduler/icon.png | Bin 0 -> 4776 bytes .../rootfs/etc/services.d/interface/finish | 10 + .../rootfs/etc/services.d/interface/run | 11 + .../rootfs/etc/services.d/scheduler/finish | 10 + .../rootfs/etc/services.d/scheduler/run | 11 + .../rootfs/simplescheduler/interface.sh | 10 + .../rootfs/simplescheduler/main.py | 815 ++++++++++++++++++ .../rootfs/simplescheduler/options.dat | 42 + .../rootfs/simplescheduler/scheduler.py | 128 +++ .../rootfs/simplescheduler/scheduler.sh | 10 + .../simplescheduler/simpleschedulerconf.py | 5 + .../simplescheduler/templates/config.html | 60 ++ .../rootfs/simplescheduler/templates/dark.css | 35 + .../simplescheduler/templates/edit.html | 195 +++++ .../simplescheduler/templates/index.html | 406 +++++++++ .../simplescheduler/templates/light.css | 418 +++++++++ .../rootfs/simplescheduler/templates/new.html | 4 + 28 files changed, 2513 insertions(+) create mode 100644 simple-scheduler/CHANGELOG.md create mode 100644 simple-scheduler/Dockerfile create mode 100644 simple-scheduler/README.md create mode 100644 simple-scheduler/asset/MQTT.MD create mode 100644 simple-scheduler/asset/docker_install.MD create mode 100644 simple-scheduler/asset/logo.png create mode 100644 simple-scheduler/asset/mqtt_addon.png create mode 100644 simple-scheduler/asset/mqtt_discovery.png create mode 100644 simple-scheduler/asset/mqtt_integration.png create mode 100644 simple-scheduler/build.yaml create mode 100644 simple-scheduler/config.yaml create mode 100644 simple-scheduler/icon.png create mode 100755 simple-scheduler/rootfs/etc/services.d/interface/finish create mode 100755 simple-scheduler/rootfs/etc/services.d/interface/run create mode 100755 simple-scheduler/rootfs/etc/services.d/scheduler/finish create mode 100755 simple-scheduler/rootfs/etc/services.d/scheduler/run create mode 100755 simple-scheduler/rootfs/simplescheduler/interface.sh create mode 100644 simple-scheduler/rootfs/simplescheduler/main.py create mode 100644 simple-scheduler/rootfs/simplescheduler/options.dat create mode 100644 simple-scheduler/rootfs/simplescheduler/scheduler.py create mode 100755 simple-scheduler/rootfs/simplescheduler/scheduler.sh create mode 100644 simple-scheduler/rootfs/simplescheduler/simpleschedulerconf.py create mode 100644 simple-scheduler/rootfs/simplescheduler/templates/config.html create mode 100644 simple-scheduler/rootfs/simplescheduler/templates/dark.css create mode 100644 simple-scheduler/rootfs/simplescheduler/templates/edit.html create mode 100644 simple-scheduler/rootfs/simplescheduler/templates/index.html create mode 100644 simple-scheduler/rootfs/simplescheduler/templates/light.css create mode 100644 simple-scheduler/rootfs/simplescheduler/templates/new.html diff --git a/simple-scheduler/CHANGELOG.md b/simple-scheduler/CHANGELOG.md new file mode 100644 index 0000000..005fb92 --- /dev/null +++ b/simple-scheduler/CHANGELOG.md @@ -0,0 +1,118 @@ +**Version 2.11** +- Fix "Allow non admin users to view panel" (#74) + +**Version 2.1** +- Fix "Corrupted JSON files crash the addon" (#123) +- Fix "Setting hours to 24 crash the addon" (#124) + +**Version 2.0.50 (beta)** +- Fix MQTT Switches unavailable on restart (#111) +- Fix error if entity is null (#110) + +**Version 2.0.48 (beta)** +- create json folder if missing +- enable flask logs + +**Version 2.0 (beta)** +- Rewritten from scratch in Python +- Complete reengineering of the docker structure +- New feature: Configuration moved to frontend (you need to set option again!) +- New feature: Recurring type scheduler (from - to - every) +- New feature: Added "Do not retry" flag +- New feature: Added "Clone" button +- New MQTT Engine +- Auto respawn processes (frontend and scheduler) in case of crash +- Full UTF-8 support in scheduler name (include regional, mathematical, symbols and emoji) +- Log moved to frontend +- Log improvement (more clear and more detalied) +- Improvement of "Max Retry" option behavior +- Avoid queuing of some domains (script, scene, ecc) +- Massive bugfix + +**Version 0.64** +- Improvement: Set absolute value for light (#76) +- Improvement: MQTT Switches become unavailable if addon is not running +- Fix MQTT Switches duplicate with an ending 2 (#80) + +**Version 0.62** +- Timezone issue (#75) +- Added some fixes to allow installation on not-supervised env (thanks to @micw) + +**Version 0.61** +- Allow non admin users to view panel (#74) +- Fix "Missing translations" (#69) + +**Version 0.60** +- Switch Docker image to HA Debian base +- Complete reengineering of the docker structure +- Fix "returned a non-zero code" issue in supervised installation (#65) +- Added support for VACUUM + +**Version 0.50** +- New feature: Retry unavailable entities +- New feature: enable/disable schedulers in frontend (through MQTT) +- Improvement: Set fan percent speed +- Fixed bug in sorting (#61) +- Log improvement +- Several bugfixes + +**Version 0.40** +- New feature: week-based scheduler +- Improvement: added dark theme +- Improvement: added Fan +- Updated UI +- Several bugfixes + +**Version 0.35** +- Fix Temperature Only on multiple climate issue (#53) + +**Version 0.34** +- Improvement: Change climate temperature without turning it on (#51) +- Update material icons to latest version + +**Version 0.33** +- Improvement: manage commas as separator in time list (#46) +- Improvement: Added Cover (with position) (#49) + +**Version 0.32** +- Fix "too many time" visualization issue (#48) + +**Version 0.31** +- Fix single quote issue (#44) +- Javascript optimization + +**Version 0.30** +- Can set brightness to Lights +- Can set temperature in Climates +- Can add positive/negative offset to sunset/sunrise +- Embed style and script to avoid cache issues +- Bugfix + +**Version 0.22** +- Fixed a bug in scheduler + +**Version 0.21** +- Fixed visualization of UTF-8 chars (issue #11) + +**Version 0.20** +- Add Name to scheduling +- Can add more entities in one scheduler +- Can add multiple time in one scheduler +- Can drag rows to sort them +- Changed edit from row to sidebar +- Little graphic rewiew +- Code improvements + +**Version 0.16** +- Fix option.json issue +- Removed table sorting + +**Version 0.15** +- Fix Timezone Issue + +**Version 0.14** +- Fix the “permission denied” issue +- Sortable Columns +- Added status bar with scheduler engine status +- Added “debug option” to see all the error messages +- various bugfixes/improvements diff --git a/simple-scheduler/Dockerfile b/simple-scheduler/Dockerfile new file mode 100644 index 0000000..ca11912 --- /dev/null +++ b/simple-scheduler/Dockerfile @@ -0,0 +1,21 @@ +ARG BUILD_FROM +FROM ${BUILD_FROM} + +# Update Packages +RUN apt-get update -y && apt upgrade -y + +# Setup base +RUN apt-get install -y \ + coreutils \ + wget \ + curl \ + python3 \ + python3-dev \ + python3-pip + +# Install python modules +RUN pip3 install Flask requests paho-mqtt pytz psutil + +# Copy root filesystem +COPY rootfs / + diff --git a/simple-scheduler/README.md b/simple-scheduler/README.md new file mode 100644 index 0000000..b58002f --- /dev/null +++ b/simple-scheduler/README.md @@ -0,0 +1,81 @@ +# SimpleScheduler + +A Home Assistant AddOn to schedule switches,lights and other entities on a weekly base in a visual way without coding.\ +You can keep all the schedules in one place and add/change in a few clicks, even in your mobile app. + +![SimpleScheduler](https://raw.githubusercontent.com/arthurdent75/SimpleScheduler/master/asset/logo.png) + +### Installation +Add the repository and then the addon by clickin on the badges:\ +[](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Farthurdent75%2FSimpleScheduler) \ +[](https://my.home-assistant.io/redirect/supervisor_addon/?addon=00185a40_simplescheduler) \ +If something goes wrong, you can install it manually.\ +You can add the URL of this page in your "add-on store" as a new repository:\ +*Settings > Add-ons > ADD-ON STORE button in bottom right corner > three dots in top right corner > Repositories*\ +Click *Check for updates* and you will find the add-on "Simple Scheduler" listed. + +If you are not using a supervised installation, you can run the addon as a standalone docker. +Take a look here: [docker_install.MD](https://github.com/arthurdent75/SimpleScheduler/blob/master/asset/docker_install.MD "docker_install.MD") + +### Type of scheduler + +There are three kind of scheduler: +- **Daily**: you can set a ON/OFF time (or a list of them) and than you choose on which weekdays you want to enable them. +- **Weekly**: you can set a different ON/OFF time (or list of them) for every single day of the week. +- **Recurring**: you can set a recurring ON/OFF (FROM hh:mm TO hh:mm EVERY n MINUTES) and choose on which weekdays you want to enable them. + +"*A picture is worth a thousand words*", so if you take a look at the screenshot it will be even more clear. + +### How to use it +The add-on is very easy and intuitive (or, at least, that's what I hope)\ +Once installed, open the GUI, click on the round plus button in the bottom right and choose your schedule type.\ +Choose one or more entity from the dropdown, fill the ON time (in 24 hours format with leading zero, as suggested) and select the weekdays. Do the same for the OFF time and click "save". +That's it! + +### Advanced Feature +If you need more advanced feature: +- You can set multiple time in the same scheduler: just write them in the field separated by spaces. +- You can use the words **sunrise** and **sunset** and also add an offset (in minutes) to it if you need (e.g: **sunrise+30** or **sunset-60** ) +- You can set the percent brightness of a light. Write **16:30>B30** turn on the light at 30% +- You can set the absolute brightness of a light. Write **16:30>BA30** turn on the light at 30 +- You can set the temperature of a climate. Write **16:30>T22.5** to turn on the climate and set the temperature to 22.5° +- You can set the temperature of a climate without turning it on. Write **16:30>TO22.5** to set the temperature to 22.5° +- You can set the position of a cover. Write **16:30>P25** will set the cover at 25% +- You can set the fan speed. Write **16:30>F25** will turn on the fan at 25% +- Brightess/Temperature/Position/Speed only work in the "TURN ON" section (obviously)! +- It's not mandatory to add both ON and OFF time. You can leave one of them empty if you don't need it. For example, you want to turn off a light every day at 22:00, but you don't need to turn it on. +- You can also choose to disable a schedule: the schedule will stay there, but it will not be executed until you will enable it back +- You can **drag the rows to sort them**, so you can keep them organized as you like! + +Look at the picture above to see all this things in actions (and combined!). + +### Frontend switch to enable/disable (with MQTT) +If you want to enable/disable schedulers in frontend and/or automation, you can achieve that through MQTT. +This feature is disabled by default, because it require a working MQTT server (broker) and Home Assistant MQTT integration. +Take a look at the [MQTT.MD](https://github.com/arthurdent75/SimpleScheduler/blob/master/asset/MQTT.MD "MQTT.MD") file to know more. + +### Retry on unavailable +By default, SimpleScheduler will retry 3 times if an entity is unavailable. The first retry attempt happens after 5 second, than every minutes. You can change the numbers of retries in the addon options. + +### Hidden scheduler details +When you have a lot of schedulers the view can become messy. As a default, all the scheduler details are hidden, so you can have a clear look. +You can toggle the visibility with the *eye* icon near the scheduler name. +If you prefer to have all the schedule always visible, you can easily achive that by setting **details_uncovered: true** in the addon configuration + +### Dark theme +If you prefer a dark theme, you can activate it in the addon configuration by setting **dark_theme: true** + +### Translation +The default text language is English. They are very few words. +If you want to translate them, you just need to take a look at the configuration section of the addon. +Rewrite the words you would like to have in your language and restart the addon. +For the weekdays, as you can easily understand, only the first two chars are used. + +### Two words about the stored data +Every schedule (or row, if you prefer) is a JSON file stored in the [share/simplescheduler] folder under the SAMBA share. +This way the data can "survive" to an addon upgrade or reinstallation. +You can easily backup and restore them in case of failure. In the same way, you can (accidentally?) delete them. So be aware of that. + +### Last but not least +If you want to convince me to stay up at night to work on this, just buy me a beer 🍺 \ +You may say that regular people needs coffee to do that. Well, I'm not a regular person. diff --git a/simple-scheduler/asset/MQTT.MD b/simple-scheduler/asset/MQTT.MD new file mode 100644 index 0000000..f4146a0 --- /dev/null +++ b/simple-scheduler/asset/MQTT.MD @@ -0,0 +1,61 @@ +# MQTT Configuration +To enble/disable schedulers in the frontend and/or in an automation, you can use this feature. This allow to create dynamic switches entities in Home Assistant for each scheduler. +The switch is in this form: +`switch.simplescheduler_id_scheduler_name` +Switch is created within a minute of the creation of a new scheduler, and removed as you delete a scheduler. +To use the feature you need three things: +1. a MQTT server (also named *broker*) +2. enable the MQTT integration in Home Assistant +3. activate the feature in Simplescheduler + +It's less complicated than it seems! + +## If you already have MQTT in Home Assistant +Set up Simplescheduler to point to your MQTT broker and set *Enabled* to *true* + + MQTT: + enabled: true + server: your_mqtt_server_address + port: '1883' + username: your_mqtt_user + password: your_mqtt_password + +If auth is not used, leave the *username* and *password* fields empty. +You also need the MQTT Integration in your Home Assistant with discovery enabled. If you use MQTT you should already have it but if you don't, take a look at step 2 in the next section. + +## If you don't have MQTT configured +You have to follow three simple steps: + +#### 1. Install the addon "Mosquitto broker" +Install the addon "Mosquitto broker", start it and enable "Start on boot". +No configuration needed. + +![](https://raw.githubusercontent.com/arthurdent75/SimpleScheduler/master/asset/mqtt_addon.png) +#### 2. Install the MQTT integration +In ***Configuration > Device & Services*** add the MQTT integration. +If you succesfully complete the prevous task, Home Assistant should automatically discover the integration and notify you to add it. + +![](https://raw.githubusercontent.com/arthurdent75/SimpleScheduler/master/asset/mqtt_integration.png) + +Click on CONFIGURE and leave all the default, but be sure to enable auto discovery + +![](https://raw.githubusercontent.com/arthurdent75/SimpleScheduler/master/asset/mqtt_discovery.png) + + + + +#### 3. Configure Simpleschedule +Simplescheduler is already pre-configured to use the Mosquitto Addon, so leave the *server* and the *port* parameter as default. +Set *enabled* to *true* and add the username and the password that you use to login in Home Assistant. + + MQTT: + enabled: true + server: core-mosquitto + port: '1883' + username: your_homeassistant_user + password: your_homeassistant_password + +After that, restart the addon. + +If, for some reason, you don't want to write your HA credentials in the addon, you can use the credential that the MQTT integration use to talk to the MOSQUITTO addon. +The username is always *homeassistant* while the password is randomly generated during the addon installation. You can retrieve it in the MQTT integration by clicking on "RE-CONFIGURE MQTT", reveal the password with the eye icon and then copy the password. diff --git a/simple-scheduler/asset/docker_install.MD b/simple-scheduler/asset/docker_install.MD new file mode 100644 index 0000000..1c380ac --- /dev/null +++ b/simple-scheduler/asset/docker_install.MD @@ -0,0 +1,31 @@ +# Install this addon as a standalone docker + +## Build the docker container + +There is no ready-to-use docker image at the moment, so you have to build it. \ +After you clone the repository, cd to the folder that contain the Dockerfile and run: +``` +docker build . -t mysimplescheduler:latest --build-arg BUILD_FROM="ghcr.io/hassio-addons/debian-base/amd64:5.3.1" +``` +For architectures other than amd64, just replace amd64 with one of the following: aarch64 , armhf , armv7 , i386. + + +## Create a token to access homeassistant + +Log in to home assistant, go to your user profile, create a long running access token and copy it. + +## Create a folder to store persistent data + +You need to create a folder where the addon will save the data. You need to specify tha path in the docker run command + +## Run the docker image + +Run: + +``` +docker run -d -e SUPERVISOR_TOKEN=previously-created-token -e HASSIO_URL=http://your-hass-url:port/api -v /path/to/persistent/data:/share/simplescheduler -p 8099:8099 mysimplescheduler:latest +``` + +You can access the scheduler now at `http://localhost:8099`. + + diff --git a/simple-scheduler/asset/logo.png b/simple-scheduler/asset/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e8707e80d031a89692159fdd1ae7e3c9eec76e46 GIT binary patch literal 100952 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 m_naaBy%~@^Vt@aBy#|U*FA9kzel?y*`bv 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 EFGX2YL;wH) literal 0 HcmV?d00001 diff --git a/simple-scheduler/asset/mqtt_discovery.png b/simple-scheduler/asset/mqtt_discovery.png new file mode 100644 index 0000000000000000000000000000000000000000..8c81c7cad95c7cd75c86ddbfcb1066bdb98867ec GIT binary patch literal 38792 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 Nm2~7-Lfc_M#b2tauCxFE literal 0 HcmV?d00001 diff --git a/simple-scheduler/asset/mqtt_integration.png b/simple-scheduler/asset/mqtt_integration.png new file mode 100644 index 0000000000000000000000000000000000000000..a7cb630a97b6db1eb2da850a179a39ee036aef1b GIT binary patch literal 7272 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 U2`^S2)IorfoI1Eh#v<&00PtK2-T(jq literal 0 HcmV?d00001 diff --git a/simple-scheduler/build.yaml b/simple-scheduler/build.yaml new file mode 100644 index 0000000..aed3d1d --- /dev/null +++ b/simple-scheduler/build.yaml @@ -0,0 +1,10 @@ +--- +build_from: + aarch64: ghcr.io/hassio-addons/debian-base/aarch64:5.3.1 + amd64: ghcr.io/hassio-addons/debian-base/amd64:5.3.1 + armhf: ghcr.io/hassio-addons/debian-base/armhf:5.3.1 + armv7: ghcr.io/hassio-addons/debian-base/armv7:5.3.1 + i386: ghcr.io/hassio-addons/debian-base/i386:5.3.1 +codenotary: + base_image: notary@home-assistant.io + signer: notary@home-assistant.io diff --git a/simple-scheduler/config.yaml b/simple-scheduler/config.yaml new file mode 100644 index 0000000..a47c514 --- /dev/null +++ b/simple-scheduler/config.yaml @@ -0,0 +1,21 @@ +--- +version: "2.11" +name: Simple Scheduler +description: Simple timer on weekly base +slug: simplescheduler +url: https://github.com/arthurdent75/SimpleScheduler +codenotary: notary@home-assistant.io +arch: + - aarch64 + - amd64 + - armhf + - armv7 + - i386 +init: false +homeassistant_api: true +ingress: true +panel_admin: false +panel_title: Scheduler +panel_icon: mdi:calendar-clock +map: + - share:rw diff --git a/simple-scheduler/icon.png b/simple-scheduler/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b2a2384710f1e67231dfa45eb10bef2e3e526620 GIT binary patch literal 4776 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 nX2Xh^{M*X<^fdXi%>8jQ!Bf|d!@7MEl literal 0 HcmV?d00001 diff --git a/simple-scheduler/rootfs/etc/services.d/interface/finish b/simple-scheduler/rootfs/etc/services.d/interface/finish new file mode 100755 index 0000000..c42eaa5 --- /dev/null +++ b/simple-scheduler/rootfs/etc/services.d/interface/finish @@ -0,0 +1,10 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# Home Assistant Community Add-on: Example +# ============================================================================== +if [[ "${1}" -ne 0 ]] && [[ "${1}" -ne 256 ]]; then + bashio::log.warning "example 2 crashed, halting add-on" + /run/s6/basedir/bin/halt +fi + +bashio::log.info "example 2 stoped, restarting..." diff --git a/simple-scheduler/rootfs/etc/services.d/interface/run b/simple-scheduler/rootfs/etc/services.d/interface/run new file mode 100755 index 0000000..cec1660 --- /dev/null +++ b/simple-scheduler/rootfs/etc/services.d/interface/run @@ -0,0 +1,11 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# +# Home Assistant Add-on: SimpleScheduler +# +# ============================================================================== + +bashio::log.info "Starting service.d [Interface]" + +exec /simplescheduler/interface.sh + diff --git a/simple-scheduler/rootfs/etc/services.d/scheduler/finish b/simple-scheduler/rootfs/etc/services.d/scheduler/finish new file mode 100755 index 0000000..c42eaa5 --- /dev/null +++ b/simple-scheduler/rootfs/etc/services.d/scheduler/finish @@ -0,0 +1,10 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# Home Assistant Community Add-on: Example +# ============================================================================== +if [[ "${1}" -ne 0 ]] && [[ "${1}" -ne 256 ]]; then + bashio::log.warning "example 2 crashed, halting add-on" + /run/s6/basedir/bin/halt +fi + +bashio::log.info "example 2 stoped, restarting..." diff --git a/simple-scheduler/rootfs/etc/services.d/scheduler/run b/simple-scheduler/rootfs/etc/services.d/scheduler/run new file mode 100755 index 0000000..7f0a2fb --- /dev/null +++ b/simple-scheduler/rootfs/etc/services.d/scheduler/run @@ -0,0 +1,11 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# +# Home Assistant Add-on: SimpleScheduler +# +# ============================================================================== + +bashio::log.info "Starting service.d [Scheduler]" + +exec /simplescheduler/scheduler.sh + diff --git a/simple-scheduler/rootfs/simplescheduler/interface.sh b/simple-scheduler/rootfs/simplescheduler/interface.sh new file mode 100755 index 0000000..78cf85e --- /dev/null +++ b/simple-scheduler/rootfs/simplescheduler/interface.sh @@ -0,0 +1,10 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# +# Home Assistant Add-on: SimpleScheduler +# +# ============================================================================== + +bashio::log.info "Running interface.sh" + +python3 /simplescheduler/main.py \ No newline at end of file diff --git a/simple-scheduler/rootfs/simplescheduler/main.py b/simple-scheduler/rootfs/simplescheduler/main.py new file mode 100644 index 0000000..b2e3c3f --- /dev/null +++ b/simple-scheduler/rootfs/simplescheduler/main.py @@ -0,0 +1,815 @@ +from flask import Flask, render_template, request, redirect, make_response +import paho.mqtt.client as mqtt +import flask.cli +import logging +import glob +import os +import json +import uuid +from datetime import datetime, timedelta +import pytz +import requests +import re +import psutil + +import simpleschedulerconf + +lwt_topic = "homeassistant/switch/simplescheduler/availability" +sun_data = "" +schedulers_list = [] +options = [] +weekday = [] +has_changed: bool = False +mqttclient = None +ha_timezone = "utc" +scheduler_pid = 0 +request_timeout = 5 # seconds + +app = Flask(__name__) + +@app.route("/") +@app.route("/main") +def webserver_home(): + return render_template('index.html', + data=load_json_schedulers(), + o=get_options(), + css=get_css(), + switchlist=get_switch_html_select_options(), + friendlynames=get_switch_friendly_names(), + sort=get_sort_list(), + weekday=weekday, + statusbarinfo=get_statusbar_info() + ) + + +@app.route("/new") +def webserver_new(): + return render_template('new.html') + + +@app.route('/delete', methods=['GET']) +def webserver_delete(): + args = request.args + sid = args.get('id') + file = simpleschedulerconf.json_folder + sid + '.json' + if os.path.exists(file): + os.remove(file) + if options['MQTT']['enabled']: + mqttclient.publish('homeassistant/switch/simplescheduler/' + sid + '/config', "", qos=0, retain=1) + return redirect("main") + + +@app.route('/edit', methods=['GET']) +def webserver_edit(): + is_new = False + args = request.args + sid = args.get('id') + stype: str = args.get('type') + file = simpleschedulerconf.json_folder + sid + '.json' + if sid != "0": + with open(file, "r") as read_file: + param = json.load(read_file) + else: + param = json.loads(get_json_template(stype)) + param['id'] = uuid.uuid4().hex + is_new = True + + return render_template('edit.html', + p=param, + o=get_options(), + weekday=weekday, + switchlist=get_switch_html_select_options(), + is_new=is_new + ) + + +@app.route('/config', methods=['GET']) +def webserver_config(): + return render_template('config.html', + o=get_options() + ) + + +@app.route('/saveconfig', methods=['GET']) +def webserver_saveconfig(): + jsondata = {} + translations = {} + components = {} + mqttconf = {} + content = request.args + for item in content: + if content[item] == '0' or content[item] == '1': + value = int(content[item]) + else: + value = content[item] + if "." in item: + p = item.split(".") + cat = p[0].lower() + subcat = p[1] + if cat == "translations": translations[subcat] = value + if cat == "components": components[subcat] = value + if cat == "mqtt": mqttconf[subcat] = value + else: + jsondata[item] = value + + jsondata["translations"] = translations + jsondata["components"] = components + jsondata["MQTT"] = mqttconf + + option_file_path = os.path.join(simpleschedulerconf.json_folder, "options.dat") + with open(option_file_path, 'w') as option_file: + json_config = json.dump(jsondata, option_file) + + init() + + return redirect("main") + + +@app.route('/clone', methods=['GET']) +def webserver_clone(): + args = request.args + sid = args.get('id') + file = simpleschedulerconf.json_folder + sid + '.json' + if os.path.exists(file) and sid != "0": + with open(file, "r") as read_file: + param = json.load(read_file) + newsid = uuid.uuid4().hex + newfile = simpleschedulerconf.json_folder + newsid + '.json' + param['id'] = newsid + param['name'] = param['name'] + " (2) " + with open(newfile, 'w') as jsonFile: + json.dump(param, jsonFile) + return redirect("main") + + +@app.route("/update", methods=['POST']) +def webserver_update(): + sid = request.form.get('id') + enabled = request.form.get("enabled") + dontretry = request.form.get("dontretry") + name = request.form.get("name") + entity_id = request.form.getlist('entity_id[]') + type = request.form.get('type') + if type != 'weekly': + on_tod = request.form.get('on_tod') + off_tod = request.form.get('off_tod') + on_dow = "" + off_dow = "" + for o in request.form.getlist('on_dow[]'): + on_dow += o + for o in request.form.getlist('off_dow[]'): + off_dow += o + + data = json.loads(get_json_template(type)) + data['id'] = sid + data['name'] = name if name else sid + data['enabled'] = enabled if enabled else 0 + data['dontretry'] = dontretry if dontretry else 0 + data['entity_id'] = entity_id + if type == 'weekly': + data['weekly']['on_1'] = request.form.get('on_1') + data['weekly']['on_2'] = request.form.get('on_2') + data['weekly']['on_3'] = request.form.get('on_3') + data['weekly']['on_4'] = request.form.get('on_4') + data['weekly']['on_5'] = request.form.get('on_5') + data['weekly']['on_6'] = request.form.get('on_6') + data['weekly']['on_7'] = request.form.get('on_7') + data['weekly']['off_1'] = request.form.get('off_1') + data['weekly']['off_2'] = request.form.get('off_2') + data['weekly']['off_3'] = request.form.get('off_3') + data['weekly']['off_4'] = request.form.get('off_4') + data['weekly']['off_5'] = request.form.get('off_5') + data['weekly']['off_6'] = request.form.get('off_6') + data['weekly']['off_7'] = request.form.get('off_7') + elif type == 'recurring': + data['recurring']['on_start'] = request.form.get('on_start') + data['recurring']['on_end'] = request.form.get('on_end') + data['recurring']['on_interval'] = request.form.get('on_interval') + data['recurring']['off_start'] = request.form.get('off_start') + data['recurring']['off_end'] = request.form.get('off_end') + data['recurring']['off_interval'] = request.form.get('off_interval') + data['on_tod'] = on_tod + data['off_tod'] = off_tod + data['on_dow'] = on_dow + data['off_dow'] = off_dow + else: + data['on_tod'] = on_tod + data['off_tod'] = off_tod + data['on_dow'] = on_dow + data['off_dow'] = off_dow + file = simpleschedulerconf.json_folder + sid + '.json' + with open(file, 'w') as jsonFile: + json.dump(data, jsonFile) + if options['MQTT']['enabled']: + mqtt_send_config(mqttclient) + # mqtt_publish_state(mqttclient, id, enabled, True) + return redirect("main") + + +@app.route("/sort", methods=['GET']) +def webserver_sort(): + data = request.args + save_sort_list(data) + return make_response("", 200) + + +@app.route("/log", methods=['GET']) +def webserver_log(): + response = "" + logfilepath = os.path.join(simpleschedulerconf.json_folder, "simplescheduler.log") + with open(logfilepath, "r", encoding='utf-8') as logfile: + response += logfile.read() + return make_response(response, 200) + + +@app.route("/dirty") +def webserver_dirty(): + global has_changed + if has_changed: + r = '1' + has_changed = False + else: + r = '0' + return make_response(r, 200) + + +@app.context_processor +def utility_processor(): + def format_event(value: str, showvalue: bool): + if not value: return '' + result: str = "" + extra: str = "" + events = value.upper().replace(',', ' ').replace(';', ' ').split(' ') + + for e in events: + p = e.split('>') # separate time from extra commands + t: str = p[0] + extra = "" + if len(p) > 1 and showvalue: # verify extra commands + prefix = p[1][0] + v: str = p[1][1:] + if prefix == 'F': + extra = '' + v + '%' + if prefix == 'P': + extra = '' + v + '%' + if prefix == 'B': + if v[0] == 'A': + v = v[1:] + extra = '' + v + '' + else: + extra = '' + v + '%' + if prefix == 'T': + if v[0] == 'O': + v = v[1:] + extra = '' + v + '°' + else: + extra = '' + v + '°' + result += '' + t + extra + '' + return result + + return dict(format_event=format_event) + + +@app.context_processor +def utility_processor(): + def get_friendly_html_dow(value: str, is_on: bool): + result: str = "
" + if len(value) > 0: + onOffClass = "dowHiglightG" if is_on else "dowHiglightR" + for wd in range(1, 8): + d = weekday[wd] + dclass = "" + if str(wd) in value: + dclass = onOffClass + result += '
' + d + '
' + result += '
' + return result + + return dict(get_friendly_html_dow=get_friendly_html_dow) + + +def on_connect(client, userdata, flags, rc): + if rc == 0: + printlog("STATUS: MQTT connected! ") + client.publish(lwt_topic, payload="online", qos=0, retain=True) + client.subscribe("homeassistant/switch/simplescheduler/#") + else: + printlog("ERROR: MQTT Error " + str(rc)) + + +def on_message(client, userdata, msg): + global has_changed + payload = 0 + pieces = msg.topic.split("/") + if len(pieces) > 4: + if pieces[4] == "set": + sid = pieces[3] + printlog('MQTT: RCV ' + msg.topic + " --> " + msg.payload.decode()) + if msg.payload.decode() == 'ON': + payload = 1 + update_json_file(sid, 'enabled', payload) + if options['MQTT']['enabled']: + mqtt_publish_state(client, sid, payload, True) + has_changed = "1" + + +def get_statusbar_info(): + r = { + "sunrise": "N/A", + "sunset": "N/A", + "timezone": "N/A", + "scheduler": "Not running", + "mqtt": "Disabled" + } + tz = get_ha_timezone() + sunrise, sunset = get_sun(tz) + r['timezone'] = tz if tz else "N/A" + r['sunrise'] = sunrise.strftime("%H:%M") if sunrise else "N/A" + r['sunset'] = sunset.strftime("%H:%M") if sunset else "N/A" + pid = get_scheduler_pid() + if pid > 0: + r['scheduler'] = "Running (PID %s)" % pid + if options['MQTT']['enabled']: + r['mqtt'] = "Connected" if mqttclient.is_connected() else "Disconnected" + return r + + +def get_switch_list(domains): + full_switch_list = [] + url = simpleschedulerconf.HASSIO_URL + "/states" + headers = {'content-type': 'application/json', 'Authorization': 'Bearer ' + simpleschedulerconf.SUPERVISOR_TOKEN} + try: + r = requests.get(url=url, headers=headers, timeout=request_timeout) + for block in r.json(): + item = { + "id": block["entity_id"], + "state": block["state"], + "friendly_name": "", + "domain": "", + } + + pieces = block["entity_id"].split(".") + item["domain"] = pieces[0] + + attributes = block["attributes"] + if "friendly_name" in attributes: + item["friendly_name"] = attributes["friendly_name"] + + if item["domain"] in domains: + full_switch_list.append(item) + + full_switch_list.sort(key=lambda x: x["id"], reverse=False) + except: + printlog("ERROR: Unable to obtain entities info from Home Assistant") + return full_switch_list + + +def get_switch_friendly_names(): + friendly_names = {} + url = simpleschedulerconf.HASSIO_URL + "/states" + headers = {'content-type': 'application/json', 'Authorization': 'Bearer ' + simpleschedulerconf.SUPERVISOR_TOKEN} + try: + r = requests.get(url=url, headers=headers, timeout=request_timeout) + for block in r.json(): + key = block["entity_id"] + value = key + if "friendly_name" in block["attributes"]: + value = block["attributes"]["friendly_name"] + friendly_names[key] = value + except: + printlog("ERROR: Unable to obtain entities names from Home Assistant") + return friendly_names + + +def update_json_file(object_id, field_name, field_value): + file = simpleschedulerconf.json_folder + object_id + '.json' + try: + if os.path.exists(file): + with open(file, "r") as jsonFile: + data = json.load(jsonFile) + data[field_name] = field_value + with open(file, "w") as jsonFile: + json.dump(data, jsonFile) + except: + printlog("ERROR: Unable to update JSON file") + return True + + +def load_json_schedulers(): + ss = [] + os.chdir(simpleschedulerconf.json_folder) + for file in glob.glob("*.json"): + with open(file, "r") as read_file: + try: + ss.append(json.load(read_file)) + except: + printlog("ERROR: scheduler file %s is corrupted" % file ) + return ss + + +def mqtt_publish_state(client, object_id, pub_value, echo=False): + payload = 'OFF' + if pub_value: + payload = 'ON' + topic = 'homeassistant/switch/simplescheduler/' + object_id + '/state' + client.publish(topic, payload, qos=0, retain=1) + if echo: + printlog('MQTT: PUB ' + topic + ' --> ' + payload) + + +def mqtt_send_config(client): + schedulers = load_json_schedulers() + payload_template = '{"unique_id": "simplescheduler_###",' \ + '"name": "SimpleScheduler: @@@" ,' \ + '"icon":"mdi:calendar-clock" ,' \ + '"cmd_t": "homeassistant/switch/simplescheduler/###/set",' \ + '"stat_t": "homeassistant/switch/simplescheduler/###/state",' \ + '"avty_t": "homeassistant/switch/simplescheduler/availability",' \ + '"pl_avail":"online",' \ + '"pl_not_avail":"offline"}' + config_topic_template = 'homeassistant/switch/simplescheduler/###/config' + for S in schedulers: + if S and 'name' in S: + topic = config_topic_template.replace('###', S['id']) + payload = payload_template.replace('###', S['id']) + payload = payload.replace('@@@', S['name']) + # slug = slugify(S['name'], separator="_") + # payload = payload.replace('&&&', slug) + client.publish(topic, payload, qos=0, retain=1) + # time.sleep(.1) + mqtt_publish_state(client, S['id'], S['enabled'], False) + # time.sleep(.1) + + +def get_options(): + # path = "/data/options.json" + path = os.path.join(simpleschedulerconf.json_folder, "options.dat") + if not os.path.exists(path): + path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "options.dat") + with open(path, "r", encoding='utf-8') as read_file: + opt = json.load(read_file) + return opt + + +def get_css(): + global options + path_light = os.path.join(os.path.dirname(os.path.realpath(__file__)), "templates", "light.css") + path_dark = os.path.join(os.path.dirname(os.path.realpath(__file__)), "templates", "dark.css") + css = "" + # try: + with open(path_light, "r", encoding='utf-8') as css_file: + css += css_file.read() + if options['dark_theme']: + with open(path_dark, "r", encoding='utf-8') as css_file: + css += css_file.read() + # except: + # printlog("ERROR: Something went wrong while loading CSS") + return css + + +def get_enabled_domains(): + enabled_domains = [] + opt = get_options() + for d in opt['components']: + if opt['components'][d]: + enabled_domains.append(d) + return enabled_domains + + +def get_switch_html_select_options(): + htmlstring: str = '' + switch_list = get_switch_list(get_enabled_domains()) + comp = "" + for s in switch_list: + c = s['id'].split('.') + if comp != c[0]: + if comp != "": + htmlstring += '' + comp = c[0] + htmlstring += '' + name = s['id'] if s['friendly_name'] == "" else s['friendly_name'] + '(' + s['id'] + ')' + htmlstring += '' + htmlstring += '' + htmlstring = htmlstring.replace(chr(39), "'") + return htmlstring + + +def get_json_template(t: str): + t = t.lower() + json_template: str = '' + if t == 'w' or t == 'weekly': + json_template = '{"id":"","name":"","enabled":"1","entity_id":[""],"weekly":{"on_1":"","on_2":"","on_3":"",' \ + '"on_4":"","on_5":"","on_6":"","on_7":"","off_1":"","off_2":"","off_3":"","off_4":"",' \ + '"off_5":"","off_6":"","off_7":""}} ' + if t == 'd' or t == 'daily' or t is None: + json_template = '{"id":"","name":"","enabled":"1","entity_id":[""],"on_tod":"","on_dow":"","off_tod":"",' \ + '"off_dow":""} ' + if t == 'r' or t == 'recurring': + json_template = '{"id":"","name":"","enabled":"1","entity_id":[""],"recurring":{"on_start":"","on_end":"",' \ + '"on_interval":"","off_start":"","off_end":"","off_interval":""},"on_tod":"","on_dow":"",' \ + '"off_tod":"","off_dow":""} ' + + return json_template + + +def get_sort_list(): + sorting = {} + sort_file_path = simpleschedulerconf.json_folder + "sort.dat" + if os.path.exists(sort_file_path): + with open(sort_file_path, "r") as sort_file: + order = json.load(sort_file) + i = 0 + for sid in order['id_order']: + sorting[sid] = i + i = i + 1 + return sorting + + +def save_sort_list(data): + idlist = [] + for el in data: + idlist.append(data[el]) + jsonlist = json.loads('{"id_order":[]}') + jsonlist['id_order'] = idlist + with open(simpleschedulerconf.json_folder + "sort.dat", "w") as sort_file: + json.dump(jsonlist, sort_file) + return True + + +def get_events_in_html(): + events_html = {"events_on": "events_on", "events_off": "events_off", "days_on": "days_on", "days_off": "days_off"} + return events_html + + +def get_entity_status(e, check): + response = "" + url = simpleschedulerconf.HASSIO_URL + "/states/" + e + headers = {'content-type': 'application/json', 'Authorization': 'Bearer ' + simpleschedulerconf.SUPERVISOR_TOKEN} + try: + r = requests.get(url=url, headers=headers, timeout=request_timeout) + result = r.json() + response = str(result['state']).lower() + if check: + altered_response = response + domain = e.lower().split(".") + if domain[0] == 'cover': + altered_response = 'on' if response == "open" else 'off' + if domain[0] == 'climate' and response != 'off': + altered_response = 'on' + + response = altered_response + except: + printlog("ERROR: Unable to obtain entity status from Home Assistant") + return response + + +def call_ha_api(command_url: str, post_data: str): + opt = get_options() + headers = {'content-type': 'application/json', 'Authorization': 'Bearer ' + simpleschedulerconf.SUPERVISOR_TOKEN} + try: + r = requests.post(url=command_url, data=post_data, headers=headers, timeout=request_timeout) + command = command_url.replace(simpleschedulerconf.HASSIO_URL + "/services/", "") + if opt['debug']: printlog("DEBUG: %s %s" % (command, post_data)) + if r.status_code != 200: + printlog("ERROR: Error calling HA API " + str(r.status_code)) + except: + printlog("ERROR: Unable to call Home Assistant service") + return True + + +def call_ha(eid_list, action, passedvalue, friendly_name): + if not isinstance(eid_list, list): + eid_list = {eid_list} + for eid in eid_list: + command = "Turning " + action.upper() + extra = "" + v = "" + value = passedvalue.upper() + domain = eid.split(".") + command_url = simpleschedulerconf.HASSIO_URL + "/services/" + domain[0] + "/turn_" + action + postdata = '{"entity_id":"%s"}' % eid + + if action == 'on': + if domain[0] == "light" and value != "": + if value[0] == "A": + v = int(value[1:]) + extra = "to %d" % v + elif value.isdigit(): + v = int(int(value) * 2.55) + extra = "to " + value + '%' + postdata = '{"entity_id":"%s","brightness":"%d"}' % (eid, v) + + if domain[0] == "fan" and value != "": + v = value + extra = "to " + v + '%' + postdata = '{"entity_id":"%s","percentage":"%s"}' % (eid, v) + + if domain[0] == "cover": + if value != "": + command_url = simpleschedulerconf.HASSIO_URL + "/services/cover/set_cover_position" + postdata = '{"entity_id":"%s","position":"%s"}' % (eid, value) + command = "Setting" + extra = "position to " + value + '%' + else: + if action == "on": + command_url = simpleschedulerconf.HASSIO_URL + "/services/cover/open_cover" + command = "Opening" + + if domain[0] == "climate" and value != "": + if value[0] == "O": + v = value[1:] + command_url = simpleschedulerconf.HASSIO_URL + "/services/climate/set_temperature" + postdata = '{"entity_id":"%s","temperature":"%s"}' % (eid, v) + command = "Setting" + extra = "temperature to " + v + '°' + else: + if domain[0] == "cover": + command_url = simpleschedulerconf.HASSIO_URL + "/services/cover/close_cover" + command = "Closing" + + printlog("SCHED: %s [%s] %s" % (command, friendly_name.get(eid, eid), extra)) + call_ha_api(command_url, postdata) + + if domain[0] == "climate" and value != "": + if value[0] != "O": + command_url = simpleschedulerconf.HASSIO_URL + "/services/climate/set_temperature" + postdata = '{"entity_id":"%s","temperature":"%s"}' % (eid, value) + call_ha_api(command_url, postdata) + command = "Setting" + extra = "temperature to " + value + '°' + printlog("SCHED: %s [%s] %s" % (command, friendly_name.get(eid, eid), extra)) + + return True + +def is_a_retry_domain(entity): + response = True + if "scene." in entity : response = False + if "script." in entity: response = False + if "automation." in entity: response = False + if "media_player." in entity: response = False + if "camera." in entity: response = False + return response + +def get_events_array(s): + s = s.upper().replace(',', ' ').replace(';', ' ').strip() + s = re.sub(' +', ' ', s) + events = s.split(' ') + return events + + +def evaluate_event_time(s, sunrise, sunset): + event = "" + sunrise_day = "" + sunset_day = "" + + if sunrise: + sunrise_day = sunrise.strftime("%d") + if sunset: + sunset_day = sunset.strftime("%d") + today = datetime.now().strftime("%d") + if len(s) > 3: + p = s.upper().split('>') + event = p[0] + operator = "~" + if event[:3] == "SUN": + if event.find('+') != -1: operator = "+" + if event.find('-') != -1: operator = "-" + eventime = event.split(operator) + event = "" + if eventime[0] == "SUNRISE" and sunrise_day == today: + event = sunrise.strftime("%H:%M") + if eventime[0] == "SUNSET" and sunset_day == today: + event = sunset.strftime("%H:%M") + if event != "" and len(eventime) > 1: + hm = event.split(":") + if operator == '+': + event = (datetime(2022, 1, 1, int(hm[0]), int(hm[1])) + timedelta( + minutes=int(eventime[1]))).strftime("%H:%M") + else: + event = (datetime(2022, 1, 1, int(hm[0]), int(hm[1])) - timedelta( + minutes=int(eventime[1]))).strftime("%H:%M") + if event: + hm = event.split(":") + if 0 <= int(hm[0]) < 24 and 0 <= int(hm[1]) < 60: + event = datetime(2022, 1, 1, int(hm[0]), int(hm[1])).strftime("%H:%M") # fix missing leading zeroes + + return event + + +def get_sun(tz, sunrise="", sunset=""): + if tz: + mytimezone = pytz.timezone(tz) + url = simpleschedulerconf.HASSIO_URL + "/states/sun.sun" + headers = {'content-type': 'application/json', + 'Authorization': 'Bearer ' + simpleschedulerconf.SUPERVISOR_TOKEN} + try: + r = requests.get(url=url, headers=headers, timeout=request_timeout) + result = r.json() + response = result['attributes'] + sunrise = datetime.fromisoformat(response['next_rising']).astimezone(mytimezone) + sunset = datetime.fromisoformat(response['next_setting']).astimezone(mytimezone) + except: + printlog("ERROR: Unable to obtain sun info from Home Assistant") + return sunrise, sunset + + +def get_ha_timezone(): + response = "" + url = simpleschedulerconf.HASSIO_URL + "/config" + headers = {'content-type': 'application/json', 'Authorization': 'Bearer ' + simpleschedulerconf.SUPERVISOR_TOKEN} + try: + r = requests.get(url=url, headers=headers, timeout=request_timeout) + result = r.json() + response = result['time_zone'] + except: + printlog("ERROR: Unable to obtain timezone from Home Assistant") + else: + try: + if not response: + response = os.environ["TZ"] + except: + printlog("ERROR: Unable to obtain timezone from OS") + return response + + +def get_scheduler_pid(): + pid = 0 + try: + for process in psutil.process_iter(): + if "/simplescheduler/scheduler.py" in process.cmdline(): + pid = process.pid + except: + printlog("ERROR: Unable to obtain scheduler PID") + return pid + + +def printlog(message): + t = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + fullrow = "[%s] %s" % (t, message) + print(fullrow) + + if not os.path.exists(simpleschedulerconf.json_folder): + os.makedirs(simpleschedulerconf.json_folder) + + logfilepath = os.path.join(simpleschedulerconf.json_folder, "simplescheduler.log") + with open(logfilepath, "a", encoding='utf-8') as logfile: + logfile.write(fullrow + "\n") + + +def init(): + global options + global weekday + global schedulers_list + global ha_timezone + + options = get_options() + weekday = \ + [ + options['translations']['text_sunday'][:2], + options['translations']['text_monday'][:2], + options['translations']['text_tuesday'][:2], + options['translations']['text_wednesday'][:2], + options['translations']['text_thursday'][:2], + options['translations']['text_friday'][:2], + options['translations']['text_saturday'][:2], + options['translations']['text_sunday'][:2] + ] + + if options['debug']: + printlog(" QUESTION: What do you get if you multiply six by nine?") + printlog(" ANSWER: 42") + + schedulers_list = load_json_schedulers() + + ha_timezone = get_ha_timezone() + + +if __name__ == '__main__': + + printlog('STATUS: Starting main program') + + init() + + if options['MQTT']['enabled']: + printlog('STATUS: Starting MQTT') + mqttclient = mqtt.Client(client_id="SimpleScheduler", clean_session=False) + mqttclient.on_connect = on_connect + mqttclient.on_message = on_message + mqttclient.will_set(lwt_topic, payload="offline", qos=0, retain=True) + mqttclient.username_pw_set(options['MQTT']['username'], options['MQTT']['password']) + try: + mqttclient.connect(options['MQTT']['server'], int(options['MQTT']['port']), 60) + except: + printlog("ERROR: MQTT Connection failed") + else: + mqttclient.loop_start() + mqtt_send_config(mqttclient) + + # Disable Flask Messages + log = logging.getLogger('werkzeug') + log.disabled = True + flask.cli.show_server_banner = lambda *args: None + # app.logger.disabled = True + + printlog('STATUS: Starting WebServer') + app.run(host='0.0.0.0', port=8099, debug=False) diff --git a/simple-scheduler/rootfs/simplescheduler/options.dat b/simple-scheduler/rootfs/simplescheduler/options.dat new file mode 100644 index 0000000..81eb6e0 --- /dev/null +++ b/simple-scheduler/rootfs/simplescheduler/options.dat @@ -0,0 +1,42 @@ +{ + "translations": { + "text_monday": "Monday", + "text_tuesday": "Tuesday", + "text_wednesday": "Wednesday", + "text_thursday": "Thursday", + "text_friday": "Friday", + "text_saturday": "Saturday", + "text_sunday": "Sunday", + "text_ON": "ON", + "text_OFF": "OFF", + "text_save": "Save", + "text_enabled": "Enabled", + "text_device": "Device", + "text_name": "Name" + }, + "components": { + "light": true, + "scene": true, + "switch": true, + "script": true, + "camera": true, + "climate": true, + "cover": true, + "vacuum": true, + "fan": true, + "automation": true, + "input_boolean": true, + "media_player": true + }, + "MQTT": { + "enabled": false, + "server": "core-mosquitto", + "port": "1883", + "username": "", + "password": "" + }, + "max_retry": "3", + "details_uncovered": true, + "dark_theme": false, + "debug": false +} diff --git a/simple-scheduler/rootfs/simplescheduler/scheduler.py b/simple-scheduler/rootfs/simplescheduler/scheduler.py new file mode 100644 index 0000000..4f88c1e --- /dev/null +++ b/simple-scheduler/rootfs/simplescheduler/scheduler.py @@ -0,0 +1,128 @@ +import uuid +from datetime import datetime +from time import sleep + +import main + +command_queue = {} +sunrise = "" +sunset = "" +options = [] + +if __name__ == '__main__': + + main.printlog('STATUS: Starting scheduler') + + while True: + seconds = datetime.now().strftime("%S") + if seconds == '00': + options = main.get_options() + try: + max_retry = int(options['max_retry']) + except: + max_retry = 3 + if max_retry < 0: max_retry = 3 + if max_retry > 5: max_retry = 5 + current_time = datetime.now().strftime("%H:%M") + current_dow = datetime.now().strftime("%w") + schedulers_list = main.load_json_schedulers() + friendly_name = main.get_switch_friendly_names() + if current_time == "00:01" or sunset == "" or sunrise == "": + if options['debug']: + main.printlog('DEBUG: Retrieving sunrise and sunset') + sunrise, sunset = main.get_sun(main.get_ha_timezone()) + if current_dow == '0': + current_dow = '7' + for s in schedulers_list: + if s['enabled']: + dont_retry = s.get('dontretry',0) + if options['debug']: main.printlog("DEBUG: Parsing [%s]" % s['name']) + week_onoff = s.get('weekly') + + if week_onoff: + s['weekly'] = '' + s['on_tod'] = week_onoff['on_' + current_dow] + s['off_tod'] = week_onoff['off_' + current_dow] + s['on_dow'] = current_dow + s['off_dow'] = current_dow + + if current_dow in s['on_dow']: + elist = main.get_events_array(s['on_tod']) + for e in elist: + value = "" + p = e.upper().split('>') + t = p[0] + if len(p) > 1: + value = p[1][1:] + event_time = main.evaluate_event_time(t, sunrise, sunset) + if event_time == current_time: + main.printlog("SCHED: Executing ON actions for [%s]" % s['name']) + main.call_ha(s['entity_id'], "on", value, friendly_name ) + for entity in s['entity_id']: + if (len(value) > 0 and value[0] != 'O') or not value : # if TemperatureOnly don't add to queue + if not dont_retry and max_retry > 0 : + if main.is_a_retry_domain(entity): + command_queue[uuid.uuid4().hex] = {"entity_id": entity, "sched_id": s['id'], + "state": "on", "value": value, + "countdown": max_retry,"max_retry": max_retry} + + if current_dow in s['off_dow']: + elist = main.get_events_array(s['off_tod']) + for e in elist: + value = "" + p = e.upper().split('>') + t = p[0] + if len(p) > 1: + value = p[1][1:] + event_time = main.evaluate_event_time(t, sunrise, sunset) + if event_time == current_time: + main.printlog("SCHED: Executing OFF actions for [%s]" % s['name']) + main.call_ha(s['entity_id'], "off", value, friendly_name ) + for entity in s['entity_id']: + if (len(value) > 0 and value[0] != 'O') or not value: # if TemperatureOnly don't add to queue + if not dont_retry and max_retry > 0 : + if main.is_a_retry_domain(entity): + command_queue[uuid.uuid4().hex] = {"entity_id": entity, "sched_id": s['id'], + "state": "off", "value": value, + "countdown": max_retry,"max_retry": max_retry} + + sleep(5) + + if options['debug']: main.printlog("DEBUG: Max Retry: %d" % max_retry) + if options['debug']: main.printlog("DEBUG: Starting Queue management - Queue length: %d" % len(command_queue)) + + for key in command_queue.copy(): + + value = command_queue[key] + entity_status = main.get_entity_status(value['entity_id'], True) + if options['debug']: main.printlog( + "DEBUG: ID:%s | Entity status:%s | Queue item:%s" % (key, entity_status.upper(), value)) + + if entity_status == 'unavailable': + attempt = 1 + int(value['max_retry']) - int(value['countdown']) + main.printlog("SCHED: [%s] is unavailable. Attempt %d of %d" % ( + friendly_name.get(value['entity_id'], value['entity_id']), attempt, int(value['max_retry']) )) + command_queue[key]['countdown'] = int(value['countdown']) - 1 + if command_queue[key]['countdown'] <= 0: + main.printlog( + "SCHED: Giving up on [%s]" % friendly_name.get(value['entity_id'], value['entity_id'])) + command_queue.pop(key) + else: + if entity_status != value['state']: + attempt = 1 + int(value['max_retry']) - int(value['countdown']) + main.printlog("SCHED: Failed to set [%s]. Retry %d of %d " % ( + friendly_name.get(value['entity_id'], value['entity_id']), attempt, int(value['max_retry']))) + main.call_ha(value['entity_id'], value['state'], value['value'], friendly_name ) + command_queue[key]['countdown'] = int(value['countdown']) - 1 + if command_queue[key]['countdown'] <= 0: + main.printlog( + "SCHED: Giving up on [%s]" % friendly_name.get(value['entity_id'], value['entity_id'])) + command_queue.pop(key) + else: + main.printlog("SCHED: [%s] is %s as requested!" % ( + friendly_name.get(value['entity_id'], value['entity_id']), entity_status.upper())) + command_queue.pop(key) + + if options['debug']: main.printlog("DEBUG: Finished Queue management - Queue length: %d" % len(command_queue)) + + sleep(1) diff --git a/simple-scheduler/rootfs/simplescheduler/scheduler.sh b/simple-scheduler/rootfs/simplescheduler/scheduler.sh new file mode 100755 index 0000000..099da35 --- /dev/null +++ b/simple-scheduler/rootfs/simplescheduler/scheduler.sh @@ -0,0 +1,10 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# +# Home Assistant Add-on: SimpleScheduler +# +# ============================================================================== + +bashio::log.info "Running scheduler.sh" + +python3 /simplescheduler/scheduler.py \ No newline at end of file diff --git a/simple-scheduler/rootfs/simplescheduler/simpleschedulerconf.py b/simple-scheduler/rootfs/simplescheduler/simpleschedulerconf.py new file mode 100644 index 0000000..2f93053 --- /dev/null +++ b/simple-scheduler/rootfs/simplescheduler/simpleschedulerconf.py @@ -0,0 +1,5 @@ +import os +json_folder = "/share/simplescheduler/" +SUPERVISOR_TOKEN = os.environ["SUPERVISOR_TOKEN"] +HASSIO_URL = os.environ.get("HASSIO_URL","http://hassio/homeassistant/api") + diff --git a/simple-scheduler/rootfs/simplescheduler/templates/config.html b/simple-scheduler/rootfs/simplescheduler/templates/config.html new file mode 100644 index 0000000..4cea196 --- /dev/null +++ b/simple-scheduler/rootfs/simplescheduler/templates/config.html @@ -0,0 +1,60 @@ +MQTT + {% for t in o.MQTT %} + + {{ t }} + {% if t=="enabled": %} +   (need restart) + {% else %} + + {% endif %} + + + {% endfor %} + +DOMAINS + {% for t in o.components %} + + {{ t }} + + + + {% endfor %} + +TRANSLATIONS + {% for t in o.translations %} + + {{ t | replace("text_","") | upper }} + + + + {% endfor %} + +Misc + + Max retry + + + + + Details uncovered + + + + + Dark theme + + + + + Debug mode + + + + + + + + + + + diff --git a/simple-scheduler/rootfs/simplescheduler/templates/dark.css b/simple-scheduler/rootfs/simplescheduler/templates/dark.css new file mode 100644 index 0000000..4747028 --- /dev/null +++ b/simple-scheduler/rootfs/simplescheduler/templates/dark.css @@ -0,0 +1,35 @@ +BODY { background-color: #111111; color: white; } + +.table td, .table th { border-top: 1px solid #333; color: white; } + +.week_table_header { color: #e1e1e1; } + +.badge {font-weight: 400; } + +.btn-circle { box-shadow: none; } + +.drag_icon { color: white; } + +#sidebar { + background-color: #222; + box-shadow: 5px 5px 18px 0px #777; +} + +.table-hover>tbody>tr:hover>* { + background-color: rgb(255 255 255 / 15%); + color: white; } + +div.row-title P {color: white;} + +.week_table_cell { border-bottom: 1px solid #777; } + +.text-green { color: lightgreen; } +.text-red { color: #F66; } + + #recurring_preview_on, + #recurring_preview_off + { + opacity: 1; + } + +#logcontent {color: #000} \ No newline at end of file diff --git a/simple-scheduler/rootfs/simplescheduler/templates/edit.html b/simple-scheduler/rootfs/simplescheduler/templates/edit.html new file mode 100644 index 0000000..acbb946 --- /dev/null +++ b/simple-scheduler/rootfs/simplescheduler/templates/edit.html @@ -0,0 +1,195 @@ +
+
+

{{ p.id }}

+
+ + + +
+ +
+
+ +     + +
+ + +
+ {% if p.entity_id %} + {% for e in p.entity_id %} +
+
+ +
+
+
+ {% endfor %} + {% endif %} +
+ +
+ +
+ + {% if p.weekly: %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{ o.translations.text_ON }}{{ o.translations.text_OFF }}
{{ o.translations.text_monday[:2] }}
{{ o.translations.text_tuesday[:2] }}
{{ o.translations.text_wednesday[:2] }}
{{ o.translations.text_thursday[:2] }}
{{ o.translations.text_friday[:2] }}
{{ o.translations.text_saturday[:2] }}
{{ o.translations.text_sunday[:2] }}
+ {% elif p.recurring: %} + + + + + + +
+ {% for wd in range(1, 8): %} + + {% endfor%} +
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + + + + +
+ {% for wd in range(1, 8): %} + + {% endfor%} +
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + + + + + {% else %} + + +
+ +
+ +
+ {% for wd in range(1, 8): %} + + {% endfor%} +
+ + +
+ +
+ +
+ {% for wd in range(1, 8): %} + + {% endfor%} +
+ {% endif %} +
+
+ +
+ + {% if is_new==False: %} + + + {% endif %} +
+ +
+
+
+
+
+ diff --git a/simple-scheduler/rootfs/simplescheduler/templates/index.html b/simple-scheduler/rootfs/simplescheduler/templates/index.html new file mode 100644 index 0000000..0f6a85f --- /dev/null +++ b/simple-scheduler/rootfs/simplescheduler/templates/index.html @@ -0,0 +1,406 @@ + + + + +Simple Scheduler for HA + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + + + + + + + + {% for s in data %} + + + {% if s.weekly %} + + {% elif s.recurring %} + + {% else %} + + {% endif %} + + + {% if s.weekly %} + + {% elif s.recurring %} + + {% else %} + + {% endif %} + + + {% endfor %} + + +
+ SimpleScheduler + + + +
+ +   + + +

{{ s.name }}

+
+ {% if s.entity_id %} + {% for e in s.entity_id %} + {{ friendlynames[e] }} + {% endfor %} + {% endif %} +
+
+
+
+
+ {% for wd in range(1, 8): %} +
+ {{ weekday[wd] }} +
+ {% endfor%} +
+
+
{{ o.translations.text_ON }}
+ {% for wd in range(1, 8): %} +
+ {{ format_event(s.weekly['on_'+wd|string], True)|safe }} +
+ {% endfor%} +
+
+
{{ o.translations.text_OFF }}
+ {% for wd in range(1, 8): %} +
+ {{ format_event(s.weekly['off_'+wd|string], False)|safe }} +
+ {% endfor%} +
+
+
+
+
+
+ {% if s.on_tod %} +
+ {{ s.recurring.on_start }} {{ s.recurring.on_end }} + {{ s.recurring.on_interval }}m +
+ +
{{ get_friendly_html_dow(s.on_dow,True)|safe }}
+ {% endif %} +
+
+ {% if s.off_tod %} +
+ {{ s.recurring.off_start }} {{ s.recurring.off_end }} + {{ s.recurring.off_interval }}m +
+ +
{{ get_friendly_html_dow(s.off_dow,False)|safe }}
+ {% endif %} +
+
+
+
+
+
+
+ {% if s.on_tod %} +
{{ format_event(s.on_tod, True)|safe }}
+
{{ get_friendly_html_dow(s.on_dow,True)|safe }}
+ {% endif %} +
+
+ {% if s.off_tod %} +
{{ format_event(s.off_tod, False)|safe }}
+
{{ get_friendly_html_dow(s.off_dow,False)|safe }}
+ {% endif %} +
+
+
+
+
+ +
+ +
+ +
+ +
+
+

+ {{ statusbarinfo.sunrise }} + {{ statusbarinfo.sunset }} + {{ statusbarinfo.timezone }} + {{ statusbarinfo.scheduler }} + MQTT: {{ statusbarinfo.mqtt }} + +

+
+
+
+ +
+
+

+		
+	
+
+
+ + + + + + diff --git a/simple-scheduler/rootfs/simplescheduler/templates/light.css b/simple-scheduler/rootfs/simplescheduler/templates/light.css new file mode 100644 index 0000000..f82b1fe --- /dev/null +++ b/simple-scheduler/rootfs/simplescheduler/templates/light.css @@ -0,0 +1,418 @@ + :root { + --maincolor: #007bff; + } + + H5 {margin-bottom: 0 ; line-height: 14px; } + + .main-color { color: var(--maincolor)!important; } + + div.content { margin-bottom: 2em; } + + + .table td, .table th { + vertical-align: top; + border-bottom: 1px solid var(--maincolor); + border-top: none; + + } + + THEAD { + line-height: 3em; + } + + #sidebar { + display:none; + min-width: 250px; + max-width: 30%; + height: 100%; + position: fixed; + top: 0; + right: 0; + padding: 1em; + z-index: 9999; + background-color: rgba(255,255,255,0.98); + box-shadow: 5px 5px 18px 0px #000; + overflow-y: auto; + } + + .edit-form > div { + margin: 1em 0; + } + + .form-row span.mdi { font-size: 14px; } + + .btn-default { color: white;} + + .dowIcon { + border: 0px solid ; + border-radius: 20px; + background: grey; + color: white; + font-size: 0.8rem; + width: 1.8rem; + height: 1.8rem; + line-height: 1.8rem; + text-align: center; + margin-right: 0.1em; + display: inline-block; + text-shadow: 1px 1px 1px #333; + box-shadow: inset -3px -4px 6px #00000077; + } + + .dowHiglightR { background: red ; } + .dowHiglightG { background: green ; } + + .icon-space {width: 32px;} + + .text-green {color:green;} + .text-red {color:red;} + .text-white {color:white;} + + .bg-primary { + color:white; + background-color: #03a9f4!important; + } + + .titlebar_span { + font-size: 1.25em; + margin-right: 1em; + text-shadow: 1px 1px 3px #000; + } + + .titlebar_span button { + box-shadow: 2px 2px 2px 0px #00000077; + font-size: 1.25em; + line-height: 1em; + } + + div.row-title P { + font-size: 1.2em; + line-height: 1.2em; + margin-bottom: 0; + } + div.edit-section-label { + width: 100%; + border-bottom: 1px solid #777; + margin-top: 1em; + } + div.edit-section-label label{ + line-height: 1em; + font-weight: bold; + } + + .btn-circle.btn-xl { + width: 70px; + height: 70px; + padding: 10px 16px; + border-radius: 35px; + font-size: 24px; + line-height: 1.33; + opacity: 0.9; + } + + .btn-circle { + width: 30px; + height: 30px; + padding: 6px 0px; + border-radius: 15px; + text-align: center; + font-size: 12px; + line-height: 1.42857; + background: navy; + color: white; + box-shadow: 2px 2px 10px 0px #777; + } + + .floating-bottom-right { + position: fixed; + bottom: 5%; + right: 5%; + } + + + + td.name_col{ + width: 25%; + max-width: 400px; + } + + .event-list > span { + font-size: 1rem; + margin-right: 1rem; + line-height: 1.6 rem; + float:left; + } + + span.event-type-b { + font-size: 1rem; + color: #d39e00; + margin-left: 0.2rem; + } + + span.event-type-t { + font-size: 1rem; + color: #8b442b; + margin-left: 0.1rem; + } + + span.event-type-to { + font-size: 1rem; + color: #9c27b0; + margin-left: 0.1rem; + } + + span.event-type-p { + font-size: 1rem; + color: #2196f3; + margin-left: 0.1rem; + } + + footer { + position: fixed; + bottom: 0; + right: 0; + margin:0; + padding: 0; + width: 100%; + height: 2em; + line-height: 2em; + font-size: 1em; + background-color: grey; + color: black + } + + footer .statusbar { + margin-left: 1em; + } + + .statusbar_span {margin-right: 2em; } + .statusbar_span .mdi {font-size:1.2em; } + + #showlog {cursor:pointer;} + + #log_wrapper { + z-index: 9999; + display: none; + position: fixed; + top: 10%; + left: 10%; + width: 80%; + height: 80%; + background-color: white; + padding: 0; + margin: 0; + border: 1px solid #ccc; + overflow: hidden; + box-shadow: 5px 5px 15px 0px #777; + } + + #log_wrapper > div { + position: relative; + width: 98%; + height: 96%; + margin: 1%; + padding: 0; + overflow: hidden; + } + + #logcontent { + font-size: 1em; + overflow: scroll; + width: 100%; + height: 100%; + margin: 0; + padding: 0; + } + + #closelog { + position: absolute; + top: 1em; + right: 3em; + } + + #block_background { + position: fixed; + top: 0; + bottom: 0; + height: 0; + width: 0; + background-color: #77777700; + z-index: 9998; + transition: background-color 0.25s; + } + + .week_table { + display: none; + width: 100%; + margin: 0px 0px 1em; + } + + .week_table_row { + display: table-row; + } + + .week_table_header .week_table_cell { + border-bottom: 1px solid #777 !important; + } + + .week_table_cell { + display: table-cell; + padding: 3px 10px; + border: none; + text-align: left; + border-bottom: 1px solid #ddd; + } + + .week_table_cell > span { + display: block; + } + + .d_mode .week_table_cell { + border-bottom: none; + width: 50%; + } + + .week_table.d_mode { + margin: 0px 0px; + } + + .img-add-new { + display: block; + width: 90%; + margin: 1em auto; + height: auto; + min-height: 3em; + box-shadow: 2px 2px 5px -2px #777; + cursor: pointer; + line-height: 3em; + padding: 0em 1em; + } + + .img-add-new > SPAN { + vertical-align: middle; + } + + .badge{ + color: white; + text-shadow: 1px 1px 1px #333; + } + + .hidden_cell {display: none; } + + .drag_icon {cursor: move;} + + .fit { + white-space: nowrap; + width: 1%; + } + + p.scheduler_id { + position: absolute; + top: 1.5em; + right: 2em; + margin: 0; + padding: 0; + opacity: .5; + } + .col-sm-3 {margin-right: 0.5em; } + .col-sm-3:last-child {margin-right: 0; } + + .form-row { + display: flex; + flex-wrap: nowrap; + } + + #recurring_preview_on, + #recurring_preview_off { + opacity: 0.75; + } + + + #edit_buttons > button:first-child { + margin-right: 1em; + } + + .float-left { float:left} + .float-right { float:right} + + tr.config_section { + background: #777; + font-weight: bold; + color: white; + } + + tr.config_section td { + border: none; + } + + tr.config_item td { + border: none; + } + + #config-form .form-control { + padding: 0.1rem 0.75rem; + } + + tr.config_item td.config_input, + tr.config_item td.config_label { + width: 10%; + min-width: 150px; + padding: 0.25em 1em; + vertical-align: middle; + } + + @media screen and (min-width: 1281px) { + html { font-size: 10pt; } + + } + + @media screen and (max-width: 1280px) { + html { font-size: 9pt; } + .form-row span.mdi { font-size: 10px; } + #sidebar { max-width: 50%; } + } + + @media screen and (max-width: 800px) { + + html { font-size: 8pt; } + + #dtable TD { + display: block; + text-align: center; + border: none !important; + } + + #dtable TD:nth-child(2) { } + + #dtable TR { + border-bottom: 1px solid var(--maincolor); + } + + #config-form .input-sm {text-align:center;} + + td.name_col {width: 100%; max-width: none;} + + .event-list > span { float: none; display: inline-block; } + + #sidebar { max-width: 90%; } + + tr.config_item td.config_input, + tr.config_item td.config_label { + width: 100%; + } + + .fit { + white-space: normal; + width: auto; + } + .week_table { margin-bottom: 1em; } + + .d_mode .week_table_cell { display: block; text-align: center; width: 100%; } + + .week_table.d_mode {margin-bottom: 0em; } + + .event-list { + width: 80%; + margin: auto; + } + } diff --git a/simple-scheduler/rootfs/simplescheduler/templates/new.html b/simple-scheduler/rootfs/simplescheduler/templates/new.html new file mode 100644 index 0000000..14a1a39 --- /dev/null +++ b/simple-scheduler/rootfs/simplescheduler/templates/new.html @@ -0,0 +1,4 @@ + +
Daily
+
Weekly
+
Recurring
\ No newline at end of file