YET another take on an alarm system

I can see nothing special in System log or homeassistant.log.
That constant ā€œtime out of sync, resettingā€ error is something that might impact the overall behaviour though (as some users report). And tonight my RPi rebooted itself without a reason (I just saw Connection lost while connected to the main HA screen via web browser).
But apparently some automation IS working, otherwise your alarm panel wouldnā€™t work.
Will update later on if I have anything to add.

By the way, to switch the relay off the command should be SRFB/relay/6/set 0, not just SRFB/relay/6 0

Update: I managed to make it work. First of all, I used automation.yaml to add my automation, but it only picked up when I switched to automations.yaml.
That means automation.yaml file that is a part of your alarm is not active by default, is that correct?
It also required initial_state: on bit to be active.

WHat would you recommend as hardware companion for a 4 key alarm button?

(07/03/18) NEW Feature - Pending and Trigger time can be determined per state. For example arming the alarm in away mode can be set to 60 seconds pending time, yet arming in home mode can be set to 30 seconds.

By the way, your alarm prevents one from arming when a door is open, for example.
But if it is open during pending time before arming, it does not matter. Do you think itā€™s the right behaviour?

What devices would you recommend?

D026 open door sensors report 3 states (open, closed and tamper) and it works very well with OpenMQTT. Just be aware not to buy D025 (is larger and only sends open code).

The sensor is very small and can use spray paint to have the same color as door frame (as far as Iā€™ve tested, paint doesnā€™t affect range).

For PIR most 433 mhz devices are playing nice. They are sending only motion detected report so in HA you need an automation to reset it to clear state (otherwise HA wonā€™t be able to actually use it as trigger due to the fact same motion trigger code is received over and over).

For obvious reasons, having an open door sensor that sends just open state severely limits its usage (although it can still be used, only to get the open state as closed will need to be trigerred in HA and might not correspond to physical state of door that is being tracked).

thanks for the valuable information, will have a look and decide if I really need to know if the door is closed -so far I mostly concerned about doors being opened for obvious reasons :wink:

I currently use Espurna on my Sonoff RF bridge and everything works fine.
I understand that OpenMQTT is kind of an alternative firmware. Could you tell me is there are any pros comparing to Espurna?

I created some basic automation to clear PIRsā€™ and sensorsā€™ state here and going to add all my sensors and play with the alarm to customise it to my needs.
Yet to decide how to connect a siren, I have a pretty loud wired 12v one.

1 Like

Sorry, I canā€™t help you about that.

I only use OpenMQTT, however on a large number of devices :slight_smile: : on NodeMCU in each room with sensors (DHT22 for temperature and humidity and LDR for light), NodeMCU with IR blaster and IR receiver to control AC unit and receiver connected to TV; on ESP32 for BLE gateway and on Arduino Mega + Ethernet Shield (as 433mhz RF gateway). Having the RF gateway connected through ethernet ensures the sensors work blazing fast (even faster than Z-wave). The BLE gateway at the moment is encountering some difficulties but still looks promising.

PS: you can hide sensors from frontend with customize:

For more advanced fiddling look at enabling default_view as a view (not as a group) but it wonā€™t show you any sensor that is not first included in the views.

1 Like

Looks very interesting for home automation.
Did you have to define all your sensors separately, or there is a way to make a template and then re-use it? My sensors are all the same apart form they relay number and name, and I will have at least 10 of them, thatā€™s why Iā€™m askingā€¦
My goal currently is alarm system, therefore Iā€™m not too fussy about RF-to-main unit delays, but I definitely agree that fast wired communication is a huge plus in RF gateways.
Can you share more information about your Arduino RF gateway? Any post/link?
Will have a look at customisation that you suggested, cheers!

Yes, Iā€™m using the greatest software development tool ever, Microsoft Excel :slight_smile:
Iā€™m not an engineer or a software developer so I just write a package (either template for a sensor or an automation/script) then copy it in Excel, find the variables that need changing (sensor name; topic; payload, automation service part etc.) and use the =substitute() formula to change them all (sensor 1 to sensor 2, 3,; payload value 1 to 2, 3, etc). Here is where some creativity is needed in order to have the same no. of rows for each component. Then just copy/paste from Excel. For example, I mapped all the button presses from the AC remote control to scripts in HA. As there are over 150 different presses and I have 2 units it would have taken me about 4 months writing all the scripts I made in 15 min in Excel.

For the Arduino gateway I use regular components:
Uno:
https://www.aliexpress.com/item/Best-prices-high-quality-UNO-R3-MEGA328P-for-Arduino-UNO-R3-NO-USB-CABLE/32824708026.html
Shield:
https://www.aliexpress.com/item/W5100-Ethernet-Shield-For-for-Arduino-Main-Board-UNO-R3-ATMega-328-1280-MEGA2560/2038554597.html
433 Mhz receiver:
https://www.aliexpress.com/item/RXB6-433Mhz-Superheterodyne-Wireless-Receiver-Module-for-Arduino-ARM-AVR/32656131964.html
433 Mhz transmitter:
https://www.aliexpress.com/item/New-Mini-Wireless-RF-Module-433Mhz-Superheterodyne-Transmitter-For-Gate-Garage-Door-Arduino-Uno-Diy-Kits/32822528424.html

Just donā€™t use a 433 mhz remote to arm and disarm the alarm as it can be easily copied (try to do it manually or some secure device such as a Z-wave key chain remote).

Hey Folks,

Have noticed a bug, count down timer doesnā€™t account for state dependent pending time.
Also a bug is appearing in the web console due to some sloppy coding on my behalf.

wow, thatā€™s something :wink:

yes, it looks like at the end you get a device priced similar to mine
Did you just assemble it and flash it with OpenMQTT? How easy was it?

I resisted the temptation of using a 433MHz remote to arm/disarm alarm and currently hoping to set up a cheap tablet as a screen from where I can see and control my HA, including the alarm panel.

I just updated to your latest version.

For some strange reason, when I arm ā€˜Homeā€™ Mode, itā€™s still showing me ā€˜delayed sensorsā€™. I thought the delayed sensors were only applicable to ā€˜Awayā€™ mode?

And when in ā€˜Homeā€™ mode, these ā€œdelayedā€ sensors are still triggered immediately anyway.

I have deleted my browser cache.

Any explanation/solution please?

Its a GUI thing which I will fix, so you shouldnt notice any difference providing you are not using the granular state timing settings.

If you do not define a ā€˜pending timeā€™ for armed_home then the default behavior is any sensor in either delayed/immediate will instantly trigger the alarm. The system will also arm immediately.

If you define a ā€˜pending timeā€™ under armed_home then the alarm will provide a grace time before arming and provide a warning time before trigger based on sensors in the delayed group.

Open to suggestions. Iā€™m considering throwing zones into the mix to try and simplify things.

Yes, just assemble (no need for soldering) and flash the sketch (well a little more work to get all the libraries needed for Arduino IDE).
Have a look at the dedicated topic, thereā€™s plenty on info. I think weā€™re offtopic here.

1 Like

With traditional alarm systems, zones are used to combine sensors in different areas, so you can see when a particular ā€œzoneā€ is triggered. Because we can see individually which particular sensor was triggered, I donā€™t feel there is a huge need for zones.

Basically, I think Away, Home and Perimeter mode cover most bases. Though, it might be handy to have a separate entry for delayed sensors when setting ā€œhomeā€ mode. Otherwise, I canā€™t really see a huge benefit to using Home vs Perimeter.

1 Like

@onkytonk So bringing more granulation into the groups allowing each of the modes (home/away/perim) to define there own groups (delayed/immediate) whilst also being able to inherit top level ones when not specifically set?

If that makes any sense?

Hi Guys,
Hopfully someone will come to my aid, just followed the instructions on adding alarm to ha, checked everything a few times but getting the following error. Using firefox 58.02, any assistance appreciated, thanks.

2018-03-09 22:05:14 ERROR (MainThread) [frontend.js.latest.201802270] data:text/javascript;charset=utf-8,%0A%09function%20enableSidebar()%7B%7D%0A%09function%20disableSidebar()%7B%7D%0A%0A%09Polymer(%7B%0A%09%09is%3A%20'ha-panel-alarm'%2C%0A%09%09created()%20%7B%0A%09%09%7D%2C%0A%09%09attached()%20%7B%0A%09%09%09var%20script%20%3D%20document.createElement('script')%3B%0A%09%09%09script.setAttribute('src'%2C%20'%2Flocal%2Falarm%2Falarm_scripts.js')%3B%0A%09%09%09document.body.appendChild(script)%3B%0A%09%09%7D%2C%0A%09%09ready()%20%7B%0A%0A%09%09%09this.hideSensors%20%3D%20this.alarm.attributes.hide_sensor_groups%0A%09%09%09this.hideCustom%20%20%3D%20this.alarm.attributes.hide_custom_panel%0A%0A%09%09%09if%20(this.alarm.attributes.clock)%20%7B%0A%09%09%09%09this.updateTime()%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.alarm.attributes.weather)%20%7B%0A%09%09%09%09this.getWeather()%3B%0A%09%09%09%7D%0A%09%09%09this.async(this.toggleSiderbar%2C100)%3B%0A%20%20%20%20%20%20%2F%2Fif%20(this.screensaver)%7B%0A%20%20%20%20%20%20%2F%2F%20%20%20%20%20%09%20this.setupEyeCandy()%3B%0A%20%20%20%20%20%20%2F%2F%20%20%20%20%20%7D%0A%20%20%7D%2C%0A%20%20properties%3A%20%7B%0A%20%20%20%20%20%20hass%3A%20%20%20%20%20%20%20%20%20%20%20%20%7B%20type%3A%20Object%20%7D%2C%0A%20%20%20%20%20%20panel%3A%20%20%20%20%20%20%20%20%20%20%20%7B%20type%3A%20Object%20%7D%2C%0A%20%20%20%20%20%20narrow%3A%20%20%20%20%20%20%20%20%20%20%7B%20type%3A%20Boolean%2C%20value%3A%20false%20%7D%2C%0A%20%20%20%20%20%20showMenu%3A%20%20%20%20%20%20%20%20%7B%20type%3A%20Boolean%2C%20value%3A%20false%20%7D%2C%0A%0A%20%20%20%20%20%20alarm%3A%20%20%20%20%20%20%20%20%20%20%20%7B%20type%3A%20Object%2C%20observer%3A%20'monitorAlarm'%20%7D%2C%0A%0A%20%20%20%20%20%20%2F%2F%20Sensor%20Groups%0A%20%20%20%20%20%20immediate%3A%20%20%20%20%20%20%20%7B%20type%3A%20Array%2C%20computed%3A%20'computeSensors(hass%2C%20alarm.attributes.immediate)'%20%7D%2C%0A%20%20%20%20%20%20delayed%3A%20%20%20%20%20%20%20%20%20%7B%20type%3A%20Array%2C%20computed%3A%20'computeSensors(hass%2C%20alarm.attributes.delayed)'%20%7D%2C%0A%20%20%20%20%20%20ignored%3A%20%20%20%20%20%20%20%20%20%7B%20type%3A%20Array%2C%20computed%3A%20'computeSensors(hass%2C%20alarm.attributes.ignored)'%20%7D%2C%0A%20%20%20%20%20%20perimeter%3A%20%20%20%20%20%20%20%7B%20type%3A%20Array%2C%20computed%3A%20'computeSensors(hass%2C%20alarm.attributes.perimeter)'%20%7D%2C%0A%20%20%20%20%20%20allsensors%3A%20%20%20%20%20%20%7B%20type%3A%20Array%2C%20computed%3A%20'computeSensors(hass%2C%20alarm.attributes.allsensors)'%7D%2C%0A%20%20%20%20%20%20overrideSensors%3A%20%7B%20type%3A%20Array%2C%20computed%3A%20'computeSensors(hass%2C%20alarm.attributes.override)'%20%7D%2C%0A%0A%20%20%20%20%20%20opencount%3A%20%20%20%20%20%20%20%7B%20type%3A%20Number%2C%20value%3A%200%20%7D%2C%0A%0A%20%20%20%20%20%20time%3A%20%20%20%20%20%20%20%20%20%20%20%20%7B%20type%3A%20Object%20%7D%2C%0A%20%20%20%20%20%20weather%3A%09%20%20%20%20%20%20%20%7B%20type%3A%20Object%20%7D%2C%0A%20%20%20%20%20%20temp%3A%09%20%20%20%20%20%20%20%20%20%20%20%7B%20type%3A%20String%20%7D%2C%0A%0A%20%20%20%20%20%20code%3A%20%20%20%20%20%20%20%20%20%20%20%20%7B%20type%3A%20String%2C%20value%3A%20''%20%7D%2C%0A%20%20%20%20%20%20display_code%3A%20%20%20%20%7B%20type%3A%20String%2C%20value%3A%20''%20%7D%2C%0A%0A%20%20%20%20%20%20timeoutID%3A%20%20%20%20%20%20%20%7B%20type%3A%20Number%20%7D%2C%0A%0A%20%20%20%20%20%20cleanup%3A%20%20%20%20%20%20%20%20%20%7B%20type%3A%20Array%2C%20value%3A%20%5B%5D%20%7D%2C%0A%20%20%20%20%20%20attemptedArm%3A%20%20%20%20%7B%20type%3A%20Boolean%2C%20value%3A%20false%20%7D%2C%20%0A%20%20%20%20%20%20screensaver%3A%20%20%20%20%20%7B%20type%3A%20Boolean%2C%20value%3A%20false%20%7D%2C%0A%20%20%20%20%20%20settings%3A%09%20%20%20%20%20%20%20%7B%20type%3A%20Boolean%2C%20value%3A%20false%20%7D%2C%0A%0A%20%20%20%20%20%20%2F%2FENUMS%20USED%20FOR%20CSS%20CLASS%20SELECTION%0A%20%20%20%20%20%20panel_locked%3A%20%20%20%20%7B%20type%3A%20Boolean%2C%20value%3A%20false%20%7D%2C%0A%0A%20%20%20%20%20%20hideSensors%3A%20%20%20%20%20%7B%20type%3A%20Boolean%2C%20value%3A%20true%20%7D%2C%0A%20%20%20%20%20%20hideCustom%3A%20%20%20%20%20%20%7B%20type%3A%20Boolean%2C%20value%3A%20true%20%7D%2C%0A%20%20%7D%2C%0A%0A%09computeValue%3A%20function(entity)%20%7B%0A%09%20%20%20%09if%20(entity%20%3D%3D%20undefined)%20%7B%0A%09%09%20%20%20%20return%20false%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20%20%20return%20entity%3B%0A%09%09%7D%0A%09%7D%2C%0A%0A%20%20toggleCSS%3A%20function(ev)%20%7B%0A%20%20%09ev.stopPropagation()%3B%0A%09var%20css%20%3D%20ev.target.getAttribute('data-css')%3B%0A%20%20%09switch%20(css)%20%7B%0A%09%09case%20'sensors'%3A%20this.hideSensors%20%3D%20!this.hideSensors%3B%0A%09%09%09break%3B%0A%09%09case%20'custom'%3A%20this.hideCustom%20%3D%20!this.hideCustom%3B%0A%09%09%09break%3B%0A%09%7D%0A%20%20%7D%2C%0A%0A%20%20toggleSiderbar%3A%20function()%20%7B%0A%09if%20(this.alarm.attributes.hide_sidebar%20%3D%3D%20true)%20Polymer.dom(this.root).querySelector('%23disableSidebar').click()%3B%0A%09if%20(this.alarm.state%20%3D%3D%20'disarmed')%20%7B%0A%20%20%09%09%2F%2F-----DISPLAY%20THE%20SIDE%20BAR%20ON%20THE%20SCREEN-------------%0A%20%20%09%09if%20(this.alarm.attributes.hide_sidebar%20%3D%3D%20true)%20Polymer.dom(this.root).querySelector('%23enableSidebar').click()%3B%0A%20%20%09%7D%0A%20%20%7D%2C%0A%0A%20%20monitorAlarm%3A%20function()%20%7B%0A%20%20%09%2F%2F-----HIDE%20THE%20SIDE%20BAR%20FROM%20THE%20SCREEN-------------%0A%20%20%09if%20(this.alarm.attributes.hide_sidebar%20%3D%3D%20true)%20Polymer.dom(this.root).querySelector('%23disableSidebar').click()%3B%0A%0A%20%20%09var%20countdownTimerDiv%20%3D%20Polymer.dom(this.root).querySelector('%23countdown360_countdown')%3B%0A%20%20%09if%20(countdownTimerDiv)%20countdownTimerDiv.remove()%3B%0A%0A%20%20%09this.updateStyles(%7B'--countdown-timer-display'%3A%20'none'%7D)%3B%0A%20%20%09this.updateStyles(%7B'--time-display'%3A%20'initial'%7D)%3B%0A%20%20%09if%20(this.alarm.state%20%3D%3D%20'disarmed')%20%7B%0A%20%20%09%09if%20(this.attemptedArm%20%3D%3D%20true)%20%7B%20this.resetButtons()%3B%20%7D%0A%20%20%09%09%2F%2F-----DISPLAY%20THE%20SIDE%20BAR%20ON%20THE%20SCREEN-------------%0A%20%20%09%09if%20(this.alarm.attributes.hide_sidebar%20%3D%3D%20true)%20Polymer.dom(this.root).querySelector('%23enableSidebar').click()%3B%0A%20%20%09%09this.updateStyles(%7B'--primary-color'%3A%20this.alarm.attributes.disarmed_colour%7D)%3B%0A%20%20%09%7D%20else%20if%20(this.alarm.state%20%3D%3D%20'armed_away')%20%7B%0A%20%20%09%09this.updateStyles(%7B'--primary-color'%3A%20this.alarm.attributes.armed_away_colour%7D)%3B%0A%20%20%09%7D%20else%20if%20(%20this.alarm.state%20%3D%3D%20'armed_home')%20%7B%0A%20%20%09%09this.updateStyles(%7B'--primary-color'%3A%20this.alarm.attributes.armed_home_colour%7D)%3B%0A%20%20%09%7D%20else%20if%20(%20this.alarm.state%20%3D%3D%20'armed_perimeter')%20%7B%0A%09%20%20%20%20this.updateStyles(%7B'--primary-color'%3A%20this.alarm.attributes.armed_home_colour%7D)%3B%20%2F%2FSORT%20THIS%20OUT%0A%09%7D%20else%20if%20(this.alarm.state%20%3D%3D%20'pending')%20%7B%0A%09%09this.updateStyles(%7B'--primary-color'%3A%20this.alarm.attributes.pending_colour%7D)%3B%0A%09%09this.updateStyles(%7B'--countdown-timer-display'%3A%20'initial'%7D)%3B%0A%09%09this.updateStyles(%7B'--time-display'%3A%20'none'%7D)%3B%0A%09%09this.loadTimer(false%2C%20this.alarm.attributes.countdown_time)%3B%0A%09%7D%20else%20if%20(this.alarm.state%20%3D%3D%20'warning')%20%7B%0A%09%09this.updateStyles(%7B'--primary-color'%3A%20this.alarm.attributes.warning_colour%7D)%3B%0A%09%09this.updateStyles(%7B'--countdown-timer-display'%3A%20'initial'%7D)%3B%0A%09%09this.updateStyles(%7B'--time-display'%3A%20'none'%7D)%3B%0A%09%09this.loadTimer(false%2C%20this.alarm.attributes.countdown_time)%3B%0A%09%7D%20else%20if%20(this.alarm.state%20%3D%3D%20'triggered')%20%7B%0A%09%09this.updateStyles(%7B'--primary-color'%3A%20this.alarm.attributes.triggered_colour%7D)%3B%0A%09%7D%0A%09if%20(this.alarm.attributes.panel_locked%20%3D%3D%20true)%20%7B%0A%09%09console.log(%22Panel%20locked%22)%3B%0A%09%09this.updateStyles(%7B'--primary-color'%3A%20'grey'%7D)%3B%20%2F%2F%5BTODO%5D%20Implement%20panel%20locked%20colour%20-%20this.alarm.attributes.panel_locked_colour%7D)%3B%0A%09%09this.updateStyles(%7B'--countdown-timer-display'%3A%20'initial'%7D)%3B%0A%09%09this.updateStyles(%7B'--time-display'%3A%20'none'%7D)%3B%0A%09%09this.loadTimer(true%2C%20this.alarm.attributes.passcode_attempt_timeout)%3B%0A%09%09this.panel_locked%20%3D%20true%3B%0A%09%7D%0A%09else%20this.panel_locked%20%3D%20false%3B%0A%0A%20%20%7D%2C%0A%20%20getClass%3A%20function(cssClass)%20%7B%0A%20%20%09return%20cssClass%20%3F%20%22slideup%22%20%3A%20%22slidedown%22%3B%0A%20%20%7D%2C%0A%20%20loadTimer%3A%20function(locked%2C%20time)%20%7B%0A%0A%20%20%09var%20startColour%20%3D%20'%238ac575'%3B%0A%20%20%09var%20middleColour%20%3D%20'orange'%3B%0A%20%20%09var%20endColour%20%3D%20'red'%0A%0A%20%20%09if%20(locked%20%3D%3D%20true)%20startColour%20%3D%20middleColour%20%3D%20endColour%20%3D%20'red'%3B%0A%0A%20%20%09var%20countdownDiv%20%3D%20Polymer.dom(this.root).querySelector('%23countdown')%3B%0A%20%20%09%24(countdownDiv).unbind().removeData()%3B%0A%20%20%09var%20countdown%20%3D%20%24(countdownDiv).countdown360(%0A%20%20%09%7B%0A%20%20%09%09radius%20%20%20%20%20%20%3A%2050%2C%0A%20%20%09%09fontColor%20%20%20%3A%20'%23FFFFFF'%2C%0A%20%20%09%09autostart%20%20%20%3A%20false%2C%0A%20%20%09%09label%20%20%20%20%20%20%20%3A%20false%2C%0A%20%20%09%09smooth%20%20%20%20%20%20%3A%20true%2C%0A%20%20%09%09seconds%20%20%20%20%20%3A%20time%2C%0A%20%20%09%09fillStyle_0to50%3A%20startColour%2C%0A%20%20%09%09fillStyle_50to75%3A%20middleColour%2C%0A%20%20%09%09fillStyle_75to100%3A%20endColour%0A%09%7D)%3B%0A%20%20%09countdown.start()%3B%0A%20%20%7D%2C%0A%20%20%20%2F%2F--------------------------------------------------------------%2F%2F%0A%20%20%20%2F%2F-----------------EYE%20CANDY%20FUNCTION---------------------------%2F%2F%0A%20%20%20%2F%2F--------------------------------------------------------------%2F%2F%0A%2F*%20%20%20setupEyeCandy%3A%20function%20()%20%7B%0A%20%20%20%09this.addEventListener(%22mousemove%22%2C%20this.resetTimer)%3B%0A%20%20%20%09this.addEventListener(%22mousedown%22%2C%20this.resetTimer)%3B%0A%20%20%20%09this.addEventListener(%22keypress%22%2C%20this.resetTimer)%3B%0A%20%20%20%09this.addEventListener(%22DOMMouseScroll%22%2C%20this.resetTimer)%3B%0A%20%20%20%09this.addEventListener(%22mousewheel%22%2C%20this.resetTimer)%3B%0A%20%20%20%09this.addEventListener(%22touchmove%22%2C%20this.resetTimer)%3B%0A%20%20%20%09this.addEventListener(%22MSPointerMove%22%2C%20this.resetTimer)%3B%0A%0A%20%20%20%09this.startTimer()%3B%0A%20%20%20%7D%2C%0A%20%20%20startTimer%3A%20function()%20%7B%0A%20%20%20%09this.timeoutID%20%3D%20this.async(this.goInactive%2C8000)%3B%0A%20%20%20%7D%2C%0A%20%20%20resetTimer%3A%20function%20()%20%7B%0A%20%20%20%09clearTimeout(this.timeoutID)%3B%0A%20%20%20%09this.goActive()%3B%0A%20%20%20%7D%2C%0A%20%20%20goActive%3A%20function()%20%7B%0A%20%20%20%09var%20alarmContent%20%3D%20Polymer.dom(this.root).querySelector('%23alarm-panel')%3B%0A%20%20%20%09alarmContent.classList.remove('remove')%3B%0A%20%20%20%09var%20eyecandyContent%20%3D%20Polymer.dom(this.root).querySelector('%23eyecandy')%3B%0A%20%20%20%09eyecandyContent.classList.add('remove')%3B%0A%20%20%20%09var%20appHeader%20%3D%20Polymer.dom(this.root).querySelector('app-header-layout')%3B%0A%20%20%20%09appHeader.classList.remove('hide-bar')%3B%0A%20%20%20%20%20%20%2F%2Fvar%20settingsContent%20%3D%20Polymer.dom(this.root).querySelector('%23settings')%3B%0A%20%20%20%20%20%20%2F%2FsettingsContent.classList.add('remove')%3B%0A%20%20%20%20this.startTimer()%3B%0A%20%20%7D%2C%0A%20%20goInactive%3A%20function%20()%20%7B%0A%20%20%09var%20alarmContent%20%3D%20Polymer.dom(this.root).querySelector('%23alarm-panel')%3B%0A%20%20%09alarmContent.classList.add('remove')%3B%0A%20%20%09var%20eyecandyContent%20%3D%20Polymer.dom(this.root).querySelector('%23eyecandy')%3B%0A%20%20%09eyecandyContent.classList.remove('remove')%3B%0A%20%20%09var%20appHeader%20%3D%20Polymer.dom(this.root).querySelector('app-header-layout')%3B%0A%20%20%09appHeader.classList.add('hide-bar')%3B%0A%20%20%20%20%20%20%2F%2Fvar%20settingsContent%20%3D%20Polymer.dom(this.root).querySelector('%23settings')%3B%0A%20%20%20%20%20%20%2F%2FsettingsContent.classList.remove('remove')%3B%0A%20%20%7D%2C*%2F%0A%20%20%20%2F%2F--------------------------------------------------------------%2F%2F%0A%20%20%20%2F%2F-----------------EYE%20CANDY%20FUNCTION---------------------------%2F%2F%0A%20%20%20%2F%2F--------------------------------------------------------------%2F%2F%0A%20%20%20getWeather%3A%20function()%20%7B%0A%20%20%20%09this.weather%20%3D%20this.hass.states%5B'sensor.dark_sky_summary'%5D%3B%0A%20%20%20%09this.temp%20%3D%20Math.ceil((this.hass.states%5B'sensor.dark_sky_apparent_temperature'%5D).state)%3B%0A%20%20%20%7D%2C%0A%20%20%20toggleSettings()%20%7B%0A%20%20%20%09var%20settingsContent%20%3D%20Polymer.dom(this.root).querySelector('%23settings')%3B%0A%20%20%20%09var%20alarmContent%20%3D%20Polymer.dom(this.root).querySelector('%23alarm-panel')%3B%0A%20%20%20%09if%20(this.settings)%20%7B%0A%20%20%20%09%09alarmContent.classList.remove('remove')%3B%0A%20%20%20%09%09settingsContent.classList.add('remove')%3B%0A%20%20%20%09%09this.settings%20%3D%20false%3B%0A%20%20%20%09%7D%20else%20%7B%0A%20%20%20%09%09alarmContent.classList.add('remove')%3B%0A%20%20%20%09%09settingsContent.classList.remove('remove')%3B%0A%20%20%20%09%09this.settings%20%3D%20true%3B%0A%20%20%20%09%7D%0A%20%20%20%7D%2C%0A%20%20%20updateTime%3A%20function()%20%7B%0A%20%20%20%09this.time%20%3D%20this.hass.states%5B'sensor.time'%5D%3B%0A%20%20%20%20this.async(this.updateTime%2C1000)%3B%0A%20%20%7D%2C%0A%20%20%20%2F%2F%20Polymer%20observers%20definition%0A%20%20%20observers%3A%20%5B%20'onPanelUpdate(hass%2C%20panel)'%20%5D%2C%0A%20%20%20wtf%3A%20function%20(e)%20%7B%20debugger%3B%20return%20e%3B%20%7D%2C%0A%20%20%20%2F%2F%20Helpers%20to%20figure%20out%20what%20to%20display%20%0A%20%20%20isdisarmed%3A%20%20function(alarm)%20%7B%20return%20alarm.state%20%3D%3D%20%22disarmed%22%3B%20%7D%2C%0A%20%20%20isperimeter%3A%20%20function(alarm)%20%7B%20return%20alarm.state%20%3D%3D%20%22armed_perimeter%22%3B%20%7D%2C%0A%20%20%20issecure%3A%20%20%20%20function(all)%20%20%20%7B%20return%20this.opensensors(alarm%2C%20all).length%20%3D%3D%200%3B%20%7D%2C%0A%20%20%20opensensors%3A%20function(alarm%2C%20all)%20%20%20%7B%20%0A%20%20%20%09if%20(all%20%3D%3D%20false)%20%7B%0A%20%20%20%09%09return%20false%3B%0A%20%20%20%09%7D%20else%20%7B%0A%20%20%20%09%09ret%20%3D%20all.filter(function%20(e)%20%7B%20return%20alarm.attributes.supported_statuses_on.indexOf(e.state.toLowerCase())%20%3E%20-1%3B%20%7D)%3B%20%0A%20%20%20%09%09this.opencount%20%3D%20ret.length%3B%0A%20%20%20%09%09return%20ret%3B%0A%20%20%20%09%7D%0A%20%20%20%7D%2C%0A%20%20%20closedsensors%3A%20function(alarm%2C%20all)%20%20%20%7B%0A%20%20%20%09if%20(all%20%3D%3D%20false)%20%7B%0A%20%20%20%09%09return%20false%3B%0A%20%20%20%09%7D%20else%20%7B%0A%20%20%20%09%09ret%20%3D%20all.filter(function%20(e)%20%7B%20return%20alarm.attributes.supported_statuses_off.indexOf(e.state.toLowerCase())%20%3E%20-1%3B%20%7D)%3B%0A%20%20%20%09%09return%20ret%3B%0A%20%20%20%09%7D%0A%20%20%20%7D%2C%0A%20%20%20computeSensors%3A%20function(hass%2C%20ids)%20%7B%0A%20%20%20%09if%20(ids%20%3D%3D%20undefined)%20%7B%0A%09%20%2F%2F%20Control%20the%20exception%20when%20this.alarm%20is%20not%20ready%0A%09%20return%20false%3B%0A%09%7D%20else%20%7B%0A%09%09return%20ids.map(function%20(key)%20%7B%20return%20hass.states%5Bkey%5D%3B%20%7D).filter(function%20(e)%20%7B%20return%20e%20!%3D%20undefined%3B%20%7D)%3B%0A%09%7D%0A%7D%2C%0AcomputeIcon%3A%20function%20(state)%20%7B%0A%09switch%20(state)%20%7B%0A%09%09case%20'disarmed'%3A%20%20%20%20%20%20%20%20return%20'mdi%3Ashield-outline'%3B%0A%09%09case%20'armed_away'%3A%20%20%20%20%20%20return%20'mdi%3Asecurity-home'%3B%0A%09%09case%20'armed_home'%3A%20%20%20%20%20%20return%20'mdi%3Asecurity-home'%3B%0A%09%09case%20'pending'%3A%20%20%20%20%20%20%20%20%20return%20'mdi%3Awalk'%3B%0A%09%09case%20'warning'%3A%20%20%20%20%20%20%20%20%20return%20'mdi%3Arun'%3B%0A%09%09case%20'triggered'%3A%20%20%20%20%20%20%20return%20'mdi%3Aalert-circle'%3B%0A%09%09case%20'armed_perimeter'%3A%20return%20'mdi%3Asecurity-home'%3B%0A%09%7D%0A%09return%20'mdi%3Ahelp'%3B%0A%7D%2C%0AcomputeLabel%3A%20function%20(state)%20%7B%0A%09switch%20(state)%20%7B%0A%09%09case%20'disarmed'%3A%20%20%20%09%20return%20'disarmed'%3B%0A%09%09case%20'armed_away'%3A%20%09%20return%20'away'%3B%0A%09%09case%20'armed_home'%3A%20%09%20return%20'home'%3B%0A%09%09case%20'pending'%3A%20%20%20%20%09%20return%20'leave'%3B%0A%09%09case%20'warning'%3A%20%20%20%20%09%20return%20'warning'%3B%0A%09%09case%20'triggered'%3A%20%20%09%20return%20'triggered'%3B%0A%09%09case%20'armed_perimeter'%3A%20return%20'perimeter'%3B%0A%09%7D%0A%09return%20state%3B%0A%7D%2C%0A%20%20%20%2F%2F%20Responding%20to%20user%20inputs%0A%20%20%20callcode%3A%20function(ev)%20%7B%0A%20%20%20%09ev.stopPropagation()%3B%0A%20%20%20%09var%20digit%20%3D%20ev.target.getAttribute('data-digit')%3B%0A%20%20%20%09this.code%20%3D%20this.code%20%2B%20digit%3B%0A%20%20%20%09var%20display_digit%20%3D%20digit%3B%0A%20%20%20%09if%20(this.alarm.attributes.hide_passcode)%20%7B%0A%20%20%20%09%20%20display_digit%20%3D%20'*'%3B%0A%20%20%20%09%7D%0A%20%20%20%09this.display_code%20%3D%20this.display_code%20%2B%20display_digit%3B%0A%20%20%7D%2C%0A%20%20callclearcode%3A%20function(ev)%20%7B%0A%20%20%09ev.stopPropagation()%3B%0A%20%20%09this.code%20%3D%20''%3B%0A%20%20%09this.display_code%20%3D%20''%3B%0A%20%20%7D%2C%0A%20%20callService%3A%20function(ev)%20%7B%0A%20%20%09ev.stopPropagation()%3B%0A%20%20%09var%20call%20%3D%20ev.target.getAttribute('data-call')%3B%0A%20%20%20%20%20%20if%20(call%20%3D%3D%20'cancel')%20%7B%20%2F%2Fcancel%20alarm%20set%20and%20return%20page%20to%20default%20settings%0A%20%20%20%20%20%20%09this.resetButtons()%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(ev.target.getAttribute('data-override'))%20%7B%20%2F%2FOverride%20of%20open%20sensors%20has%20been%20pressed%20so%20activate%20alarm%0A%20%20%20%20%20%20%09this.hass.callService('alarm_control_panel'%2C%20call%2C%20%7B'entity_id'%3A%20this.alarm.entityId%2C%20'code'%3A%20this.code%7D)%3B%0A%20%20%20%20%20%20%7D%20else%20if%20((call%20%3D%3D%20'alarm_arm_home'%20%7C%7C%20call%20%3D%3D%20'alarm_arm_away'%20%7C%7C%20call%20%3D%3D%20'alarm_arm_night')%20%26%26%20this.checkOpenSensors(call))%20%7B%20%2F%2FCheck%20if%20trying%20to%20activate%20home%20with%20open%20sensors.%20If%20so%20ping%20the%20warning%20message%0A%20%20%20%20%20%20%09console.log('WARNING%20open%20sensors')%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%20%2F%2FNo%20open%20sensors%20or%20another%20service%20call%0A%20%20%20%20%20%20%09this.hass.callService('alarm_control_panel'%2C%20call%2C%20%7B'entity_id'%3A%20this.alarm.entityId%2C%20'code'%3A%20this.code%7D)%3B%0A%20%20%20%20%20%20%09this.code%20%3D%20''%3B%0A%20%20%20%20%20%20%09this.display_code%20%3D%20''%3B%0A%20%20%20%20%20%20%7D%0A%20%20%7D%2C%0A%20%20checkOpenSensors%3A%20function(call)%20%7B%0A%20%20%20%20%20%20if%20(this.opencount%20%3D%3D%200)%20return%20false%3B%20%2F%2Fcheck%20to%20see%20how%20many%20open%20sensors%20there%20are%2C%20if%20none%20arm%20alarm%0A%0A%20%20%20%20%20%20for%20(var%20sensor%20in%20this.allsensors)%20%7B%20%2F%2Fcheck%20to%20see%20if%20the%20open%20sensor%20is%20one%20to%20ignore%2C%20if%20so%20arm%20alarm%0A%09%20%2F%2Fis%20it%20open%3F%0A%09%20if%20(%5B'on'%2C%20'open'%2C%20'true'%2C%20'detected'%2C%20'unlocked'%5D.indexOf(this.allsensors%5Bsensor%5D.state.toLowerCase())%20%3E%20-1)%20%7B%20%2F%2Fyes%0A%09%20%20%20%20%2F%2Fis%20it%20in%20the%20override%20list%3F%0A%09%20%20%20%20if%20(this.overrideSensors.indexOf(this.allsensors%5Bsensor%5D)%20%3D%3D%20-1)%20%7B%20%2F%2FNo%3A%20return%20so%20display%20message%0A%09%20%20%20%20%20%20%20this.attemptedArm%20%3D%20true%3B%20%2F%2Fdisplay%20the%20warning%20message%20and%20shake%0A%0A%09%20%20%20%20%20%20%20var%20btnArmHome%20%20%20%20%20%20%3D%20Polymer.dom(this.root).querySelector('%23arm-home')%3B%0A%09%20%20%20%20%20%20%20var%20btnArmAway%20%20%20%20%20%20%3D%20Polymer.dom(this.root).querySelector('%23arm-away')%3B%0A%0A%09%20%20%20%20%20%20%20if%20(this.alarm.attributes.perimeter_mode)%20%7B%0A%09%20%20%20%20%20%20%20%09var%20btnArmPerimeter%20%3D%20Polymer.dom(this.root).querySelector('%23arm-perimeter')%3B%0A%09%20%20%20%20%20%20%20%09btnArmPerimeter.classList.add('remove')%3B%0A%09%20%20%20%20%20%20%20%7D%0A%09%20%20%20%20%20%20%20btnArmHome.classList.add('big')%3B%0A%09%20%20%20%20%20%20%20btnArmAway.classList.add('little')%3B%0A%0A%09%20%20%20%20%20%20%20this.override%20%3D%20document.createAttribute(%22data-override%22)%3B%0A%09%20%20%20%20%20%20%20this.override.value%20%3D%20%22true%22%3B%0A%09%20%20%20%20%20%20%20btnArmHome.setAttributeNode(this.override)%3B%0A%0A%09%20%20%20%20%20%20%20var%20arm_mode%20%3D%20document.createAttribute(%22data-call%22)%3B%0A%09%20%20%20%20%20%20%20arm_mode.value%20%3D%20call%3B%0A%09%20%20%20%20%20%20%20btnArmHome.setAttributeNode(arm_mode)%3B%0A%0A%09%20%20%20%20%20%20%20var%20arm_mode2%20%3D%20document.createAttribute(%22data-call%22)%3B%0A%09%20%20%20%20%20%20%20arm_mode2.value%20%3D%20'cancel'%3B%0A%09%20%20%20%20%20%20%20btnArmAway.setAttributeNode(arm_mode2)%3B%0A%09%20%20%20%20%20%20%20btnArmHome.innerHTML%20%3D%20'Override%20Sensors%20and%20Arm%20Alarm'%3B%0A%09%20%20%20%20%20%20%20btnArmAway.innerHTML%20%3D%20'Cancel%20Arm'%3B%0A%0A%09%20%20%20%20%20%20%20var%20pageContent%20%3D%20Polymer.dom(this.root).querySelector('.content')%3B%0A%09%20%20%20%20%20%20%20pageContent.classList.add('shake')%3B%0A%0A%09%20%20%20%20%20%20%20return%20true%3B%0A%09%20%20%20%7D%0A%09%7D%20%20%20%20%20%20%20%20%20%20%0A%7D%0A%7D%2C%0AresetButtons%3A%20function()%20%7B%0A%09this.attemptedArm%20%3D%20false%3B%0A%0A%09var%20pageContent%20%3D%20Polymer.dom(this.root).querySelector('.content')%3B%0A%09pageContent.classList.remove('shake')%3B%0A%0A%09var%20btnArmHome%20%20%20%20%20%20%3D%20Polymer.dom(this.root).querySelector('%23arm-home')%3B%0A%09var%20btnArmAway%20%20%20%20%20%20%3D%20Polymer.dom(this.root).querySelector('%23arm-away')%3B%0A%09if%20(this.alarm.attributes.perimeter_mode)%20%7B%0A%09%09var%20btnArmPerimeter%20%3D%20Polymer.dom(this.root).querySelector('%23arm-perimeter')%3B%0A%09%09btnArmPerimeter.classList.remove('remove')%3B%0A%09%7D%0A%09btnArmHome.classList.remove('big')%3B%0A%09btnArmAway.classList.remove('little')%3B%0A%0A%20%20%20%20%20%20%2F%2Fvar%20override%20%3D%20document.createAttribute(%22data-override%22)%3B%0A%20%20%20%20%20%20btnArmHome.removeAttributeNode(this.override)%3B%0A%0A%20%20%20%20%20%20var%20arm_mode%20%3D%20document.createAttribute(%22data-call%22)%3B%0A%20%20%20%20%20%20arm_mode.value%20%3D%20'alarm_arm_home'%3B%0A%20%20%20%20%20%20btnArmHome.setAttributeNode(arm_mode)%3B%0A%0A%20%20%20%20%20%20var%20arm_mode2%20%3D%20document.createAttribute(%22data-call%22)%3B%0A%20%20%20%20%20%20arm_mode2.value%20%3D%20'alarm_arm_away'%3B%0A%20%20%20%20%20%20btnArmAway.setAttributeNode(arm_mode2)%3B%0A%0A%20%20%20%20%20%20btnArmHome.innerHTML%20%3D%20%22%3Ciron-icon%20icon%3D'mdi%3Alock-outline'%3E%3C%2Firon-icon%3E%26nbsp%3BHome%20Mode%22%3B%0A%20%20%20%20%20%20btnArmAway.innerHTML%20%3D%20%22%3Ciron-icon%20icon%3D'mdi%3Alock'%3E%3C%2Firon-icon%3E%26nbsp%3BAway%20Mode%22%3B%0A%0A%20%20%7D%2C%0A%20%20entityTapped%3A%20function%20(ev)%20%7B%0A%20%20%09ev.stopPropagation()%3B%0A%20%20%09var%20entityId%20%3D%20ev.target.getAttribute('data-entity')%3B%0A%20%20%09this.fire('hass-more-info'%2C%20%7B%20entityId%3A%20entityId%20%7D)%3B%0A%20%20%7D%2C%0A%20%20%20%2F%2F%20Observer%3A%20polymer%20gaurantees%20that%20this%20won't%20be%20called%20util%20hass%20and%20panel%20are%20both%20defined%0A%20%20%20onPanelUpdate%3A%20function(hass%2C%20panel)%20%7B%0A%20%20%20%20%20%20%2F%2Fconsole.log('onPanelUpdate')%3B%0A%20%20%20%20%20%20this.alarm%20%3D%20hass.states%5Bpanel.config.alarmid%5D%3B%0A%20%20%20%20%20%20%2F%2Fconsole.log('Alarm%20is%20'%2C%20this.alarm)%3B%0A%20%20%7D%2C%0A%7D)%3B%0A%0A%2F%2F%23%20sourceURL%3Dhttps%3A%2F%2Fha.testing123.net%3A8123%2Ffrontend%2Fpanels%2Falarm-001f97509c39e788542bd2b51deb052d.html.js%0A:0:0 Script error.

That makes a lot of sense.

I canā€™t see any real need for delayed sensors with perimeter mode, but possibly for home mode.
ie. Maybe some pir sensors are located in room you want alarmed, but also want the ability to delay the siren in case you forget to disable the alarm before walking in there.

Is it possible to make one trigger (for example front door sensor) to not trigger the alarm immediately (if alarm is armed) but after 20 seconds to give time to disarm?

That is what the delayed sensors group and pending time is for. See configuration instructions here: