YET another take on an alarm system

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:

I will check.

But this is not for the ARMED AWAY mode, when you arm the alarm and EXIT the house?

I need the above, but also the opposite, for the DISARM when you return home.

I hope I am clear

It works for both entry and exit.

pending_time: 25 #[OPTIONAL, Number, default 25] Grace time in seconds to allow for exit and entry using Away mode.

delayed: #[OPTIONAL, list of entities] Sensors in this group start the clock (pending_time) when tripped before the alarm is activated in ‘Away’ mode

i.e. when leaving the system will wait the pending time to allow you to exit. When entering a tripped sensor in the delayed group will wait the pending time before activating the alarm.

Hi,

i have the same problem, the system works with other browsers like chrome and safari but i’m not able to use it with firefox.
I have solved changing the browser…

Hi,

When you click on the alarm panel, using browser other then firefox do you still get a script error in your log file?
This happens every time I click alarm on the side bar, also can confirm when using chrome I get the panel displayed, but still triggers script error in the log file.