Re: I can't find the WifiSendAlert() function in the librari
Posted: Wed May 29, 2013 4:34 pm
30 seconds. It should only send after 30 seconds.
Community discussion about Reef Angel Controllers and reefing related subjects
http://forum.reefangel.com/
Lee,lnevo wrote:I do have an alert on my float switches and haven't had any false alerts at all. Quite the opposite...a few alerts i should have received i have not. I don't know if roberto put any time delay on the alert page or if our strings are using up too much of the serial buffer or not. It has been working well, but i wouldn't say 100% at this point.
Can you post your code so i can see how you implemented it. I can see if any hanging logic as well that may be screwing up.
Code: Select all
// ************ PLACE GLOBAL VARIABLE CODE BELOW HERE *******************
class WiFiAlert
{
public:
WiFiAlert();
void Send(char *message, char *key);
inline void Send(char *message) { Send(message,""); }
inline void SetDelay(int delay) { AlertDelay=delay; }
private:
int AlertDelay;
time_t LastAlert;
boolean IsAlert();
void WiFiSendAlert(char *message, char *key);
};
WiFiAlert::WiFiAlert()
{
AlertDelay=900;
LastAlert=0;
}
boolean WiFiAlert::IsAlert()
{
if (now()-LastAlert >= AlertDelay)
{
return true;
}
return false;
}
void WiFiAlert::Send(char *message, char *key)
{
if (IsAlert())
{
LastAlert=now();
WiFiSendAlert(message, key);
}
}
void WiFiAlert::WiFiSendAlert(char *message, char *key)
{
Serial.print("GET /status/wifialert.aspx?id=");
Serial.print(ReefAngel.portalusername);
Serial.print("&key=");
Serial.print(key);
Serial.print("&msg=");
Serial.println(message);
Serial.println("\n\n");
}
// Initialize Buzzer variables
byte buzzer=0;
byte overheatflag=0;
byte atoflag=0;
// Declare variables for Wifi Alert
static WiFiAlert sumpOverflowAlarm, tempAlarm;
static WiFiAlert atoEmptyAlarm;
void setup()
{
// Added buzzer 1-19-13
// Sound buzzer if any flag is set.
// Added 1-19-13 - Uncomment when I purchase the IO expansion module.
// buzzer = overheatflag + atoflag + iochannel0flag + iochannel1flag + iochannel2flag + iochannel3flag + iochannel4flag + iochannel5flag;
buzzer = overheatflag + atoflag;
if ( buzzer >= 1 ){
buzzer = InternalMemory.read(buzzer_volume); // Set value of buzzer volume.
} else {
ReefAngel.PWM.SetDaylight(0);
}
// Do not sound the buzzer for empty ATO reservior between 7:00 am and 10:00 pm.
if (!ReefAngel.LowATO.IsActive() && ( hour() >= 7 && hour() < 22)) {
ReefAngel.PWM.SetDaylight( buzzer );
atoEmptyAlarm.SetDelay(3600); // delay SMS text alert for 1 hour.
atoEmptyAlarm.Send("ATO_container_empty","xxxxxxxxxx");
} else {
ReefAngel.PWM.SetDaylight(0);
if (!ReefAngel.HighATO.IsActive()) {
ReefAngel.PWM.SetDaylight( buzzer );
sumpOverflowAlarm.SetDelay(300); // delay SMS alert for 5 minutes.
sumpOverflowAlarm.Send("Sump_WaterLevel_too_high","xxxxxxxxxx");
} else {
ReefAngel.PWM.SetDaylight(0);
}
}
They are both sending false alerts, but the ATO empty occurs every few minutes where the Sump overflow occurs every few hours. The buzzer works flawlessly and is triggered by the same float switches.lnevo wrote:So two things to check...is it just the ato empty alarm being flakey? Or both?
What is the IP the alert is coming from? I did have a false alarm early on but it was from someone or some bot clicking in this thread...i changed the url in the post and havent had any others..
We may need some logs from roberto to see if these hot queued up on his end or if he's getting valid alerts from your controller.
The code looks good at first glance.
Are you sure the empty is alarming every few minutes...the overflow is the one with the 5 minute delay...mudcat1 wrote:They are both sending false alerts, but the ATO empty occurs every few minutes where the Sump overflow occurs every few hours. The buzzer works flawlessly and is triggered by the same float switches.
Lee,lnevo wrote:Ok a few strange things i noticed.
One is you have all that code in setup() and not in loop()...not sure why that would make a difference, but something worth correcting, I had a block of code in setup and it was behaving completely different than what I'd expect.
Second you have your wifi alarm variables as globals and static which might cause it to behave strangely. Try taking off the static or leaving it but putting it inside setup or eventually to loop.
Yes, the ato empty alert was occurring more frequently than the sump overflow.lnevo wrote:Are you sure the empty is alarming every few minutes...the overflow is the one with the 5 minute delay...mudcat1 wrote:They are both sending false alerts, but the ATO empty occurs every few minutes where the Sump overflow occurs every few hours. The buzzer works flawlessly and is triggered by the same float switches.
The main thing I'm concerned about is your custom code should all be inside loop() not inside setup() which is what you showed. But the static thing is easy to fix.mudcat1 wrote:Lee,lnevo wrote:Ok a few strange things i noticed.
One is you have all that code in setup() and not in loop()...not sure why that would make a difference, but something worth correcting, I had a block of code in setup and it was behaving completely different than what I'd expect.
Second you have your wifi alarm variables as globals and static which might cause it to behave strangely. Try taking off the static or leaving it but putting it inside setup or eventually to loop.
I tried to make my code similar to yours, however, I was not sure how to use the #include statement as you did so I copied the wifialert() code immediately following the include statements. I added the static declaration because I saw it in your ino but I will remove it shortly.
Code: Select all
// ************ PLACE GLOBAL VARIABLE CODE BELOW HERE *******************
class WiFiAlert
{
public:
WiFiAlert();
void Send(char *message, char *key);
inline void Send(char *message) { Send(message,""); }
inline void SetDelay(int delay) { AlertDelay=delay; }
private:
int AlertDelay;
time_t LastAlert;
boolean IsAlert();
void WiFiSendAlert(char *message, char *key);
};
WiFiAlert::WiFiAlert()
{
AlertDelay=900;
LastAlert=0;
}
boolean WiFiAlert::IsAlert()
{
if (now()-LastAlert >= AlertDelay)
{
return true;
}
return false;
}
void WiFiAlert::Send(char *message, char *key)
{
if (IsAlert())
{
LastAlert=now();
WiFiSendAlert(message, key);
}
}
void WiFiAlert::WiFiSendAlert(char *message, char *key)
{
Serial.print("GET /status/wifialert.aspx?id=");
Serial.print(ReefAngel.portalusername);
Serial.print("&key=");
Serial.print(key);
Serial.print("&msg=");
Serial.println(message);
Serial.println("\n\n");
}
// Initialize Buzzer variables
byte buzzer=0;
byte overheatflag=0;
byte atoflag=0;
// Declare variables for Wifi Alert
WiFiAlert sumpOverflowAlarm, tempAlarm;
WiFiAlert atoEmptyAlarm;
void setup()
void loop()
{
// Added buzzer 1-19-13
// Sound buzzer if any flag is set.
// Added 1-19-13 - Uncomment when I purchase the IO expansion module.
// buzzer = overheatflag + atoflag + iochannel0flag + iochannel1flag + iochannel2flag + iochannel3flag + iochannel4flag + iochannel5flag;
buzzer = overheatflag + atoflag;
if ( buzzer >= 1 ){
buzzer = InternalMemory.read(buzzer_volume); // Set value of buzzer volume.
} else {
ReefAngel.PWM.SetDaylight(0);
}
// Do not sound the buzzer for empty ATO reservior between 7:00 am and 10:00 pm.
if (!ReefAngel.LowATO.IsActive() && ( hour() >= 7 && hour() < 22)) {
ReefAngel.PWM.SetDaylight( buzzer );
atoEmptyAlarm.SetDelay(3600); // delay SMS text alert for 1 hour.
atoEmptyAlarm.Send("ATO_container_empty","xxxxxxxxxx");
} else {
ReefAngel.PWM.SetDaylight(0);
if (!ReefAngel.HighATO.IsActive()) {
ReefAngel.PWM.SetDaylight( buzzer );
sumpOverflowAlarm.SetDelay(300); // delay SMS alert for 5 minutes.
sumpOverflowAlarm.Send("Sump_WaterLevel_too_high","xxxxxxxxxx");
} else {
ReefAngel.PWM.SetDaylight(0);
}
}
That would have to be modified in the server to accept GMT offset.mudcat1 wrote:Another thing that I noticed is that the time on the SMS text alert is incorrect. The text message that I receive says ...
"(Reef Angel - Alert) Reef Angel Controller AlertTime: 6/3/2013 5:46:46 PM IP Address: xxx.xxx.xxx.xxx ATO_container_empty"
The actual time is 7:46 PM. Is there a date setting that can be adjusted so that the time on the alert is correct?
Lee,lnevo wrote:That doesn't even make sense. Unless the float switch is getting triggered for a blip not enough to trigger the buzzer.
Can you add a Serial.println(buzzer); before the atoAlarm.Send(); and monitor for a bit through Serial Monitor?
Code: Select all
GET /status/submitp.aspx?t1=793&t2=739&t3=0&ph=1045&id=mudcat1&em=0&rem=0&key=xxxxxxxxxx&atohigh=1&atolow=1&r=49&ron=0&roff=255&pwma=45&pwmd=0&c0=160&c1=160&c2=50&c3=0&c4=50&c5=15&c6=45&c7=45
0
GET /status/wifialert.aspx?id=mudcat1&key=xxxxxxxxxx&msg=ATO_container_empty
0
0
Code: Select all
0
GET /status/wifialert.aspx?id=mudcat1&key=xxxxxxxxxx&msg=ATO_container_empty
0
0
Thanks Lee. I will try your suggestions.lnevo wrote:Actually you can see in the output the reason your buzzer is not going off is because the volume is 0.
However, your float is definitely getting triggered.... You can even see the Serial.print happen followed by the alarm.
You can then see subsequent triggering of the Serial.print followed by no alarm. It looks like the alert is working properly...What condition do you set the volume of the buzzer maybe you can add the additional checks in this block of code. You could even wrap the atoEmptyAlarm.Send() like this:Code: Select all
0 GET /status/wifialert.aspx?id=mudcat1&key=xxxxxxxxxx&msg=ATO_container_empty 0 0
if(buzzer > 0) atoEmptyAlarm.Send();
I think thats your best course of action..