Move daylight info code in to own file.

This commit is contained in:
Robert Marshall 2018-09-22 10:21:13 +01:00
parent c8431783f5
commit 4567adf91b
3 changed files with 86 additions and 57 deletions

54
NaturalLight.cpp Normal file
View file

@ -0,0 +1,54 @@
#include "NaturalLight.h"
#include <Arduino.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include <time.h>
NaturalLight::NaturalLight(char *lat, char *lon, int timezoneOffset) {
_timezoneOffset = timezoneOffset;
sprintf(_url, SOLAR_EVENT_URL, lat, lon);
}
String NaturalLight::getSolarEventJson() {
HTTPClient http;
http.begin(_url);
int httpCode = http.GET();
String result = "";
if (httpCode > 0)
result = http.getString();
http.end();
return result;
}
int NaturalLight::getEpoch(const char *str) {
struct tm time;
int year, month;
sscanf(str, "%d-%d-%dT%d:%d:%d+00:00", &year, &month, &time.tm_mday, &time.tm_hour, &time.tm_min, &time.tm_sec);
time.tm_year = year - 1900;
time.tm_mon = month - 1;
return mktime(&time);
}
int NaturalLight::adjustForTimezone(int epoch) {
return epoch + _timezoneOffset;
}
void NaturalLight::update() {
String json = getSolarEventJson();
StaticJsonBuffer<1024> jsonBuffer;
JsonObject &root = jsonBuffer.parseObject(json);
if (!root.success())
return;
const char *astronomicalTwilightBegin = root["results"]["astronomical_twilight_begin"];
const char *sunrise = root["results"]["sunrise"];
const char *sunset = root["results"]["sunset"];
const char *astronomicalTwilightEnd = root["results"]["astronomical_twilight_end"];
_astronomicalTwilightBegin = adjustForTimezone(getEpoch(astronomicalTwilightBegin));
_sunrise = adjustForTimezone(getEpoch(sunrise));
_sunset = adjustForTimezone(getEpoch(sunset));
_astronomicalTwilightEnd = adjustForTimezone(getEpoch(astronomicalTwilightEnd));
}

22
NaturalLight.h Normal file
View file

@ -0,0 +1,22 @@
#ifndef _DAYLIGHT_h
#define _DAYLIGHT_h
#include <Arduino.h>
#define SOLAR_EVENT_URL "http://api.sunrise-sunset.org/json?lat=%s&lng=%s&formatted=0"
class NaturalLight {
int _astronomicalTwilightBegin, _sunrise, _sunset, _astronomicalTwilightEnd, _timezoneOffset;
char _url[80];
String getSolarEventJson();
int getEpoch(const char *str);
int adjustForTimezone(int epoch);
public:
NaturalLight(char *lat, char *lon, int timezoneOffset);
void update();
int getAstronomicalTwilightBegin() { return _astronomicalTwilightBegin; }
int getSunrise() { return _sunrise; }
int getSunset() { return _sunset; }
int getAstronomicalTwilightEnd() { return _astronomicalTwilightEnd; }
};
#endif

View file

@ -1,11 +1,10 @@
#include <PubSubClient.h> #include <PubSubClient.h>
#include <ESP8266WiFi.h> #include <ESP8266WiFi.h>
#include <FastLED.h> #include <FastLED.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include <time.h> #include <time.h>
#include "sensors.h" #include "sensors.h"
#include "NaturalLight.h"
#define HOSTNAME "Fishtank" #define HOSTNAME "Fishtank"
#define MQTT_SERVER "192.168.1.3" #define MQTT_SERVER "192.168.1.3"
@ -17,8 +16,10 @@
#define TEMPERATURE_TOPIC "/home/sensors/fishtank/temperature" #define TEMPERATURE_TOPIC "/home/sensors/fishtank/temperature"
#define TEMPERATURE_PIN D5 #define TEMPERATURE_PIN D5
#define SOLAR_EVENT_URL "http://api.sunrise-sunset.org/json?lat=20.548103&lng=96.916835&formatted=0" #define LATITUDE "20.548103"
#define LONGITUDE "96.916835"
#define TIMEZONE_OFFSET 27000 // 7.5 hours in seconds #define TIMEZONE_OFFSET 27000 // 7.5 hours in seconds
#define NTP_POOL "uk.pool.ntp.org" #define NTP_POOL "uk.pool.ntp.org"
#define HEAT_INDEX_MAX 241.0 // After 241 the pallet seems to go dim #define HEAT_INDEX_MAX 241.0 // After 241 the pallet seems to go dim
@ -28,9 +29,9 @@ WiFiClient _wifiClient;
PubSubClient _mqttClient = PubSubClient(MQTT_SERVER, 1883, mqttCallback, _wifiClient); PubSubClient _mqttClient = PubSubClient(MQTT_SERVER, 1883, mqttCallback, _wifiClient);
Sensors _sensors = Sensors(TEMPERATURE_PIN, TEMPERATURE_TOPIC, PH_TOPIC, _mqttClient); Sensors _sensors = Sensors(TEMPERATURE_PIN, TEMPERATURE_TOPIC, PH_TOPIC, _mqttClient);
NaturalLight _naturalLight = NaturalLight(LATITUDE, LONGITUDE, TIMEZONE_OFFSET);
CRGB _leds[LED_COUNT]; CRGB _leds[LED_COUNT];
int _lightsOnStartTime, _lightsOnEndTime, _lightsOffStartTime, _lightsOffEndTime;
void waitForWiFi() { void waitForWiFi() {
@ -62,54 +63,6 @@ void reconnect() {
waitForMQTT(); waitForMQTT();
} }
String getSolarEventJson(){
waitForWiFi();
HTTPClient http;
http.begin(SOLAR_EVENT_URL);
int httpCode = http.GET();
String result = "";
if (httpCode > 0)
result = http.getString();
http.end();
return result;
}
int getEpoch(const char *str) {
struct tm time;
int year, month;
sscanf(str, "%d-%d-%dT%d:%d:%d+00:00", &year, &month, &time.tm_mday, &time.tm_hour, &time.tm_min, &time.tm_sec);
time.tm_year = year - 1900;
time.tm_mon = month - 1;
return mktime(&time);
}
int adjustForTimezone(int epoch){
return epoch + TIMEZONE_OFFSET;
}
void parseEvents(){
String json = getSolarEventJson();
StaticJsonBuffer<1024> jsonBuffer;
JsonObject &root = jsonBuffer.parseObject(json);
if (!root.success()) {
Serial.println("Could not parse json");
return;
}
const char *astronomicalTwilightBegin = root["results"]["astronomical_twilight_begin"];
const char *sunrise = root["results"]["sunrise"];
const char *sunset = root["results"]["sunset"];
const char *astronomicalTwilightEnd = root["results"]["astronomical_twilight_end"];
_lightsOnStartTime = adjustForTimezone(getEpoch(astronomicalTwilightBegin));
_lightsOnEndTime = adjustForTimezone(getEpoch(sunrise));
_lightsOffStartTime = adjustForTimezone(getEpoch(sunset));
_lightsOffEndTime = adjustForTimezone(getEpoch(astronomicalTwilightEnd));
}
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
@ -122,7 +75,7 @@ void setup() {
delay(2000); delay(2000);
configTime(0, 0, NTP_POOL); configTime(0, 0, NTP_POOL);
parseEvents(); _naturalLight.update();
FastLED.addLeds<WS2811, LIGHT_PIN, GRB>(_leds, LED_COUNT).setCorrection(TypicalSMD5050).setTemperature(Tungsten40W); FastLED.addLeds<WS2811, LIGHT_PIN, GRB>(_leds, LED_COUNT).setCorrection(TypicalSMD5050).setTemperature(Tungsten40W);
} }
@ -136,7 +89,9 @@ float getIndexMultiplier(int now, int startTime, int endTime, bool swap){
float getHeatIndex() { float getHeatIndex() {
time_t now = time(nullptr); time_t now = time(nullptr);
float indexMultiplier = now >= _lightsOffStartTime ? getIndexMultiplier(now, _lightsOffStartTime, _lightsOffEndTime, true) : getIndexMultiplier(now, _lightsOnStartTime, _lightsOnEndTime, false); float indexMultiplier = now >= _naturalLight.getAstronomicalTwilightEnd() ?
getIndexMultiplier(now, _naturalLight.getSunset(), _naturalLight.getAstronomicalTwilightEnd(), true) :
getIndexMultiplier(now, _naturalLight.getAstronomicalTwilightBegin(), _naturalLight.getSunrise(), false);
return HEAT_INDEX_MAX * indexMultiplier; return HEAT_INDEX_MAX * indexMultiplier;
} }
@ -148,7 +103,7 @@ void doLighting() {
} }
EVERY_N_SECONDS(10800){ EVERY_N_SECONDS(10800){
parseEvents(); _naturalLight.update();
} }
} }
@ -181,8 +136,6 @@ void loop() {
void mqttCallback(char *topic, byte *payload, unsigned int length) { void mqttCallback(char *topic, byte *payload, unsigned int length) {
Serial.print("Got payload: "); Serial.print("Got payload: ");
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
{
Serial.print((char)payload[i]); Serial.print((char)payload[i]);
}
Serial.println(); Serial.println();
} }