thanks! I appreciate it! I dont see that I can attach files so here is copy and paste.
/config/appdaemon/
-appdeamon.yaml
/config/appdaemon/dashboards/
-Status.dash
/config/appdaemon/custom_widgets/
-matt.yaml
/config/appdaemon/custom_widgets/basematt/
-basematt.js
-basematt.css
-basematt.html
logs:
-dash_log.log (appdaemon)
-dash_errors.log (empty)
-dash_access.log
# /config/appdeamon/appdaemon.yaml
secrets: /config/secrets.yaml
log:
logfile: /config/appdaemon/logs/dash_log.log
accessfile: /config/appdaemon/logs/dash_access.log
errorfile: /config/appdaemon/logs/dash_errors.log
appdaemon:
threads: 10
disable_apps: 0
app_dir: /config/appdaemon/apps
plugins:
HASS:
type: hass
ha_url: http://hassio/homeassistant
token: redacted
hadashboard:
dash_url: http://127.0.0.1:5050
dash_dir: /config/appdaemon/dashboards
dash_force_compile: 1
accessfile: /var/log/dash_access.log
dash_compile_on_start: 1
dash_force_compile: 1
# /config/appdaemon/dashboards/Status.dash
##
## Main arguments, all optional
##
title: Hello
widget_dimensions: [120, 120]
widget_margins: [5, 5]
columns: 8
mattgit:
widget_type: matt
entity: alarm_control_panel.home_alarm
# Layout
#
layout:
- mattgit(2x2)
## /config/appdaemon/custom_widgets/matt.yaml
widget_type: basematt
entity: "{{entity}}"
initial_string: "Enter Code"
post_service_ah:
service: alarm_control_panel/alarm_arm_home
entity_id: "{{entity}}"
post_service_aa:
service: alarm_control_panel/alarm_arm_away
entity_id: "{{entity}}"
post_service_da:
service: alarm_control_panel/alarm_disarm
entity_id: "{{entity}}"
post_service_tr:
service: alarm_control_panel/alarm_trigger
entity_id: "{{entity}}"
state_map:
pending: Pending
armed_home: Armed Home
armed_away: Armed Away
disarmed: Disarmed
triggered: Triggered
fields:
title: "{{title}}"
title2: "{{title2}}"
state: ""
code: ""
static_css:
title_style: $alarm_title_style
title2_style: $alarm_title2_style
state_style: $alarm_state_style
widget_style: $alarm_widget_style
panel_state_style: $alarm_panel_state_style
panel_code_style: $alarm_panel_code_style
panel_background_style: $alarm_panel_background_style
panel_button_style: $alarm_panel_button_style
css: []
icons: []
static_icons: []
# /config/appdaemon/custom_widgets/basematt/basematt.js
function basematt(widget_id, url, skin, parameters)
{
// Will be using "self" throughout for the various flavors of "this"
// so for consistency ...
self = this
// Initialization
self.widget_id = widget_id
// Parameters may come in useful later on
self.parameters = parameters
self.OnButtonClick = OnButtonClick
self.OnCloseClick = OnCloseClick
self.OnDigitClick = OnDigitClick
self.OnArmHomeClick = OnArmHomeClick
self.OnArmAwayClick = OnArmAwayClick
self.OnDisarmClick = OnDisarmClick
self.OnTriggerClick = OnTriggerClick
var callbacks =
[
{"selector": '#' + widget_id + ' > span', "action": "click", "callback": self.OnButtonClick},
{"selector": '#' + widget_id + ' #close', "action": "click", "callback": self.OnCloseClick},
{"selector": '#' + widget_id + ' #0', "action": "click", "callback": self.OnDigitClick, "parameters": {"digit" : "0"}},
{"selector": '#' + widget_id + ' #1', "action": "click", "callback": self.OnDigitClick, "parameters": {"digit" : "1"}},
{"selector": '#' + widget_id + ' #2', "action": "click", "callback": self.OnDigitClick, "parameters": {"digit" : "2"}},
{"selector": '#' + widget_id + ' #3', "action": "click", "callback": self.OnDigitClick, "parameters": {"digit" : "3"}},
{"selector": '#' + widget_id + ' #4', "action": "click", "callback": self.OnDigitClick, "parameters": {"digit" : "4"}},
{"selector": '#' + widget_id + ' #5', "action": "click", "callback": self.OnDigitClick, "parameters": {"digit" : "5"}},
{"selector": '#' + widget_id + ' #6', "action": "click", "callback": self.OnDigitClick, "parameters": {"digit" : "6"}},
{"selector": '#' + widget_id + ' #7', "action": "click", "callback": self.OnDigitClick, "parameters": {"digit" : "7"}},
{"selector": '#' + widget_id + ' #8', "action": "click", "callback": self.OnDigitClick, "parameters": {"digit" : "8"}},
{"selector": '#' + widget_id + ' #9', "action": "click", "callback": self.OnDigitClick, "parameters": {"digit" : "9"}},
{"selector": '#' + widget_id + ' #BS', "action": "click", "callback": self.OnDigitClick, "parameters": {"digit" : "BS"}},
{"selector": '#' + widget_id + ' #AH', "action": "click", "callback": self.OnArmHomeClick},
{"selector": '#' + widget_id + ' #AA', "action": "click", "callback": self.OnArmAwayClick},
{"selector": '#' + widget_id + ' #DA', "action": "click", "callback": self.OnDisarmClick},
{"selector": '#' + widget_id + ' #TR', "action": "click", "callback": self.OnTriggerClick},
]
// Define callbacks for entities - this model allows a widget to monitor multiple entities if needed
// Initial will be called when the dashboard loads and state has been gathered for the entity
// Update will be called every time an update occurs for that entity
self.OnStateAvailable = OnStateAvailable
self.OnStateUpdate = OnStateUpdate
if ("entity" in parameters)
{
var monitored_entities =
[
{"entity": parameters.entity, "initial": self.OnStateAvailable, "update": self.OnStateUpdate}
]
}
else
{
var monitored_entities = []
}
// Finally, call the parent constructor to get things moving
WidgetBase.call(self, widget_id, url, skin, parameters, monitored_entities, callbacks)
self.set_view = set_view
// Function Definitions
// The StateAvailable function will be called when
// self.state[<entity>] has valid information for the requested entity
// state is the initial state
// Methods
function OnStateAvailable(self, state)
{
self.set_field(self, "state", self.map_state(self, state.state))
}
function OnStateUpdate(self, state)
{
self.set_field(self, "state", self.map_state(self, state.state))
}
function OnButtonClick(self)
{
self.code = self.parameters.initial_string
self.set_view(self)
$('#' + widget_id + ' > #Dialog').removeClass("modalDialogClose")
$('#' + widget_id + ' > #Dialog').addClass("modalDialogOpen")
}
function OnCloseClick(self)
{
$('#' + widget_id + ' > #Dialog').removeClass("modalDialogOpen")
$('#' + widget_id + ' > #Dialog').addClass("modalDialogClose")
}
function OnDigitClick(self, parameters)
{
if (parameters.digit == "BS")
{
if (self.code != self.parameters.initial_string)
{
if (self.code.length == 1)
{
self.code = self.parameters.initial_string
}
else
{
self.code = self.code.substring(0, self.code.length - 1);
}
}
}
else
{
if (self.code == self.parameters.initial_string)
{
self.code = parameters.digit
}
else
{
self.code = self.code + parameters.digit
}
}
self.set_view(self)
}
function OnArmHomeClick(self)
{
args = self.parameters.post_service_ah
args["code"] = self.code
self.call_service(self, args)
self.code = self.parameters.initial_string
self.set_view(self)
}
function OnArmAwayClick(self)
{
args = self.parameters.post_service_aa
args["code"] = self.code
self.call_service(self, args)
self.code = self.parameters.initial_string
self.set_view(self)
}
function OnDisarmClick(self)
{
args = self.parameters.post_service_da
args["code"] = self.code
self.call_service(self, args)
self.code = self.parameters.initial_string
self.set_view(self)
}
function OnTriggerClick(self)
{
args = self.parameters.post_service_tr
args["code"] = self.code
self.call_service(self, args)
self.code = self.parameters.initial_string
self.set_view(self)
}
function set_view(self)
{
self.set_field(self, "code", self.code)
}
}
# /config/appdaemon/custom_widgets/basematt/basematt.css
/*noinspection ALL*/
.widget-basematt-{{id}} .state {
display: inline-block;
vertical-align: middle;
}
/*noinspection ALL*/
.widget-basematt-{{id}} .title {
position: absolute;
top: 5px;
width: 100%;
}
/*noinspection ALL*/
.widget-basematt-{{id}} .title2 {
position: absolute;
top: 23px;
width: 100%;
}
/*noinspection ALL*/
.widget-basematt-{{id}} .code {
width: 100%;
}
/*noinspection ALL*/
.widget-basematt-{{id}} .toggle-area {
z-index: 10;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
/*noinspection ALL*/
.widget-basematt-{{id}} .container {
width: 275px;
display: inline-block;
}
/*noinspection ALL*/
.widget-basematt-{{id}} .panel-state {
font-size: 100%;
}
/*noinspection ALL*/
.widget-basematt-{{id}} .block {
display: inline-block;
width: 75px;
height: 75px;
margin: 5px;
float: top;
font-size: 175%;
text-align: center;
vertical-align: middle;
line-height: 75px;
}
/*noinspection ALL*/
.widget-basematt-{{id}} .block2 {
width: 165px;
}
/*noinspection ALL*/
.widget-basematt-{{id}} .block3 {
width: 255px;
}
# /config/appdaemon/custom_widgets/basematt/basematt.html (no changes)
<span class="toggle-area" id="switch"></span>
<h1 class="title" data-bind="text: title, attr:{ style: title_style}"></h1>
<h1 class="title2" data-bind="text: title2, attr:{ style: title2_style}"></h1>
<h2 class="value" data-bind="text: state, attr:{ style: state_style}"></h2>
<div id="Dialog" class="modalDialog">
<div data-bind="attr:{style: panel_background_style}">
<h2 id="close" class="modalDialogCloseButton">X</h2>
<h2 class="panel-state" data-bind="text: state, attr:{style: panel_state_style}"></h2>
<h2 class="panel-state" data-bind="text: code, attr:{style: panel_code_style}"></h2>
<div class="container">
<span data-bind="attr:{style: panel_button_style}" class="block" id="1">1</span class="block">
<span data-bind="attr:{style: panel_button_style}" class="block" id="2">2</span class="block">
<span data-bind="attr:{style: panel_button_style}" class="block" id="3">3</span class="block">
<span data-bind="attr:{style: panel_button_style}" class="block" id="4">4</span class="block">
<span data-bind="attr:{style: panel_button_style}" class="block" id="5">5</span class="block">
<span data-bind="attr:{style: panel_button_style}" class="block" id="6">6</span class="block">
<span data-bind="attr:{style: panel_button_style}" class="block" id="7">7</span class="block">
<span data-bind="attr:{style: panel_button_style}" class="block" id="8">8</span class="block">
<span data-bind="attr:{style: panel_button_style}" class="block" id="9">9</span class="block">
<span data-bind="attr:{style: panel_button_style}" class="block block2" id="0">0</span class="block">
<span data-bind="attr:{style: panel_button_style}" class="block mdi mdi-keyboard-backspace" id="BS"></span class="block">
<span data-bind="attr:{style: panel_button_style}" class="block mdi mdi-home" id="AH" ></span class="block">
<span data-bind="attr:{style: panel_button_style}" class="block mdi mdi-home-outline" id="AA"></span class="block">
<span data-bind="attr:{style: panel_button_style}" class="block fa fa-power-off" id="DA"></span class="block">
<span data-bind="attr:{style: panel_button_style}" class="block block3" id="TR">Trigger</span class="block">
</div>
</div>
</div>
# dash_log
2019-07-30 20:33:08.917402 INFO AppDaemon Version 3.0.5 starting
2019-07-30 20:33:08.917725 INFO Configuration read from: /config/appdaemon/appdaemon.yaml
2019-07-30 20:33:08.917872 DEBUG AppDaemon Section: None
2019-07-30 20:33:08.918024 DEBUG HADashboard Section: None
2019-07-30 20:33:08.919170 INFO AppDaemon: Starting Apps
2019-07-30 20:33:08.919998 DEBUG AppDaemon: Creating worker threads ...
2019-07-30 20:33:08.922209 DEBUG AppDaemon: Done
2019-07-30 20:33:08.922364 DEBUG AppDaemon: Entering run()
2019-07-30 20:33:08.923119 INFO AppDaemon: Loading Plugin HASS using class HassPlugin from module hassplugin
2019-07-30 20:33:09.043620 INFO AppDaemon: HASS: HASS Plugin Initializing
2019-07-30 20:33:09.044004 INFO AppDaemon: HASS: HASS Plugin initialization complete
2019-07-30 20:33:09.044205 DEBUG AppDaemon: Starting utility loop
2019-07-30 20:33:09.044389 INFO Starting Dashboards
2019-07-30 20:33:09.050129 INFO API is disabled
2019-07-30 20:33:09.050309 DEBUG Start Loop
2019-07-30 20:33:09.055551 INFO AppDaemon: HASS: Connected to Home Assistant 0.96.5
2019-07-30 20:33:09.061040 DEBUG AppDaemon: HASS: get_ha_config()
2019-07-30 20:33:09.061219 DEBUG AppDaemon: HASS: get_ha_config: url is http://hassio/homeassistant/api/config
2019-07-30 20:33:09.075539 DEBUG AppDaemon: HASS: get_ha_state: url is http://hassio/homeassistant/api/states
2019-07-30 20:33:09.081290 DEBUG AppDaemon: HASS: Got state
2019-07-30 20:33:09.081880 INFO AppDaemon: Got initial state from namespace default
2019-07-30 20:33:11.074186 DEBUG AppDaemon: Starting timer loop
2019-07-30 20:33:11.074430 DEBUG AppDaemon: Reading Apps
2019-07-30 20:33:11.075230 INFO AppDaemon: Reading config
2019-07-30 20:33:11.075481 DEBUG AppDaemon: Reading /config/appdaemon/apps/apps.yaml
2019-07-30 20:33:11.076762 INFO AppDaemon: /config/appdaemon/apps/apps.yaml added or modified
2019-07-30 20:33:11.076936 INFO AppDaemon: /config/appdaemon/apps/apps.yaml added or modified
2019-07-30 20:33:11.077092 INFO AppDaemon: App 'hello_world' added
2019-07-30 20:33:11.077301 INFO AppDaemon: Adding /config/appdaemon/apps to module import path
2019-07-30 20:33:11.077553 DEBUG AppDaemon: Found module /config/appdaemon/apps/hello.py
2019-07-30 20:33:11.077737 INFO AppDaemon: Loading App Module: /config/appdaemon/apps/hello.py
2019-07-30 20:33:11.083929 INFO AppDaemon: Initializing app hello_world using class HelloWorld from module hello
2019-07-30 20:33:11.160751 INFO hello_world: Hello from AppDaemon
2019-07-30 20:33:11.161777 INFO hello_world: You are now ready to run Apps!
2019-07-30 20:33:11.162308 INFO AppDaemon: App initialization complete
2019-07-30 20:33:11.163420 DEBUG AppDaemon: Util loop compute time: 0.0ms
2019-07-30 20:33:12.001348 DEBUG AppDaemon: Scheduler loop compute time: 0.0ms
# dash_access.log
2019-07-30 20:33:11.359312 INFO Compiling dashboard 'Status'
2019-07-30 20:33:11.462322 WARNING ------------------------------------------------------------
2019-07-30 20:33:11.462518 WARNING Unexpected error during DASH creation
2019-07-30 20:33:11.462652 WARNING ------------------------------------------------------------
2019-07-30 20:33:11.464552 WARNING Traceback (most recent call last):
File "/usr/lib/python3.7/site-packages/appdaemon/dashboard.py", line 318, in _load_widget
final_widget = yaml.load(yaml_file, Loader=yaml.SafeLoader)
File "/usr/lib/python3.7/site-packages/yaml/__init__.py", line 114, in load
return loader.get_single_data()
File "/usr/lib/python3.7/site-packages/yaml/constructor.py", line 41, in get_single_data
node = self.get_single_node()
File "/usr/lib/python3.7/site-packages/yaml/composer.py", line 36, in get_single_node
document = self.compose_document()
File "/usr/lib/python3.7/site-packages/yaml/composer.py", line 55, in compose_document
node = self.compose_node(None, None)
File "/usr/lib/python3.7/site-packages/yaml/composer.py", line 84, in compose_node
node = self.compose_mapping_node(anchor)
File "/usr/lib/python3.7/site-packages/yaml/composer.py", line 133, in compose_mapping_node
item_value = self.compose_node(node, item_key)
File "/usr/lib/python3.7/site-packages/yaml/composer.py", line 84, in compose_node
node = self.compose_mapping_node(anchor)
File "/usr/lib/python3.7/site-packages/yaml/composer.py", line 127, in compose_mapping_node
while not self.check_event(MappingEndEvent):
File "/usr/lib/python3.7/site-packages/yaml/parser.py", line 98, in check_event
self.current_event = self.state()
File "/usr/lib/python3.7/site-packages/yaml/parser.py", line 439, in parse_block_mapping_key
"expected <block end>, but found %r" % token.id, token.start_mark)
yaml.parser.ParserError: while parsing a block mapping
in "<unicode string>", line 23, column 3:
title: """"
^
expected <block end>, but found '<scalar>'
in "<unicode string>", line 23, column 12:
title: """"
^
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3.7/site-packages/appdaemon/dashboard.py", line 818, in get_dashboard
dash = self._conditional_compile(name, skin, recompile)
File "/usr/lib/python3.7/site-packages/appdaemon/dashboard.py", line 770, in _conditional_compile
dash = self._get_dash(name, skin, skindir)
File "/usr/lib/python3.7/site-packages/appdaemon/dashboard.py", line 573, in _get_dash
dash = self._create_dash(name, css_vars)
File "/usr/lib/python3.7/site-packages/appdaemon/dashboard.py", line 455, in _create_dash
dash, layout, occupied, includes = self._create_sub_dash(name, "dash", 0, {}, [], 1, css_vars, None)
File "/usr/lib/python3.7/site-packages/appdaemon/dashboard.py", line 545, in _create_sub_dash
self._add_layout(lay, layout, occupied, dash, page, includes, css_vars, global_parameters)
File "/usr/lib/python3.7/site-packages/appdaemon/dashboard.py", line 429, in _add_layout
widget["parameters"] = self._load_widget(dash, includes, name, css_vars, global_parameters)
File "/usr/lib/python3.7/site-packages/appdaemon/dashboard.py", line 320, in _load_widget
_log_error(dash, name, "Error in widget definition '{}':".format(widget_type))
NameError: name '_log_error' is not defined
2019-07-30 20:33:11.464696 WARNING ------------------------------------------------------------
2019-07-30 20:33:11.464891 INFO function [get_dashboard] finished in 105 ms
.
500 Internal Server Error
Server got itself in trouble
Failed to load resource: the server responded with a status of 500 (Internal Server Error)