Moin,
angeregt von diesem Blogeintrag (http://blog.moneybag.de/erfahrungsbericht-olympia-protect-alarmanlagenset-6061-5940/), hab ich wieder mal ein bisschen gebastelt:
Die Idee:
Ein MySensors Sensor mit 2 Fotowiderständen, soll den Status der Alarmanlage anhand einer blinkenden LED und eines blinkenden Displays an FHEM übertragen.
Zustände:
Alarmanlage deaktiviert : LED aus - Display aus
Alarmanlage aktiviert : LED blinkt - Display aus
Alarmanlage Scharfstellverzögerung: LED blinkt - Display blinkt
Alarmanlage Auslöseverzögerung : LED blinkt - Display blinkt
Blinken wird erkannt, wenn sich zwei aufeinanderfolgende Werte eines Fotowiderstands um einen bestimmten Wert unterscheiden.
Der Code:
/* Small sketch to determine the State of a Olympia Protect Alarmsystem
0. When UNARMED : LED off - DISPLAY off
1. When ARMED : LED blinks
2. When ACTIVATING: LED blinks - DISPLAY blinks (check if before State was ARMED)
3. When TRIGGERED : LED blinks - DISPLAY blinks (check if before State was ARMED)
*/
#include <MySensor.h>
#include <SPI.h>
#define CHILD_ID 3
MySensor gw;
MyMessage msg(CHILD_ID,V_TRIPPED);
const int phCell1Pin = 0; // Photocell 1 on PIN 0 - Display
const int phCell2Pin = 1; // Photocell 2 on PIN 1 - LED
const int phCell1Sensitivity = 100; // sets the minimum difference between two readings to determine blinking of Display
const int phCell2Sensitivity = 100; // sets the minimum difference between two readings to determine blinking of LED
long int sleepTime = 7000; // 7 Sec. between Reading Cycles
long int armingTime = 30; // milliSeconds set until arming is done
int DisplayState = 0;
int LEDState = 0;
int AlarmSystemState = 4; // (0 = Off, 1 = On, 2 = Activating, 3 = Triggered)
int AlarmSystemStateOld = 0;
int myRound1[10] = {0,0,0,0,0,0,0,0,0,0}; // Array to store Readings
int myRound2[10] = {0,0,0,0,0,0,0,0,0,0}; // Array to store Readings
int goSleep = 0;
int i = 0;
int i1 = 0;
int i2 = 0;
long int i3 = 0;
void setup(void) {
gw.begin();
gw.present(CHILD_ID, S_DOOR);
}
void loop(void) {
if (i < 10){ // 10 Readings
myRound1[i] = analogRead(phCell1Pin); // read Photosensor Display
//Serial.print("Display PhCell:"); Serial.println(myRound1[i]);
myRound2[i] = analogRead(phCell2Pin); // read Photosensor Display
//Serial.print("LED PhCell:"); Serial.println(myRound2[i]);
if (i > 0){ // compare 2 following readings
// Display
if ((myRound1[i] - myRound1[i-1]) > phCell1Sensitivity){i1++;}
if ((myRound1[i-1] - myRound1[i]) > phCell1Sensitivity){i1++;}
// LED
if ((myRound2[i] - myRound2[i-1]) > phCell2Sensitivity){i2++;}
if ((myRound2[i-1] - myRound2[i]) > phCell2Sensitivity){i2++;}
}
i++;
} else {
// Display
if (i1 > 2){ // if there are more than 3 Readings which are assumed blinks - set DisplayState to blink
DisplayState = 1; //Serial.println("Display blinkt - State 1");
} else {
DisplayState = 0; // Serial.println("Display dunkel - State 0");
}
//LED
if (i2 > 2){ // if there are more than 3 Readings which are assumed blinks - set LEDState to blink
LEDState = 1; //Serial.println("LED blinkt - State 1");
} else {
LEDState = 0; // Serial.println("LED dunkel - State 0");
}
goSleep = 1; // now transmit if necessary and wait before starting again
// Reset
i = 0;
i1 = 0;
i2 = 0;
int myRound1[10] = {0,0,0,0,0,0,0,0,0,0};
int myRound2[10] = {0,0,0,0,0,0,0,0,0,0};
}
// send to Sleep
if (goSleep == 1){
if (DisplayState == 0 && LEDState == 0){
AlarmSystemState = 0; // OFF
} else if (DisplayState == 0 && LEDState == 1){
AlarmSystemState = 1; // ON
} else if (DisplayState == 1 && LEDState == 1 && AlarmSystemStateOld == 0){
AlarmSystemState = 2; // Actviating
} else if (DisplayState == 1 && LEDState == 1 && AlarmSystemStateOld == 1){
AlarmSystemState = 3; // TRIGGERED
} else {
AlarmSystemState = AlarmSystemStateOld;
}
// Send State change to Gateway
Serial.print("AlarmSystemState Änderung:");Serial.println(AlarmSystemState);
gw.send(msg.set(AlarmSystemState));
if (AlarmSystemState == 2){ // Delay until Arming is done before next read
i3 = (armingTime * 1000) + 10000;
Serial.print("wait until activated: ");Serial.println(i3);
delay(i3);
i3 = 0;
}
AlarmSystemStateOld = AlarmSystemState;
delay(sleepTime);
goSleep = 0;
} else {
delay(575);
}
}
[/size]
Und so siehts aus: Nicht hübsch, aber wir sind ja noch in der Testphase
(http://www.services4u.de/forumfiles/Arduino-Olympia-Protect-Status.JPG)
- Die Fotowiderstände sind mit doppelseitigem Aufgeklebt
- auf das doppelseitige Klebeband wiederum Alufolie, damit das Licht nicht von Außen gelesen wird
- Strom kommt vom Netzteil der Alarmanlage
Das ist der Eintrag in der FHEM.cfg:
#------------------------------------------------------#
# Alarmanlage Status Gerät #
#------------------------------------------------------#
define OPStatusDevice MYSENSORS_DEVICE 101
attr OPStatusDevice IODev MSGateway
attr OPStatusDevice mapReading_tripped3 3 tripped 0:AUS tripped 1:AKTIV tripped 2:ACTIVATING tripped 3:AUSGELOEST
attr OPStatusDevice mode node
attr OPStatusDevice requestAck 1
attr OPStatusDevice version 1.4.1
#------------------------------------------------------#
# Alarmanlage Status Anzeiger #
#------------------------------------------------------#
define OP_Status dummy
attr OP_Status room Alarmanlage
attr OP_Status alias 1_Zustand
attr OP_Status setList AUS AKTIV ACTIVATING AUSGELOEST
attr OP_Status event-on-change-reading state
define OP_StatusNot0 notify OPStatusDevice:.*tripped3:.AUS set OP_Status AUS
define OP_StatusNot1 notify OPStatusDevice:.*tripped3:.AKTIV set OP_Status AKTIV
define OP_StatusNot2 notify OPStatusDevice:.*tripped3:.ACTIVATING set OP_Status ACTIVATING
define OP_StatusNot3 notify OPStatusDevice:.*tripped3:.AUSGELOEST set OP_Status AUSGELOEST
define Push_OP_Status0 notify OP_Status:.* set pushmsg msg 'Alarmanlage' '$EVENT'
Alles wie immer ohne Gewähr!
Viel Spaß
Moin,
glückwunsch. Das hätte ich mit meiner auch machen sollen, stattdessen habe ich mich an dem UART Anschluss (Unter der Batterieabdeckung) versucht und bin gescheitert. Die Basisstation arbeitet noch, aber das Display zeigt nach dem starten nichts mehr an :(
Seltsam das keiner den UART Anschluss bemerkt hat, steht sogar drauf das es einer ist. ???
Zitat von: murat23 am 23 Januar 2015, 15:51:57
...stattdessen habe ich mich an dem UART Anschluss (Unter der Batterieabdeckung) versucht und bin gescheitert. Die Basisstation arbeitet noch, aber das Display zeigt nach dem starten nichts mehr an :(
Seltsam das keiner den UART Anschluss bemerkt hat, steht sogar drauf das es einer ist. ???
Dein Beitrag motiviert jetzt aber auch nicht gerade diesen Anschluß zu testen ;-)