NEWS
[Projekt] Alarmanlage mit mehreren Alarmstufen
-
Aber eine zwei Fragen hätte ich doch noch…
Die Sensoren welche ich unter facade und oder motion anlege, werden die in dem Script als true abgefragt, also bei true geht die scharfe Anlage auf Alarm?
Habe unter Aufzählungen unter functions die motion und facade angelegt und jeweils ein script zugeordnet unter java.0 welches ein true und false ausgibt...Es passiert aber leider nichts bei den Outputs des Alarmscripts... Muss ich in dem Logik Script / Auszug unten die komplette ID einragen oder oder reicht das so mit dem * ?
var selFacade = $('statestate.id=javascript.0.*');
-
Aber eine zwei Fragen hätte ich doch noch…
Die Sensoren welche ich unter facade und oder motion anlege, werden die in dem Script als true abgefragt, also bei true geht die scharfe Anlage auf Alarm?
Habe unter Aufzählungen unter functions die motion und facade angelegt und jeweils ein script zugeordnet unter java.0 welches ein true und false ausgibt...Es passiert aber leider nichts bei den Outputs des Alarmscripts... Muss ich in dem Logik Script / Auszug unten die komplette ID einragen oder oder reicht das so mit dem * ?
var selFacade = $('statestate.id=javascript.0.*'); ` Poste doch Mal dein Skript und einen Screenshot der Objekte. Dann ist es einfacher das zu verstehen was du alles eingerichtet hast.
Gesendet von meinem Pixel 2 mit Tapatalk
-
Hallo, hab mal ein paar Bilder zusammen gestellt.
Ist das richtig, dass profil auto und default nicht in der Vis activiert werden können? Nur die Rückmeldung falls aktiv?
Was ist der gedanke hinter disen beiden Profilen? Aktivierung über Anwesenheitserkennung automatish? und das default Profil?
/* multi channel burglar alarm - v 0.01 features: - six different alarm channels - delayed alarm action - delayed sensor check - alarmlog - define settings as profil changelog: 29.09.2017 initial version 01.10.2017 restructered with revealing module pattern 03.10.2017 profiles added for alarm channels and sensor groups */ var ALARM = (function () { //Settings var instance = 'javascript.0.'; var maxLogEntries = 5; //Internal states var enable = false; var state = 0; var alarm = false; var alarmDelay; var alarmTimer = {}; var alarmLog = []; var sensorDelay; var sensorTimer = {}; //Sensors var selFacade = $('state[state.id=javascript.0.*](functions=facade)'); selFacade.on(function(obj) { _checkSensor(obj,'facade'); }); var selMotion = $('state[state.id=javascript.0.*](functions=motion)'); selMotion.on(function(obj) { _checkSensor(obj,'motion'); }); function _checkSensor(obj, group){ if(sensorDelay[group] === 0){ _check(obj); }else if(sensorDelay[group] > 0){ setTimeout(_check,(sensorDelay[group]*1000),obj); } log('checkSensor group:'+group); } function _loadSettings(profile){ switch(profile) { case 'silent': sensorDelay = {motion:0,facade:0}; alarmDelay = {silent:0}; break; case 'night': sensorDelay = {facade:0}; alarmDelay = {silent:0,intern:60,extern:60}; break; case 'full': sensorDelay = {motion:0,facade:0}; alarmDelay = {silent:0,sound:30,strobe:30,intern:60,extern:60,mail:120}; break; case 'presence': sensorDelay = {motion:0,facade:0}; alarmDelay = {silent:0,sound:30,strobe:30,intern:60,extern:60,mail:120}; break; case 'auto': sensorDelay = {motion:0,facade:0}; alarmDelay = {silent:0,sound:30,strobe:30,intern:60,extern:60,mail:120}; break; default: profile = 'default'; sensorDelay = {motion:0,facade:0}; alarmDelay = {silent:0,sound:30,strobe:30,intern:60,extern:60,mail:120}; } setState(instance+'alarm.out.profile', profile, true); log('loadSettings profile:'+profile); } function _enable(profil){ enable = true; state = 1; _resetAlarm(); _loadSettings(profil); log('enable'); } function _disable(){ enable = false; state = 0; _resetAlarm(); _resetAlarmTimer(); log('disable'); } function _stop(){ state = 1; _resetAlarm(); log('stop'); } function _resetAlarmTimer(){ for (var elem in alarmTimer) { clearTimeout(alarmTimer[elem]); alarmTimer[elem] = null; } log('resetAlarmTimer'); } function _resetAlarm(){ alarm = false; setState(instance+'alarm.out.state', state, true); setState(instance+'alarm.out.alarm', false, true); setState(instance+'alarm.out.alarm_silent', false, true); setState(instance+'alarm.out.alarm_sound', false, true); setState(instance+'alarm.out.alarm_strobe', false, true); setState(instance+'alarm.out.alarm_intern', false, true); setState(instance+'alarm.out.alarm_extern', false, true); setState(instance+'alarm.out.alarm_mail', false, true); _resetAlarmTimer(); log('resetAlarm state:'+state); } function _startAlarm(elem){ alarm = true; setState(instance+'alarm.out.alarm_'+elem, true, true); setState(instance+'alarm.out.state', 3, true); log('startAlarm elem:'+elem); } function _check(obj){ if(obj.state.val && enable){ for (var elem in alarmDelay) { if(alarmDelay[elem] === 0){ _startAlarm(elem); } else if(!alarmTimer[elem]){ alarmTimer[elem] = setTimeout(_startAlarm,(alarmDelay[elem]*1000),elem); } log('startAlarms elem'+elem+':'+alarmDelay[elem]); } _logSensor(obj); log('alarm triggered by sensor '+obj.common.name); } log('check obj:'+obj.common.name); } function _logSensor(obj){ var time = (new Date()).toLocaleDateString()+' '+(new Date()).toLocaleTimeString(); var sensor = obj.common.name; var room = getObject(obj.id, 'rooms').enumNames[0]; alarmLog.push(time+' '+sensor+' '+room); alarmLog.splice(maxLogEntries); setState(instance+'alarm.out.log', alarmLog.join(' '), true); setState(instance+'alarm.out.last_sensor', time+' '+sensor+' '+room, true); } _loadSettings(); return { enable: _enable, disable: _disable, stop: _stop }; })(); on({id:'javascript.0.alarm.in.enable', change:'any'}, function(obj){ ALARM.enable(obj.state.val); log('on: in.enable val:'+obj.state.val); }); on({id:'javascript.0.alarm.in.disable', change:'any'}, function(obj){ ALARM.disable(); log('on: in.disable'); }); on({id:'javascript.0.alarm.in.stop', change:'any'}, function(obj){ ALARM.stop(); log('on: in.stop'); }); on('javascript.0.presence', function(obj){ var state = getState('javascript.0.alarm.out.state').val; var profile = getState('javascript.0.alarm.out.profile').val; if(profile == 'auto'){ if(obj.state.val && state > 0){ setState('javascript.0.alarm.in.disable', true, true); }else{ setState('javascript.0.alarm.in.enable', 'auto', true); } } });
-
Das sieht doch schon sehr gut aus.
Die Alarmanlage ist auf deinen Screenshot disabled. Ist das Absicht?
Aktivier die Alarmanlage mal per GUI oder über setzen des states "'javascript.0.alarm.in.enable" auf z.B. den Wert "full".
Profil "auto" aktiviere ich über eine automatische Anwesenheitserkennung.
Profil "default" nutze ich aktuell nicht.
-
Hallo, ja das ist disabled, weil ich aktuell noch am testen bin.. habe noch keine Sensoren und keine Sirene als Aktor. Im Moment habe ich nur die Aussenbeleuchtung und den emailversand als Alarmoutput eingebunden…
habe versucht den Sensor mit nem Sonoff switch zu simulieren in dem ich ihn als facade und motionin in Aufzählungen eingebunden habe...Mit Status des Sonoff true, müsste doch eigentlich der Alarm losgehen wenn auf aktiv steht. oder verstehe ich das falsch?
Hast du ein Tip wie ich kontrollieren kann, ob die Enum / Aufzählungen vom Script sauber eingelesen und angesteuert werden?
Hab auch die Anwesenheitssimulation laufen mit der AWS Aktiv würde ich auch gerne die Alarmanlage scharf schalten. Kannst du mir da auch ein Tipp zu geben?
Dachte da an ein zusätzliches kleines Script wie:
` > on({id: 'javascript.0.Anwesenheitssteuerung.AWSAktiv'}, function (obj) {setState("javascript.0.alarm.in.enable", auto);
}); `
oder wie hast du das gelöst?
-
oder wie hast du das gelöst? `
on('javascript.0.central.presence', function (obj) { var state = getState('javascript.0.alarm.out.state').val; var profile = getState('javascript.0.alarm.out.profile').val; if (profile == 'auto' || state === 0) { if (obj.state.val && state > 0) { setState('javascript.0.alarm.in.disable', true, true); } else { setState('javascript.0.alarm.in.enable', 'auto', true); } } });
-
Hast du ein Tip wie ich kontrollieren kann, ob die Enum / Aufzählungen vom Script sauber eingelesen und angesteuert werden? `
Dazu gibt es folgendes in der Doku des javascript Adapters:
$('channel[state.id=*.STATE](functions=Windows)').each(function (id, i) {log(id);}); - print all states of enum "windows" in log
-
Super danke für das script Automatische Aktivierung…Das Aktivieren funktioniert prima mit meiner Anwesenheitssteuerung.
Leider kann ich es so nicht verwenden, da meine Anwesenheitssteuerung welche bei jemand zu Hause auf false schaltet , die Alarmanalge nicht deaktiviert. wenn ich die Anweseheitssteuerung auf true force funktioniert das auto aktivieren einwandfrei...force ich auf false bleibt die Alarmanalge aktiviert.
Ist das bei dir so gewollt? Stellst du die Alarmanlage dann manuell unscharf? oder hast du noch ein separates script für das Deaktivieren? Ist natürlich doof wenn bei Anwesenheit die restlichen Profile nicht mehr aktiviert werden können. Wie machst du das?
-
Das Problem hab ich irgendwie nicht verstanden.
Was meinst du mit "true force"?
Ich stelle die Anlange automatisch unscharf, wenn das Profil auto aktiv ist und jemand nach Hause kommt (javascript.0.central.presence wechselt auf true). Das passiert nicht in dem genannten Skript und nicht seperat.
-
Mit true forcen meine ich meine Startbedingung auf true setzen javascript.0.Anwesenheitssteuerung.AWSAktiv. Diese Objekt ID wird bei mir true wenn keiner zu Hause ist..Mit dieser Bedingung gehe ich in die Automatikfunktion der Alarmanlage..Dazu habe ich dein Programmteil der Alarmanlage verwendet , weil es viel besser ist als meine eigenen stümperhaften Gehversuche. Das funktioniert auch prima…Wenn jetzt jemand heim kommt, wird die oben genannte Objekt ID false...Damit müsste ich jetzt noch die javascript.0.alarm.in.disable erneut true schalten um die Alarmanlage wieder zu deaktivieren, aber so, dass ich jederzeit die 4 andern Profile manuell über vis aktivieren kann...Also nur kurz antriggern und nicht ständig auf false halten... Ist das in dem Programmteil der Alarmanlage so gelöst? Das macht es nämlich nicht bei mir..
` > on('javascript.0.Anwesenheitssteuerung.AWSAktiv', function (obj) {
var state = getState('javascript.0.alarm.out.state').val;
var profile = getState('javascript.0.alarm.out.profile').val;
if (profile == 'auto' || state === 0) {
if (obj.state.val && state > 0) {
setState('javascript.0.alarm.in.disable', true, true);
} else {
setState('javascript.0.alarm.in.enable', 'auto', true);
}
}
}); `
-
Ok hab es geschnallt….hab bei der ganzen Sache etwas auf dem Schlauch gestanden..wenn ich mir meine fragen jetzt so durchlese möchte ich sie am liebsten löschen. Aber aller Anfang ist schwer....die Alarmanlage ist nun in Betrieb und läuft bestens....danke für die tolle Arbeit ...
-
Ok hab es geschnallt….hab bei der ganzen Sache etwas auf dem Schlauch gestanden..wenn ich mir meine fragen jetzt so durchlese möchte ich sie am liebsten löschen. Aber aller Anfang ist schwer....die Alarmanlage ist nun in Betrieb und läuft bestens....danke für die tolle Arbeit ... `
so haben wir alle mal angefangen. Viel Spaß weiterhin
-
Das Script läuft nun seit einiger Zeit fantastisch und Stabil…
Ich frage mich nur, warum das Script bei jeder Veränderung der Enum facade und motion also bei Fenster - Türkontakten und Bewegungsmeldern losläuft.
(check Sensor)
Kann man das nicht auf die Zeit begrenzen in der die Alarmanlage scharf ist...
Wäre das ein großer Aufwand das anzupassen? Richte die Frage mal an den Entwickler...
Würde das nicht Ressourcen schonen?
-
Das Script läuft nun seit einiger Zeit fantastisch und Stabil…
Ich frage mich nur, warum das Script bei jeder Veränderung der Enum facade und motion also bei Fenster - Türkontakten und Bewegungsmeldern losläuft.
(check Sensor)
Kann man das nicht auf die Zeit begrenzen in der die Alarmanlage scharf ist...
Wäre das ein großer Aufwand das anzupassen? Richte die Frage mal an den Entwickler...
Würde das nicht Ressourcen schonen? `
Wieviele Fenster öffnest du denn so pro Sekunde?
Denke der Aufwand zur Optimierung ist nicht gerechtfertigt…
-
Meintest wohl nicht gerechtfertigt, oder?
…nun ja wir laufen schon sehr oft durch den Flur und das Wohnzimmer, wo ich jeweils nen Bewegungsmelder habe...
Und die Terassentür und Haustür ist auch sehr stark frequntiert...
Und Fenster werden auch sehr oft geöffnet.
Ich habe jetzt keine Auswertung mit dem historyadapter gefahren, aber es kommt schon was zusammen...
Gesendet von meinem SM-G800F mit Tapatalk
-
Hallo,
@ nisio
Vielen Dank für Dein tolles script, ich habe es (glaube ich) größtenteils verstanden und eingebaut.
Es tut, was es soll.
Meine BWM und Türkontakte sind in die Homematic über einen wired HMW-Sen-SC-12-DR angebunden.
Nachdem meine Bewegungsmelder im Gegensatz zu den Türkontakten deutlich verzögert auslösten, habe ich nach langem Suchen festgestellt, daß ein Alarm im script nur bei KontaktÖFFNUNG ausgelöst wird.
Angezeigt werden die BWM im Ruhezustand als geöffnet, die Türkontakte jedoch als geschlossen.
Leider gibt es in HM keine Möglichkeit in den Geräteeinstellungen die Logik umzukehren (geschweige denn für einzelne Kanäle…).
Hättest Du einen Tip für mich, wie ich im script den Auslöser umstellen kann von geöffnet auf geschlossen?
Vielen Dank im Voraus
Ulrich
-
Hi,
ich hab das Script auch soweit gut am laufen habe nur ein Problem das die Bewegungsmelder ständig Alarm auslösen.
Bewegungsmelder sind Homematic IP haben als Alarmanlage auf der CCU wunderbar ohne Fehler funktioniert.
An was könnt es also liegen das diese hier im Script einfach auslösen.
Grüße
5373_img_0117.png -
@Homer1976
Kann es sein, daß Du Alarm- und Logmeldungen verwechselst?
Auf Deinem Bildschirmcopy sehe ich Alarmlogs, aber keinen Alarm.
Die Alarmanlage ist immer in Betrieb, schreibt also immer logs (z.B. für Sabotagemeldungen), Alarm gibt es jedoch nur nach Einschalten eines Profils.
Ulrich
-
Nein ist alles IO hab alles auch nochmal durch geschaut schalte ich die Anlage scharf dauert es keine 5 Minuten und der Alarm wird ausgelöst.
Und immer von einem anderen Melder.
Was im Log steht war nur von mir der Test ob sie Auslöst.
Grüße
-
Das Script läuft nun seit einiger Zeit fantastisch und Stabil…
Ich frage mich nur, warum das Script bei jeder Veränderung der Enum facade und motion also bei Fenster - Türkontakten und Bewegungsmeldern losläuft.
(check Sensor)
Kann man das nicht auf die Zeit begrenzen in der die Alarmanlage scharf ist...
Wäre das ein großer Aufwand das anzupassen? Richte die Frage mal an den Entwickler...
Würde das nicht Ressourcen schonen? `
Meinstest du das als Anpassung?
vorher:
function _checkSensor(obj, group) { if (enable) { if (sensorDelay[group] === 0) { _check(obj); } else if (sensorDelay[group] > 0) { setTimeout(_check, (sensorDelay[group] * 1000), obj); } } log('checkSensor group:' + group + ' obj:' + obj.id, 'debug'); }
nachher:
function _checkSensor(obj, group) { if (enable) { if (sensorDelay[group] === 0) { _check(obj); } else if (sensorDelay[group] > 0) { setTimeout(_check, (sensorDelay[group] * 1000), obj); } log('checkSensor group:' + group + ' obj:' + obj.id, 'debug'); } }