Post or Get to URL

Do you have a question on how to do something.
Ask in here.
Post Reply
JoelIreland
Posts: 58
Joined: Sat Jan 26, 2013 1:27 am

Post or Get to URL

Post by JoelIreland »

I am a web developer and would like to post alerts to an external URL to handle. As the ones included are limited.
Is there a away i can incorporate this with my current code?

#include <Salinity.h>
#include <ReefAngel_Features.h>
#include <Globals.h>
#include <RA_Wifi.h>
#include <Wire.h>
#include <OneWire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <InternalEEPROM.h>
#include <RA_NokiaLCD.h>
#include <RA_ATO.h>
#include <RA_Joystick.h>
#include <LED.h>
#include <RA_TempSensor.h>
#include <Relay.h>
#include <RA_PWM.h>
#include <Timer.h>
#include <Memory.h>
#include <InternalEEPROM.h>
#include <RA_Colors.h>
#include <RA_CustomColors.h>
#include <Salinity.h>
#include <RF.h>
#include <IO.h>
#include <ORP.h>
#include <AI.h>
#include <PH.h>
#include <WaterLevel.h>
#include <ReefAngel.h>

////// Place global variable code below here

//// Relay 1
#define CHILLER Port1 /// Hailea Chiller 1/2 HP
#define HEATER Port2 /// Backup heater
#define RETURN_PUMP Port3 /// Return Pump
#define CHILLER_PUMP Port4 /// Pump for chiller and UV
#define SKIMMER Port5 /// Protien Skimmer
#define REAR_PUMPS_1 Port6 /// Rear Pumps 1 & 2
#define REAR_PUMPS_2 Port7 /// Dosing Pump 1
#define DOSING_PUMP_1 Port8 /// Dosing Pump 1
//// Relay 2
#define FRONT_LIGHTS Box1_Port1 /// Front t5s (4 X 100W)
#define REAR_LIGHTS Box1_Port2 /// Rear t5s (4 X 100W)
#define MIDDLE_LIGHTS Box1_Port3 /// Rear t5s (2 X 100)
#define MOON_LIGHTS Box1_Port4 /// Moon Lights (LED)
#define SUMP_LIGHTS Box1_Port5 /// Sump Lights (LED)
#define SALINITY_POWER Box1_Port7 /// Power to Salinity Module
#define ORP_POWER Box1_Port8 /// Power to ORP Module

#define TANK_TEMPRATURE ReefAngel.Params.Temp[T1_PROBE] /// tank temprature

/// outlet styles & colors
#define OutletBorderColor COLOR_ROYALBLUE /// Relay Border
#define OutletOnBGColor COLOR_WHITE /// Relay On
#define OutletOnFGColor COLOR_ROYALBLUE /// Relay Text Color
#define OutletOffBGColor COLOR_ROYALBLUE /// Relay Off0x4F
#define OutletOffFGColor COLOR_WHITE /// Relay Text Color 0xFF

#define YES 1 //// YES
#define NO 0 //// NO


/// error count & logs
int errorCount = 0;
int lowATO = NO;
int highATO = NO;
int highATOAlert = NO;
int powerFailure = NO;
int powerFailureCount = 0;
int powerFailureCountStarted = NO;
int noPowerAlert = NO;
int lowROWater = NO;
int highTemp = NO;
int lowTemp = NO;
int lowTempAlert = NO;
int highTempAlert = NO;
int phOut = NO;
int phAlert = NO;
byte lastMinute = 0;

void setup(){

ReefAngel.Init(); /// Initialize controller
ReefAngel.SetTemperatureUnit( Celsius ); /// set Temp to Celcius

/// Toggled Ports
ReefAngel.LightsOnPorts = FRONT_LIGHTS | REAR_LIGHTS;

ReefAngel.FeedingModePorts = RETURN_PUMP | REAR_PUMPS_1 | REAR_PUMPS_2 | CHILLER | CHILLER_PUMP | SKIMMER;

ReefAngel.WaterChangePorts = RETURN_PUMP | REAR_PUMPS_1 | REAR_PUMPS_2 | CHILLER | CHILLER_PUMP | SKIMMER | FRONT_LIGHTS;

ReefAngel.OverheatProbe = T1_PROBE;
ReefAngel.OverheatShutoffPorts = HEATER | FRONT_LIGHTS | REAR_LIGHTS | MIDDLE_LIGHTS;
/// Immediate Start ( delayed starts in loop )




ReefAngel.Relay.On(REAR_PUMPS_1);
ReefAngel.Relay.On(REAR_PUMPS_2);

if(powerFailure == NO){

ReefAngel.Relay.On(SUMP_LIGHTS);
ReefAngel.Relay.On(SALINITY_POWER);
ReefAngel.Relay.On(ORP_POWER);

}
}

void DrawCustomMain(){

char text[7];
byte x = 6;
byte y = 2;
byte t;

//ReefAngel.LCD.DrawDate(COLOR_WHITE,COLOR_BLACK,6, 2);
ReefAngel.LCD.DrawText(COLOR_WHITE,COLOR_ROYALBLUE,0,1," RED SEA MAX S 650 ");
ReefAngel.LCD.DrawText(COLOR_ROYALBLUE,COLOR_WHITE,4,13,"Tank: Sump:");
ConvertNumToString(text, ReefAngel.Params.Temp[T1_PROBE], 10);
ReefAngel.LCD.DrawText(COLOR_MIDNIGHTBLUE, COLOR_WHITE, 35, 13, text);

if(ReefAngel.Params.Temp[T1_PROBE]>=260 || ReefAngel.Params.Temp[T2_PROBE]>=260)
highTemp = YES;
else
highTemp = NO;

ConvertNumToString(text, ReefAngel.Params.Temp[T2_PROBE], 10);
ReefAngel.LCD.DrawText(COLOR_MIDNIGHTBLUE, COLOR_WHITE, 101, 13, text);


//ReefAngel.LCD.Clear(DefaultFGColor, 0, 23, 128, 23);

pingSerial();

if(highTemp==NO && (ReefAngel.Params.Temp[T1_PROBE] <230 || ReefAngel.Params.Temp[T2_PROBE]<230))
ReefAngel.Relay.On(HEATER);
if(ReefAngel.Params.Temp[T1_PROBE] <210 || ReefAngel.Params.Temp[T2_PROBE]<210)
lowTemp = YES;
else
lowTemp = NO;

/// top relay styles - bring to edge
ReefAngel.LCD.Clear(COLOR_ROYALBLUE, 0, 25, 25, 25);
ReefAngel.LCD.Clear(COLOR_ROYALBLUE, 0, 26, 12, 36);
ReefAngel.LCD.Clear(COLOR_ROYALBLUE, 0, 37, 25, 37);

ReefAngel.LCD.Clear(COLOR_ROYALBLUE, 114, 25, 130, 25);
ReefAngel.LCD.Clear(COLOR_ROYALBLUE, 117, 26, 130, 36);
ReefAngel.LCD.Clear(COLOR_ROYALBLUE, 114, 37, 130, 37);

/// relay 1 - 8
byte TempRelay = ReefAngel.Relay.RelayData;
TempRelay &= ReefAngel.Relay.RelayMaskOff;
TempRelay |= ReefAngel.Relay.RelayMaskOn;
ReefAngel.LCD.DrawOutletBox(12, 25, TempRelay);

/// bottom relay styles - bring to edge
ReefAngel.LCD.Clear(COLOR_ROYALBLUE, 0, 38, 12, 48);
ReefAngel.LCD.Clear(COLOR_ROYALBLUE, 0, 49, 12, 49);

ReefAngel.LCD.Clear(COLOR_ROYALBLUE, 117, 38, 130, 48);
ReefAngel.LCD.Clear(COLOR_ROYALBLUE, 114, 49, 130, 49);

/// relay 9 - 16
TempRelay = ReefAngel.Relay.RelayDataE[0];
TempRelay &= ReefAngel.Relay.RelayMaskOffE[0];
TempRelay |= ReefAngel.Relay.RelayMaskOnE[0];
ReefAngel.LCD.DrawOutletBox(12, 37, TempRelay);
pingSerial();


/// set high low
//ReefAngel.LCD.Clear(COLOR_GREEN, 0, 60, 25, 85);
ReefAngel.LCD.DrawLargeText(COLOR_ROYALBLUE,COLOR_WHITE,20,64,"LOW", Font8x16);
ReefAngel.LCD.DrawLargeText(COLOR_ROYALBLUE,COLOR_WHITE,85,64,"HIGH", Font8x16);

/// seperator before water level & pH
ReefAngel.LCD.Clear(COLOR_ROYALBLUE, 0, 76, 130, 77);
ReefAngel.LCD.DrawText(COLOR_ROYALBLUE,COLOR_WHITE,10,80,"pH:");
ConvertNumToString(text, ReefAngel.Params.PH, 100);
ReefAngel.LCD.DrawLargeText(COLOR_BLACK, COLOR_WHITE, 31, 80, text, Num8x16);
pingSerial();

ReefAngel.LCD.DrawText(COLOR_ROYALBLUE,COLOR_WHITE,70,80,"ATO:");
ConvertNumToString(text, ReefAngel.WaterLevel.GetLevel() , 1);
strcat(text,"% ");
ReefAngel.LCD.DrawLargeText(COLOR_BLACK,COLOR_WHITE,95,80, text);
pingSerial();

ReefAngel.LCD.Clear(COLOR_ROYALBLUE, 0, 90, 130, 91);
ReefAngel.LCD.DrawText(COLOR_ROYALBLUE,COLOR_WHITE,6,96,"Sal:");
ConvertNumToString(text, ReefAngel.Params.Salinity, 10);
ReefAngel.LCD.DrawLargeText(COLOR_BLACK,COLOR_WHITE,31,96, text);
pingSerial();

ReefAngel.LCD.DrawText(COLOR_ROYALBLUE,COLOR_WHITE,70,96,"ORP:");
ConvertNumToString(text, ReefAngel.Params.ORP, 1);
ReefAngel.LCD.DrawLargeText(COLOR_BLACK,COLOR_WHITE,95,96, text);
pingSerial();

//ReefAngel.LCD.Clear(COLOR_ROYALBLUE, 0, 107, 128, 122);

if(hour()>=18 && hour()<22){

ReefAngel.LCD.Clear(COLOR_DEEPSKYBLUE,0, 107, 130, 121);
ReefAngel.LCD.DrawLargeText(COLOR_WHITE,COLOR_DEEPSKYBLUE,0,110, " Moon Mode ");

}
else if(hour()>=23 || (hour()>=0 && hour()<8)){

ReefAngel.LCD.Clear(COLOR_BLACK,0, 107, 130, 121);
ReefAngel.LCD.DrawLargeText(COLOR_WHITE,COLOR_BLACK,0,110, " Night Mode ");

}
else if(hour()>=8 && hour()<18){

ReefAngel.LCD.Clear(COLOR_YELLOW,0, 107, 130, 121);
ReefAngel.LCD.DrawLargeText(COLOR_BLACK,COLOR_YELLOW,0,110, " Day Mode ");

}

ReefAngel.LCD.DrawDate(6, 123);
}

void DrawCustomGraph(){
}
void loop(){


if (ReefAngel.Joystick.IsButtonPressed())
{
WifiSendAlert(1);
}



/// lighting if no errors
if(powerFailure == NO){

// remove ReefAngel.DosingPumpRepeat(DOSING_PUMP_1,0,1,15);

ReefAngel.StandardLights(MIDDLE_LIGHTS,8,30,19,30);

ReefAngel.StandardLights(REAR_LIGHTS,9,00,19,30);

ReefAngel.StandardLights(FRONT_LIGHTS,10,00,18,30);

ReefAngel.StandardLights(MOON_LIGHTS,19,00,23,00);


}

/* remove if(highATO + lowATO + powerFailure <1){ */

/// Default LEDS to 0 - useed for error reporting and system status

ReefAngel.PWM.SetDaylight(0);
ReefAngel.PWM.SetActinic(0);

/// Delayed Starts

/// 1 Minute
ReefAngel.Relay.DelayedOn (SKIMMER,1);
ReefAngel.Relay.DelayedOn (RETURN_PUMP,1);


/// 2 Minute
ReefAngel.Relay.DelayedOn(CHILLER,2);
ReefAngel.Relay.DelayedOn(CHILLER_PUMP,2);

// remove }


/// Check for errors
/// Check Sump Levels
/* remove if (!ReefAngel.LowATO.IsActive() || !ReefAngel.HighATO.IsActive()){

if(!ReefAngel.LowATO.IsActive()){

lowATO = YES;
ReefAngel.LCD.FillCircle(72,67,6,COLOR_RED);

}
else{

lowATO = NO;
ReefAngel.LCD.FillCircle(72,67,6,COLOR_GREEN);

}
if(!ReefAngel.HighATO.IsActive()){

highATO = YES;
ReefAngel.LCD.FillCircle(55,67,6,COLOR_RED);

}
else{

highATO = NO;
ReefAngel.LCD.FillCircle(55,67,6,COLOR_GREEN);
}

}
else{
remove */
lowATO = NO;
highATO = NO;
ReefAngel.LCD.FillCircle(55,67,6,COLOR_GREEN);
ReefAngel.LCD.FillCircle(72,67,6,COLOR_GREEN);
//remove }
pingSerial();
if (!ReefAngel.Relay.IsRelayPresent(EXP1_RELAY)){

powerFailure = YES;


}
else{

powerFailure = NO;

}
if(ReefAngel.WaterLevel.GetLevel()<20)
lowROWater = YES;

else
lowROWater = NO;

pingSerial();

checkForErrors();
//// End Code
ReefAngel.Portal( "" ,"");
ReefAngel.ShowInterface();

}
void checkForErrors(){
errorCount = 0;
/// see if any errors have been logged

/// first check sump levels
if(lowATO+highATO>0){


if(lowATO==YES){
//char text2[7];
//ConvertNumToString(text2, lastMinute,1);
ReefAngel.LCD.DrawLargeText(COLOR_WHITE,COLOR_RED,0,50," LOW SUMP LEVEL ", Font8x16);//
errorCount++;
//ReefAngel.PWM.SetDaylight(ErrorPulse(0, 100, 120, false));
//checkLastMin(lastMinute, 1);
}
if(highATO==YES){
errorCount++;
ReefAngel.LCD.DrawLargeText(COLOR_WHITE,COLOR_RED,0,50," HIGH SUMP LEVEL ", Font8x16);
ReefAngel.PWM.SetDaylight(ErrorPulse(0, 60, 5, false));
}

ReefAngel.PWM.SetActinic(ErrorPulse(0, 100, 5, false));
pingSerial();

}
else if(lowROWater == YES){
errorCount++;
//ReefAngel.PWM.SetDaylight(ErrorPulse(0, 100, 120, false));
ReefAngel.PWM.SetActinic(100);
}

/// check tempreature levels

if(highTemp==YES){
errorCount++;
ReefAngel.LCD.DrawLargeText(COLOR_WHITE,COLOR_RED,0,50," HIGH TEMPRATURE ", Font8x16);
ReefAngel.PWM.SetDaylight(ErrorPulse(0, 60, 5, false));
ReefAngel.Relay.Off(FRONT_LIGHTS);
ReefAngel.Relay.Off(REAR_LIGHTS);
ReefAngel.Relay.Off(MIDDLE_LIGHTS);
if(highTempAlert==NO){
WifiSendAlert(2);
highTempAlert = YES;
}
pingSerial();
}

if(lowTemp==YES){
errorCount++;
ReefAngel.LCD.DrawLargeText(COLOR_WHITE,COLOR_RED,0,50," LOW TEMPRATURE ", Font8x16);
ReefAngel.PWM.SetDaylight(ErrorPulse(0, 60, 5, false));
ReefAngel.Relay.Off(CHILLER);
ReefAngel.Relay.On(HEATER);
ReefAngel.Relay.On(FRONT_LIGHTS);
ReefAngel.Relay.On(REAR_LIGHTS);
ReefAngel.Relay.On(MIDDLE_LIGHTS);

if(lowTempAlert==NO)
WifiSendAlert(3);
lowTempAlert = YES;
}
if(lowTemp==NO && highTemp==NO){
lowTempAlert = NO;
highTempAlert = NO;
}
if(ReefAngel.Params.PH > 830 || ReefAngel.Params.PH < 795){

ReefAngel.LCD.DrawLargeText(COLOR_WHITE,COLOR_RED,0,50," CHECK pH ", Font8x16);
ReefAngel.PWM.SetDaylight(ErrorPulse(0, 60, 5, false));
if(phAlert==NO){
if(ReefAngel.Params.PH > 830)
WifiSendAlert(5);
else
WifiSendAlert(6);
phAlert = YES;
}

errorCount++;


}
else
phAlert = NO;
/// check for power failure
if(powerFailure==YES){
errorCount++;
if(powerFailureCountStarted==NO){


powerFailureCountStarted = YES;

}

powerFailureCount = powerFailureCount + 1;

/// if no power what to do

/// immediately kill
ReefAngel.Relay.Off(SUMP_LIGHTS);
ReefAngel.Relay.Off(SALINITY_POWER);
ReefAngel.Relay.Off(ORP_POWER);
ReefAngel.Relay.Off(FRONT_LIGHTS);
ReefAngel.Relay.Off(REAR_LIGHTS);
ReefAngel.Relay.Off(MIDDLE_LIGHTS);

if(powerFailureCount > 1800){
ReefAngel.Relay.Off (SKIMMER); /// kill skimmer after 3 minutes
ReefAngel.Relay.Off (SUMP_LIGHTS); /// kill sump lights after 3 minutes


}

if(powerFailureCount > 3000) {
if(TANK_TEMPRATURE <26.6){
ReefAngel.Relay.Off (CHILLER); /// kill chiller after 5 minutes
ReefAngel.Relay.Off (CHILLER_PUMP); /// kill chiller pump after 5 minutes
ReefAngel.Relay.Off (RETURN_PUMP); /// kill return pump after 5 minutes
}
else{
ReefAngel.Relay.On (CHILLER); /// kill chiller after 5 minutes
ReefAngel.Relay.On (CHILLER_PUMP); /// kill chiller pump after 5 minutes
ReefAngel.Relay.On (RETURN_PUMP); /// kill return pump after 5 minutes

}
ReefAngel.Relay.Off(REAR_PUMPS_2); /// kill rear pumps
}

/*f(powerFailureCount > 3000 && TANK_TEMPRATURE >26.6){ //// if ten minutes pass or water gets too warm.
ReefAngel.Relay.On (CHILLER); /// turn back on
ReefAngel.Relay.On (CHILLER_PUMP); /// turn back on

}*/

ReefAngel.PWM.SetDaylight(ErrorPulse(10, 60, 1, false));
ReefAngel.PWM.SetActinic(ErrorPulse(0, 100, 1, false));

/// No power countdown
char text[40] = " NO POWER: ";
char text2[7];
ConvertNumToString(text2, powerFailureCount,10);


strcat(text, text2);
strcat(text, " ");
ReefAngel.LCD.DrawLargeText(COLOR_WHITE,COLOR_RED,0,50,text, Font8x16);
//ReefAngel.LCD.DrawLargeText(COLOR_WHITE,COLOR_RED,0,50," POWER OUTAFGE ", Font8x16);

}

else if(errorCount==0){

powerFailureCountStarted = NO;


ReefAngel.LCD.DrawLargeText(COLOR_WHITE,COLOR_GREEN,0,50," STATUS OK ", Font8x16);
ReefAngel.PWM.SetActinic(0);
ReefAngel.PWM.SetDaylight(0);
}


}
byte ErrorPulse(byte MinPulse, byte MaxPulse, int PulseDuration, boolean PulseSync)
{
byte tspeed=0;
MinPulse=constrain(MinPulse,0,100);
MaxPulse=constrain(MaxPulse,0,100);
tspeed=(now()%(PulseDuration*2)<PulseDuration?MinPulse:MaxPulse);
if (PulseSync)
return tspeed;
else
return (tspeed==MinPulse)?MaxPulse:MinPulse;
}
byte checkLastMin(byte lastMinute, byte minutesToWait){


if(lastMinute == 0)
lastMinute = minute() ;
if(minute()-lastMinute == minutesToWait){
ReefAngel.PWM.SetDaylight(ErrorPulse(0, 60, 2, false));

if(lastMinute != minute())
lastMinute = minute() ;
}


}
void WifiSendAlert(byte id)
{
Serial.print("GET /status/alert.asp?e=emailAdd&id=");

Serial.print(id,DEC);
Serial.println("\n\n");
}
rimai
Posts: 12857
Joined: Fri Mar 18, 2011 6:47 pm

Re: Post or Get to URL

Post by rimai »

There is an implementation that we are trying to get done that would allow for better alerts:
http://forum.reefangel.com/viewtopic.php?f=9&t=3197
If that doesn't work for you, the solution is to change the wifi attachment to point to your server. The wifi attachment is a single host module, which means it can only send data to a single host.
It is configure to send data to the Portal server by default.
Roberto.
User avatar
lnevo
Posts: 5422
Joined: Fri Jul 20, 2012 9:42 am

Re: Post or Get to URL

Post by lnevo »

Take a look at this post specifically http://forum.reefangel.com/viewtopic.php?p=26719#p26719 for the latest code...still in development, but the wifialert.aspx file is working great. Just have to work out the details on the code implementation and submit it to the libraries.
Post Reply