OTGW-firmware/OTGW-firmware.h

207 lines
8.2 KiB
C
Raw Normal View History

2020-10-25 20:48:57 +01:00
/*
***************************************************************************
** Program : OTGW-firmware.h
** Version : v0.10.3
2020-10-25 20:48:57 +01:00
**
2023-01-08 16:14:41 +01:00
** Copyright (c) 2021-2023 Robert van den Breemen
2020-10-25 20:48:57 +01:00
**
** TERMS OF USE: MIT License. See bottom of file.
***************************************************************************
*/
#include <Arduino.h>
#include <AceTime.h>
// #include <TimeLib.h>
2021-10-19 20:52:13 +02:00
#include <TelnetStream.h> // https://github.com/jandrassy/TelnetStream/commit/1294a9ee5cc9b1f7e51005091e351d60c8cddecf
#include <ArduinoJson.h> // https://arduinojson.org/
#include "Wire.h"
#include "safeTimers.h"
#include "src/libraries/OTGWSerial/OTGWSerial.h" // Bron Schelte's Serial class - it upgrades and more
2021-01-30 18:35:11 +01:00
#include "OTGW-Core.h" // Core code for this firmware
#include <OneWire.h> // required for Dallas sensor library
#include <DallasTemperature.h> // Miles Burton's - Arduino Dallas library
//OTGW Nodoshop hardware definitions
#define I2CSCL D1
#define I2CSDA D2
#define BUTTON D3
#define PICRST D5
#define LED1 D4
#define LED2 D0
2021-02-14 19:26:37 +01:00
#define PICFIRMWARE "/gateway.hex"
OTGWSerial OTGWSerial(PICRST, LED2);
void fwupgradestart(const char *hexfile);
void blinkLEDnow();
void blinkLEDnow(uint8_t);
void setLed(int8_t, uint8_t);
//Defaults and macro definitions
2021-01-30 16:00:16 +01:00
#define _HOSTNAME "OTGW"
#define SETTINGS_FILE "/settings.ini"
2021-09-15 21:36:08 +02:00
#define NTP_DEFAULT_TIMEZONE "Europe/Amsterdam"
#define NTP_HOST_DEFAULT "pool.ntp.org"
#define NTP_RESYNC_TIME 1800 //seconds = every 30 minutes
#define HOME_ASSISTANT_DISCOVERY_PREFIX "homeassistant" // Home Assistant discovery prefix
2020-12-29 14:13:29 +01:00
#define CMSG_SIZE 512
#define JSON_BUFF_MAX 1024
2020-12-29 14:13:29 +01:00
#define CSTR(x) x.c_str()
2022-05-28 09:11:39 +02:00
#define CONLINEOFFLINE(x) (x?"online":"offline")
2021-02-27 13:33:30 +01:00
#define CBOOLEAN(x) (x?"true":"false")
2021-01-03 23:12:19 +01:00
#define CONOFF(x) (x?"On":"Off")
2022-01-08 11:43:03 +01:00
#define CCONOFF(x) (x?"ON":"OFF")
2021-01-31 23:43:52 +01:00
#define CBINARY(x) (x?"1":"0")
2022-01-04 23:59:05 +01:00
#define EVALBOOLEAN(x) (strcasecmp(x,"true")==0||strcasecmp(x,"on")==0||strcasecmp(x,"1")==0)
#define ETX ((uint8_t)0x04)
2021-10-23 21:18:41 +02:00
2021-03-08 02:38:24 +01:00
//prototype
void sendMQTTData(const String, const String, const bool);
void sendMQTTData(const char*, const char*, const bool);
void addOTWGcmdtoqueue(const char* , int , const bool = false, const int16_t = 1000);
//Global variables
2020-10-25 22:56:18 +01:00
WiFiClient wifiClient;
2020-10-25 23:25:49 +01:00
char cMsg[CMSG_SIZE];
char fChar[10];
2021-02-19 01:48:31 +01:00
String lastReset = "";
uint32_t upTimeSeconds = 0;
2021-01-31 23:43:52 +01:00
uint32_t rebootCount = 0;
2021-02-19 01:48:31 +01:00
String sMessage = "";
uint32_t MQTTautoConfigMap[8] = { 0 };
//Use acetime
using namespace ace_time;
//static BasicZoneProcessor timeProcessor;
//static const int CACHE_SIZE = 3;
// static BasicZoneManager<CACHE_SIZE> manager(zonedb::kZoneRegistrySize, zonedb::kZoneRegistry);
//static BasicZoneProcessorCache<CACHE_SIZE> zoneProcessorCache;
//static BasicZoneManager timezoneManager(zonedb::kZoneAndLinkRegistrySize, zonedb::kZoneAndLinkRegistry, zoneProcessorCache);
static ExtendedZoneProcessor tzProcessor;
static const int CACHE_SIZE = 3;
static ExtendedZoneProcessorCache<CACHE_SIZE> zoneProcessorCache;
static ExtendedZoneManager timezoneManager(
zonedbx::kZoneAndLinkRegistrySize,
zonedbx::kZoneAndLinkRegistry,
zoneProcessorCache);
const char *weekDayName[] { "Unknown", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Unknown" };
const char *flashMode[] { "QIO", "QOUT", "DIO", "DOUT", "Unknown" };
2021-01-31 23:43:52 +01:00
//Information on OTGW
String sPICfwversion = "no pic found";
String sPICdeviceid = "no pic found";
String sPICtype = "no pic found";
bool bPICavailable = false;
String errorupgrade = "";
bool bOTGWonline = true;
bool bOTGWboilerstate = false;
bool bOTGWthermostatstate = false;
2022-01-04 21:22:49 +01:00
bool bOTGWgatewaystate = false;
bool bPSmode = false; //default to PS=0 mode
2022-05-28 10:31:04 +02:00
bool bCheckOTGWPICupdate = true;
2021-02-19 01:48:31 +01:00
2020-12-29 14:13:29 +01:00
//All things that are settings
String settingHostname = _HOSTNAME;
2021-02-19 01:48:31 +01:00
2020-10-25 22:56:18 +01:00
//MQTT settings
2021-02-08 01:00:21 +01:00
bool statusMQTTconnection = false;
2021-03-24 21:12:58 +01:00
bool settingMQTTenable = true;
2021-01-31 23:43:52 +01:00
bool settingMQTTsecure = false;
String settingMQTTbroker= "homeassistant.local";
int16_t settingMQTTbrokerPort = 1883;
2020-10-25 22:56:18 +01:00
String settingMQTTuser = "";
String settingMQTTpasswd = "";
2021-03-06 18:36:14 +01:00
String settingMQTThaprefix = HOME_ASSISTANT_DISCOVERY_PREFIX;
2022-01-16 10:56:39 +01:00
bool settingMQTTharebootdetection = true;
String settingMQTTtopTopic = "OTGW";
2021-03-27 14:21:36 +01:00
String settingMQTTuniqueid = ""; // Intialized in readsettings
2021-03-09 00:45:45 +01:00
bool settingMQTTOTmessage = false;
2021-03-06 10:38:44 +01:00
bool settingNTPenable = true;
2021-09-15 21:36:08 +02:00
String settingNTPtimezone = NTP_DEFAULT_TIMEZONE;
String settingNTPhostname = NTP_HOST_DEFAULT;
2021-02-21 14:12:51 +01:00
bool settingLEDblink = true;
2020-10-25 22:56:18 +01:00
// GPIO Sensor Settings
bool settingGPIOSENSORSenabled = false;
int8_t settingGPIOSENSORSpin = 13; // GPIO 13 = D7, GPIO 10 = SDIO 3
int16_t settingGPIOSENSORSinterval = 20; // Interval time to read out temp and send to MQ
byte OTGWdallasdataid = 246; // foney dataid to be used to do autoconfigure for temp sensors
int DallasrealDeviceCount = 0; // Total temperature devices found on the bus
#define MAXDALLASDEVICES 16 // maximum number of devices on the bus
// Define structure to store temperature device addresses found on bus with their latest tempC value
struct
{
int id;
DeviceAddress addr;
float tempC;
time_t lasttime;
} DallasrealDevice[MAXDALLASDEVICES];
// prototype to allow use in restAPI.ino
char* getDallasAddress(DeviceAddress deviceAddress);
// S0 Counter Settings and variables with global scope
bool settingS0COUNTERenabled = false;
uint8_t settingS0COUNTERpin = 12; // GPIO 12 = D6, preferred, can be any pin with Interupt support
uint16_t settingS0COUNTERdebouncetime = 80; // Depending on S0 switch a debouncetime should be tailored
uint16_t settingS0COUNTERpulsekw = 1000; // Most S0 counters have 1000 pulses per kW, but this can be different
uint16_t settingS0COUNTERinterval = 60; // Sugggested measurement reporting interval
uint16_t OTGWs0pulseCount; // Number of S0 pulses in measurement interval
uint32_t OTGWs0pulseCountTot = 0; // Number of S0 pulses since start of measurement
2023-01-26 21:52:05 +01:00
float OTGWs0powerkw = 0.0f ; // Calculated kW actual consumption based on time between last pulses and settings
time_t OTGWs0lasttime = 0; // Last time S0 counters have been read
byte OTGWs0dataid = 245; // foney dataid to be used to do autoconfigure for counter
//boot commands
2021-03-14 23:05:56 +01:00
bool settingOTGWcommandenable = false;
2021-03-24 21:12:58 +01:00
String settingOTGWcommands = "";
2021-03-14 23:05:56 +01:00
//debug flags
bool bDebugOTmsg = true;
bool bDebugRestAPI = false;
bool bDebugMQTT = false;
bool bDebugSensors = false;
//GPIO Output Settings
bool settingMyDEBUG = false;
bool settingGPIOOUTPUTSenabled = false;
int8_t settingGPIOOUTPUTSpin = 16;
int8_t settingGPIOOUTPUTStriggerBit = 0;
//Now load Debug & network library
#include "Debug.h"
2021-02-14 19:26:37 +01:00
#include "networkStuff.h"
2021-01-30 18:35:11 +01:00
// That's all folks...
2021-01-30 18:35:11 +01:00
2021-12-19 20:47:20 +01:00
/***************************************************************************
2021-01-30 18:35:11 +01:00
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to permit
* persons to whom the Software is furnished to do so, subject to the
* following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
* OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
****************************************************************************
*/