Add a trigger log every time the a callback is triggered

This commit is contained in:
2022-12-15 17:05:19 +01:00
parent 451160face
commit e41850ddee
11 changed files with 196 additions and 83 deletions
+2 -1
View File
@@ -1,3 +1,4 @@
import app.models.settings
import app.models.callback
import app.models.schedule
import app.models.schedule
import app.models.trigger
-1
View File
@@ -17,7 +17,6 @@ class Callback(db.Model):
data = db.Column(db.Text )
note = db.Column(db.Text )
active = db.Column(db.Boolean )
schedules = db.relationship("Schedule")
def __init__(self, name:str, domain:str, service:str, entity:str) -> None:
self.name = name
+3 -1
View File
@@ -12,13 +12,15 @@ class Schedule(db.Model):
__tablename__ = "schedules"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
callback_id = db.Column(db.Integer, db.ForeignKey('callbacks.uuid') )
callback_id = db.Column(db.String(32), db.ForeignKey('callbacks.uuid') )
name = db.Column(db.String(64) )
start_day = db.Column(db.Integer )
start_time = db.Column(db.Time )
end_day = db.Column(db.Integer )
end_time = db.Column(db.Time )
callback = db.relationship("Callback")
def __init__(self, name:str, callback_id:str, startday, starttime, endday, endtime) -> None:
self.name = name
self.callback_id = callback_id
+48
View File
@@ -0,0 +1,48 @@
from app import db
class Trigger(db.Model):
# Table structure
__tablename__ = "triggers"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
callback_id = db.Column(db.String(32), db.ForeignKey('callbacks.uuid') )
schedule_id = db.Column(db.Integer, db.ForeignKey('schedules.id') )
trigger_time= db.Column(db.DateTime )
success = db.Column(db.Boolean )
callback = db.relationship("Callback")
schedule = db.relationship("Schedule")
def __init__(self, callback_id:str, schedule_id:int, trigger_time, success:bool) -> None:
self.callback_id = callback_id
self.schedule_id = schedule_id
self.trigger_time = trigger_time
self.success = success
def __repr__(self) -> str:
return str(self.callback_id) + " triggered at " + str(self.trigger_time)
@classmethod
def get_trigger(cls, id:int) -> any:
result = cls.query.filter_by(id=id).first()
if result is not None:
return result
raise KeyError("ID {} does not exist".format(id))
@classmethod
def get_triggers(cls, uuid:str) -> any:
result = cls.query.filter_by(callback_id=uuid)
if result is not None:
return result
raise KeyError("UUID {} does not exist".format(uuid))
def delete(self):
db.session.delete(self)
db.session.commit( );
def save(self):
db.session.add (self)
db.session.commit( )
+1
View File
@@ -7,6 +7,7 @@
<button onclick="navigator.clipboard.writeText(window.location.origin + '{{ url_for('hook', uuid=callback.uuid) }}');">Copy URL</button>
<button onclick="window.location.href='{{ url_for('schedule', uuid=callback.uuid) }}';">Manage schedule</button>
<button onclick="window.location.href='{{ url_for('triggers', uuid=callback.uuid) }}';">See triggers</button>
<form action="{{url_for('save_callback', uuid=callback.uuid) }}" method="POST" id="callback-form">
<h3>Details</h3>
+33
View File
@@ -0,0 +1,33 @@
{% extends "base/layout.html" %}
{% block main %}
{{ super() }}
<div>
<h1>Triggers for <u>{{callback.name}}</u></h1>
<button onclick="window.location.href='{{ url_for('callback', uuid=callback.uuid) }}';">Back</button>
<p>
{% if triggers.count() > 0 %}
<table>
<tr>
<th>Trigger time</th>
<th>Schedule</th>
<th>Success</th>
</tr>
{% for trigger in triggers %}
<tr>
<td>{{trigger.trigger_time.strftime('%A %d %B at %H:%M:%S')}}</td>
<td>{% if trigger.schedule_id != -1 %}{{trigger.schedule.name}}{% endif %}</td>
<td>{{trigger.success}}</td>
</tr>
{% endfor %}
</table>
{% else %}
This callback has not been triggered yet.
{% endif %}
</p>
</div>
{% endblock %}
+2
View File
@@ -1,5 +1,7 @@
import app.views.index
import app.views.callbacks
import app.views.schedules
import app.views.triggers
import app.views.hook
import app.views.settings
import app.views.dynamic
-75
View File
@@ -1,12 +1,8 @@
from html import entities
from flask import redirect, render_template, request, url_for, flash
from datetime import time
from app import webapp
from app.homeassistant import HomeAssistant
from app.models.callback import Callback
from app.models.schedule import Schedule
from app.models.settings import Setting
from app.views.auth import login_required
@@ -47,14 +43,6 @@ def callback(uuid:str):
return render_template("callback.html",callback=callback, domains=domains, services=services, entities=entities)
@webapp.route('/callback/schedule/<uuid>')
@login_required
def schedule(uuid:str):
callback = Callback.get_callback(uuid)
schedules = Schedule.get_schedules(uuid)
return render_template("schedule.html",callback=callback, schedules=schedules)
@webapp.route('/save-callback/<uuid>', methods=['POST'])
@login_required
@@ -113,66 +101,3 @@ def save_callback(uuid:str):
flash("Changes saved successfully", "success")
return redirect(url_for('callback', uuid=callback.uuid))
@webapp.route('/create_schedule/<uuid>', methods=['POST'])
@login_required
def create_schedule(uuid:str):
callback = None
try:
callback = Callback.get_callback(uuid=uuid)
except Exception as e:
flash("Something went wrong.", "error")
return redirect(url_for('callbacks'))
if not request.form['name']:
flash("Name required", "error")
return redirect(url_for('schedule', uuid=callback.uuid))
name = request.form['name']
startday = request.form['startday']
starttime_str = request.form['starttime']
endday = request.form['endday']
endtime_str = request.form['endtime']
starttime_split = starttime_str.split(":")
starttime = time(int(starttime_split[0]), int(starttime_split[1]), 0, 0)
endtime_split = endtime_str.split(":")
endtime = time(int(endtime_split[0]), int(endtime_split[1]), 0, 0)
if(startday > endday):
flash("Start day has to be the same or earlier than end day", "error")
return redirect(url_for('schedule', uuid=callback.uuid))
if(startday == endday):
if(starttime >= endtime):
flash("Start time needs to be earlier than end time", "error")
return redirect(url_for('schedule', uuid=callback.uuid))
schedule = Schedule(name, uuid, startday, starttime, endday, endtime)
schedule.save()
flash("Schedule created", "success")
return redirect(url_for('schedule', uuid=callback.uuid))
@webapp.route('/delete_schedule/<id>')
@login_required
def delete_schedule(id:int):
schedule = None
try:
schedule = Schedule.get_schedule(id=id)
except Exception as e:
flash("Something went wrong.", "error")
return redirect(url_for('callbacks'))
uuid = schedule.callback_id
schedule.delete()
flash("Schedule deleted", "success")
return redirect(url_for('schedule', uuid=uuid))
+12 -5
View File
@@ -7,6 +7,7 @@ from app import webapp
from app.models.callback import Callback
from app.models.settings import Setting
from app.models.schedule import Schedule
from app.models.trigger import Trigger
from app.homeassistant import HomeAssistant
@webapp.route('/hook/<uuid>')
@@ -24,15 +25,16 @@ def hook(uuid:str):
feedback = Setting.get_value(Setting.Keys.FEEDBACK);
schedules = Schedule.get_schedules(uuid=callback.uuid);
now = datetime.now()
cweekday = datetime.now().weekday()
ctime = datetime.now().time()
anymatch = False;
trigger_schedule = -1
if(schedules.count() != 0):
for schedule in schedules:
anymatch = False;
print(schedule)
for schedule in schedules:
possiblematch = True
@@ -48,11 +50,13 @@ def hook(uuid:str):
possiblematch = False
if(possiblematch):
trigger_schedule = schedule.id
anymatch = True
print(anymatch)
if not anymatch:
trigger = Trigger(uuid, trigger_schedule, now, False)
trigger.save()
if(feedback == "none"):
return render_template("error/404.html"), 404
if(feedback == "some"):
@@ -60,6 +64,9 @@ def hook(uuid:str):
if(feedback == "all"):
return render_template("hook.html", name=callback.name, note="This action is not scheduled to be active at this time.")
trigger = Trigger(uuid, trigger_schedule, now, True)
trigger.save()
try:
HomeAssistant.getInstance().trigger_service(callback.domain, callback.service, callback.entity, callback.data)
except HomeassistantAPIError as e:
+79
View File
@@ -0,0 +1,79 @@
from flask import redirect, render_template, request, url_for, flash
from datetime import time
from app import webapp
from app.models.callback import Callback
from app.models.schedule import Schedule
from app.views.auth import login_required
@webapp.route('/callback/schedule/<uuid>')
@login_required
def schedule(uuid:str):
callback = Callback.get_callback(uuid)
schedules = Schedule.get_schedules(uuid)
return render_template("schedule.html",callback=callback, schedules=schedules)
@webapp.route('/create_schedule/<uuid>', methods=['POST'])
@login_required
def create_schedule(uuid:str):
callback = None
try:
callback = Callback.get_callback(uuid=uuid)
except Exception as e:
flash("Something went wrong.", "error")
return redirect(url_for('callbacks'))
if not request.form['name']:
flash("Name required", "error")
return redirect(url_for('schedule', uuid=callback.uuid))
name = request.form['name']
startday = request.form['startday']
starttime_str = request.form['starttime']
endday = request.form['endday']
endtime_str = request.form['endtime']
starttime_split = starttime_str.split(":")
starttime = time(int(starttime_split[0]), int(starttime_split[1]), 0, 0)
endtime_split = endtime_str.split(":")
endtime = time(int(endtime_split[0]), int(endtime_split[1]), 0, 0)
if(startday > endday):
flash("Start day has to be the same or earlier than end day", "error")
return redirect(url_for('schedule', uuid=callback.uuid))
if(startday == endday):
if(starttime >= endtime):
flash("Start time needs to be earlier than end time", "error")
return redirect(url_for('schedule', uuid=callback.uuid))
schedule = Schedule(name, uuid, startday, starttime, endday, endtime)
schedule.save()
flash("Schedule created", "success")
return redirect(url_for('schedule', uuid=callback.uuid))
@webapp.route('/delete_schedule/<id>')
@login_required
def delete_schedule(id:int):
schedule = None
try:
schedule = Schedule.get_schedule(id=id)
except Exception as e:
flash("Something went wrong.", "error")
return redirect(url_for('callbacks'))
uuid = schedule.callback_id
schedule.delete()
flash("Schedule deleted", "success")
return redirect(url_for('schedule', uuid=uuid))
+16
View File
@@ -0,0 +1,16 @@
from flask import redirect, render_template, request, url_for, flash
from datetime import time
from app import webapp
from app.models.callback import Callback
from app.models.trigger import Trigger
from app.views.auth import login_required
@webapp.route('/callback/triggers/<uuid>')
@login_required
def triggers(uuid:str):
callback = Callback.get_callback(uuid)
triggers = Trigger.get_triggers(uuid)
return render_template("trigger.html",callback=callback, triggers=triggers)