AhmadK
(akasma74)
March 7, 2018, 8:14am
649
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.
AhmadK
(akasma74)
March 8, 2018, 12:00am
652
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?
Petrica
(PetricaM)
March 8, 2018, 6:00am
653
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).
AhmadK
(akasma74)
March 8, 2018, 9:04am
654
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
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
Petrica
(PetricaM)
March 8, 2018, 9:41am
655
Sorry, I canāt help you about that.
I only use OpenMQTT, however on a large number of devices : 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
AhmadK
(akasma74)
March 8, 2018, 11:10am
656
Petrica:
I only use OpenMQTT, however on a large number of devices : 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).
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!
Petrica
(PetricaM)
March 8, 2018, 12:08pm
657
AhmadK:
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 s
ame apart form they relay number and name, and I will have at least 10 of them, thatās why Iām askingā¦
Yes, Iām using the greatest software development tool ever, Microsoft Excel
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.
AhmadK
(akasma74)
March 8, 2018, 12:48pm
659
wow, thatās something
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.
onkytonk
(Joseph Naim)
March 8, 2018, 12:51pm
660
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.
Petrica
(PetricaM)
March 8, 2018, 2:52pm
662
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.
Hello,
Continuing my work on MQTT gateway with cheap component you can find below a tutorial to build a bidirectional one with IR transmitter, IR receiver, 433mhz emitter and 433mhz receiver.
You can integrate it with HA by using MQTT, more information on this topic
1 Like
onkytonk
(Joseph Naim)
March 9, 2018, 12:29am
663
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.
onkytonk
(Joseph Naim)
March 10, 2018, 3:04am
666
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?
tom_l
March 11, 2018, 11:08am
668
That is what the delayed sensors group and pending time is for. See configuration instructions here:
## Installation Guide
To get this running add the files (alarm.yaml, panels/alarm.html, custom_components/alarm_control_panel/bwalarm.py, www/lib/countdown360.js, www/lib/jquery-3.2.1.min.js, www/alarm/alarm.css) from this repo into your home assistant configuration directory, then add the following to your configuration.yaml file:
**NOTE:** If you already have a panel_custom.yaml for say floorplan then just copy and paste the code from this repo file into your own panel_custom.yaml to prevent floorplan from being overritten.
**NOTE:** Same goes for Automations.yaml. Append the samples inside of this file into your own automations.yaml
```
alarm_control_panel: !include alarm.yaml
panel_custom: !include panel_custom.yaml
```
**NOTE:** If you experience issues with the page not displaying then add the following:
```
#CONFIGURATION.YAML
frontend:
javascript_version: latest
```
## Configuration variables:
**Alarm.yaml configuration settings:**
This file has been truncated. show original