diff --git a/avr/Node/Node.ino b/avr/Node/Node.ino index c70409d..1105c65 100644 --- a/avr/Node/Node.ino +++ b/avr/Node/Node.ino @@ -42,8 +42,12 @@ //#define MW_WOHNZIMMER // Node 110 //#define ANKLEIDEZIMMERTHERMOMETER +// Node 111 +#define GASZAEHLERNODE //----Testnodes----- //#define TESTNODE +// Node 198 +//#define ZAEHLER_TEST_198 // ------ End of configuration part ------------ //**************************************************** // Default settings and settings for the individual nodes are in "Node_settings.h" @@ -169,6 +173,13 @@ float u_batt1; float u_batt2; #endif +#if defined (ZAEHLERINTERRUPT) +volatile float intZaehlerF; +volatile uint32_t intZaehlerUI; +volatile uint8_t intStatusStack; +uint16_t intSumSleepTime; +#endif + payload_t r_payload, s_payload; uint8_t payloadNo = 0; @@ -188,7 +199,7 @@ struct eeprom_t { uint16_t sleeptime_lv; uint16_t sleeptime; uint16_t sleep4ms_fac; - uint8_t emptyloops; + uint16_t emptyloops; uint8_t max_sendcount; uint8_t max_stopcount; uint8_t contrast; @@ -224,6 +235,18 @@ boolean display_on = true; RF24 radio(RADIO_CE_PIN,RADIO_CSN_PIN); #endif +#if defined (ZAEHLERINTERRUPT) +void intZaehler_ISR() { + if ( digitalRead(INTPIN) == LOW ) { + intStatusStack = (intStatusStack << 1); + if ( (intStatusStack & 0b00001110) == 0b00001110 ) { + intZaehlerUI++; + intZaehlerF = (float)intZaehlerUI / 100; + } + } +} +#endif + void get_sensordata(void) { // Read Voltage and calculate battery @@ -267,7 +290,7 @@ void get_sensordata(void) { // Sensor Dallas 18B20 #if defined(SENSOR_18B20) s_18b20.requestTemperatures(); // Send the command to get temperatures - sleep4ms(SENSOR_18B20_DELAYTIME); + SLEEPTYPE(SENSOR_18B20_DELAYTIME); delay(2); temp_18b20=s_18b20.getTempCByIndex(0); #define DISPLAY_TEMP temp_18b20 @@ -439,6 +462,28 @@ uint32_t action_loop(uint32_t data) { } break; #endif +#if defined (ZAEHLERINTERRUPT) + case ZAEHLER_LO_SET_CHANNEL: + { + uint16_t val; + getValue(data, &val); + intZaehlerUI = intZaehlerUI & 0xffff0000; + intZaehlerUI = intZaehlerUI | val; + intZaehlerF = (float)intZaehlerUI / 100; + } + break; + case ZAEHLER_HI_SET_CHANNEL: + { + uint16_t val; + uint32_t val1; + getValue(data, &val); + intZaehlerUI = intZaehlerUI & 0x0000ffff; + val1 = val; + intZaehlerUI = intZaehlerUI | (val1 << 16); + intZaehlerF = (float)intZaehlerUI / 100; + } + break; +#endif #if defined (RELAIS_1) case 51: { @@ -834,11 +879,26 @@ void init_eeprom(bool reset_eeprom) { void setup(void) { delay(500); + #if defined(STATUSLED) pinMode(STATUSLED, OUTPUT); digitalWrite(STATUSLED,STATUSLED_ON); #endif +#if defined (ZAEHLERINTERRUPT) + pinMode(INTPIN, INPUT_PULLUP); +#if defined (ZAEHLERSTART) + intZaehlerUI = ZAEHLERSTART; + intZaehlerF = ZAEHLERSTART / 100.0; +#else + intZaehlerF = 0; + intZaehlerUI = 0; +#endif + intSumSleepTime = 0; + intStatusStack = 0; + attachInterrupt(digitalPinToInterrupt(INTPIN), intZaehler_ISR, FALLING); +#endif + // Init EEPROM init_eeprom(false); @@ -846,36 +906,46 @@ init_eeprom(false); pinMode(DISCHARGE3_PIN, OUTPUT); digitalWrite(DISCHARGE3_PIN,LOW); #endif + #if defined(RELAIS_1) pinMode(RELAIS_1, OUTPUT); digitalWrite(RELAIS_1,RELAIS_ON); #endif + #if defined(RELAIS_2) pinMode(RELAIS_2, OUTPUT); digitalWrite(RELAIS_2,RELAIS_ON); #endif + #if defined(RELAIS_3) pinMode(RELAIS_3, OUTPUT); digitalWrite(RELAIS_3,RELAIS_ON); #endif + #if defined(RELAIS_4) pinMode(RELAIS_4, OUTPUT); digitalWrite(RELAIS_4,RELAIS_ON); #endif + #if defined(SOLARZELLE1) pinMode(SOLARZELLE1, INPUT); #endif + #if defined(SOLARZELLE2) pinMode(SOLARZELLE2, INPUT); #endif + #if defined(LOAD_BALLANCER) pinMode(LOAD_BALLANCER, INPUT); #endif + #if defined(DEBUG_SERIAL) Serial.begin(115200); printf_begin(); #endif + SPI.begin(); + #if defined(SENSOR_18B20) s_18b20.begin(); s_18b20.setWaitForConversion(false); @@ -884,17 +954,20 @@ init_eeprom(false); s_18b20.setResolution(sensorAddress, SENSOR_18B20_RESOLUTION); } } - #endif + #if defined(SENSOR_BOSCH) bosch.begin(); #endif + #if defined(SENSOR_AHT20) aht20.begin(); #endif + #if defined(SENSOR_HTU2X) htu2x.begin(); #endif + #if defined(NEOPIXEL) neopixel_r = NEOPIXEL_R_DEFAULT; neopixel_g = NEOPIXEL_G_DEFAULT; @@ -908,6 +981,7 @@ init_eeprom(false); #endif #if defined(RF24NODE) radio.begin(); + delay(100); radio.setChannel(RF24_CHANNEL); radio.setDataRate(RF24_SPEED); radio.setPALevel(RF24_PA_MAX); @@ -918,6 +992,7 @@ init_eeprom(false); radio.setCRCLength(RF24_CRC_16); radio.openWritingPipe(rf24_node2hub); radio.openReadingPipe(1,rf24_hub2node); + delay(100); #if defined(DEBUG_SERIAL_RADIO) radio.printDetails(); #endif @@ -1000,7 +1075,7 @@ void monitor(uint32_t delaytime) { lcd.print(" "); lcd.print(SWVERSION); lcd.draw(); - sleep4ms(delaytime); + SLEEPTYPE(delaytime); delay(1); lcd.clear(); get_sensordata(); @@ -1022,7 +1097,7 @@ void monitor(uint32_t delaytime) { lcd.print("/"); lcd.print(eeprom.max_stopcount); lcd.draw(); - sleep4ms(delaytime); + SLEEPTYPE(delaytime); delay(1); lcd.clear(); lcd.println(string_5); @@ -1031,7 +1106,7 @@ void monitor(uint32_t delaytime) { lcd.print(string_7); lcd.print(RF24_CHANNEL); lcd.draw(); - sleep4ms(delaytime); + SLEEPTYPE(delaytime); lcd.clear(); lcd.print(string_8); lcd.print(eeprom.contrast); @@ -1043,7 +1118,7 @@ void monitor(uint32_t delaytime) { lcd.draw(); delay(300); } - sleep4ms(5000); + SLEEPTYPE(5000); lcd.setContrast(eeprom.contrast); delay(1); lcd.clear(); @@ -1390,8 +1465,7 @@ void sendRegister(uint32_t data, uint8_t* pos, uint8_t* hbno) { (*hbno)++; (*pos) = 1; // Hub needs some time to prcess data !!! - sleep4ms(1000); - delay(1); + delay(1000); } } @@ -1546,8 +1620,8 @@ void exec_jobs(void) { } #endif -void batt_monitor() { #if defined (BATT_MONITOR) +void batt_monitor() { #if defined(DISCHARGE1) if (vcc_mess > eeprom.volt_dis1) { batt_mod1 = 1; @@ -1596,15 +1670,13 @@ void batt_monitor() { } #endif #endif -#endif } +#endif void loop(void) { - delay(1); - payloadNo = 0; - heartbeatno++; - if ( heartbeatno > 200 ) heartbeatno = 1; - payloadInitData(); +#if defined(ZAEHLERINTERRUPT) + if (loopcount == 0) +#endif get_sensordata(); if (low_voltage_flag) { @@ -1618,9 +1690,6 @@ void loop(void) { // regular Voltage Handling #if defined(DISPLAY_ALL) display_sleep(false); -#endif - if ( loopcount > eeprom.emptyloops ) loopcount = 0; -#if defined(DISPLAY_ALL) draw_battery(BATT_X0,BATT_Y0,cur_voltage); draw_therm(THERM_X0, THERM_Y0); draw_hb_countdown((uint8_t) 8 * (1- ((float)loopcount / eeprom.emptyloops)) ); @@ -1634,7 +1703,9 @@ void loop(void) { #endif wipe_therm(THERM_X0, THERM_Y0); #endif +#if defined (BATT_MONITOR) batt_monitor(); +#endif } // END regular Voltage Handling if ( loopcount == 0) { #if defined(DEBUG_SERIAL_RADIO) @@ -1642,6 +1713,10 @@ void loop(void) { Serial.println("Radio WakeUp"); #endif #if defined(RF24NODE) + payloadNo = 0; + heartbeatno++; + if ( heartbeatno > 200 ) heartbeatno = 1; + payloadInitData(); radio.powerUp(); delay(1); radio.startListening(); @@ -1691,6 +1766,21 @@ void loop(void) { batt_mod4_s = 0; batt_mod5_s = 0; #endif +#if defined(ZAEHLERINTERRUPT) + payload_data(&pos,ZAEHLER_CHANNEL,intZaehlerF); + uint16_t val; + val = intZaehlerUI; + payload_data(&pos,ZAEHLER_LO_CHANNEL,val); + val = intZaehlerUI >> 16; + payload_data(&pos,ZAEHLER_HI_CHANNEL,val); +#if defined(DEBUG_SERIAL_SENSOR) + Serial.print("zaehler: "); + Serial.print("Rohdaten: "); + Serial.print(intZaehlerUI); + Serial.print("aufbereitet: "); + Serial.println(intZaehlerF); +#endif +#endif do_transmit(eeprom.max_sendcount, payloadNo == 0 ? PAYLOAD_TYPE_HB : PAYLOAD_TYPE_HB_F, mk_flags(true), 0, 0); exec_jobs(); radio.stopListening(); @@ -1708,6 +1798,24 @@ void loop(void) { #if defined(DISPLAY_ALL) display_refresh(); #endif +/* + * Sonderbehandlung für Interruptbasierte Zähler + */ +#ifdef ZAEHLERINTERRUPT + intStatusStack = (intStatusStack << 1) | (digitalRead(INTPIN)? 1:0); + if ( (intStatusStack & 0b00000111) == 0b00000111 ) { + while (intSumSleepTime < eeprom.sleeptime) { + dosleep(9); + intSumSleepTime += 8; + } + } else { + dosleep(5); + if (loopcount > 0) loopcount--; + } +#else +/* + * Behandlung normale Nodes + */ long int tempsleeptime = eeprom.sleeptime; // regelmaessige Schlafzeit in Sek. if (low_voltage_flag) tempsleeptime = eeprom.sleeptime_lv; tempsleeptime += sleeptime_kor; // einmalige Korrektur in Sek. @@ -1724,9 +1832,17 @@ void loop(void) { //delay(tempsleeptime); } else { #endif - sleep4ms(tempsleeptime); + SLEEPTYPE(tempsleeptime); #if defined(DISCHARGE1) } #endif +#endif //ZAEHLERINTERRUPT +/* + * ENDE Sonderbehandlung für Interruptbasierte Zähler + */ loopcount++; +#ifdef ZAEHLERINTERRUPT + intSumSleepTime = 0; +#endif + if ( loopcount > eeprom.emptyloops ) loopcount = 0; } diff --git a/avr/Node/Node_settings.h b/avr/Node/Node_settings.h old mode 100755 new mode 100644 index 68825fe..0902b53 --- a/avr/Node/Node_settings.h +++ b/avr/Node/Node_settings.h @@ -222,8 +222,43 @@ #define STATUSLED_OFF HIGH #endif //----------------------------------------------------- +#if defined(GASZAEHLERNODE) +#define RF24NODE 111 +#define EEPROM_VERSION 9 +#define ZAEHLERINTERRUPT +#define ZAEHLER_LO_CHANNEL 11 +#define ZAEHLER_HI_CHANNEL 12 +#define ZAEHLER_CHANNEL 13 +#define ZAEHLER_LO_SET_CHANNEL 51 +#define ZAEHLER_HI_SET_CHANNEL 52 +#define SENSOR_BOSCH +#define SLEEPTIME 60 +#define EMPTYLOOPS 4 +#define LOW_VOLT_LEVEL 2.0 +#define ZAEHLERSTART 285134 +#endif +//----------------------------------------------------- // Testnodes //----------------------------------------------------- +#if defined(ZAEHLER_TEST_198) +#define DEBUG_SERIAL_SENSOR +#define DEBUG_SERIAL_RADIO +#define SLEEPTYPE delay +#define RF24NODE 198 +#define EEPROM_VERSION 3 +#define ZAEHLERINTERRUPT +#define ZAEHLER_LO_CHANNEL 11 +#define ZAEHLER_HI_CHANNEL 12 +#define ZAEHLER_CHANNEL 13 +#define ZAEHLER_LO_SET_CHANNEL 51 +#define ZAEHLER_HI_SET_CHANNEL 52 +#define SENSOR_BOSCH +#define SLEEPTIME 60 +#define EMPTYLOOPS 4 +#define LOW_VOLT_LEVEL 2.0 +//#define SLEEP4MS_FAC 950 +#endif +//----------------------------------------------------- #if defined(TESTNODE_240) #define RF24NODE 240 #define EEPROM_VERSION 7 @@ -272,6 +307,28 @@ // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //define constrains +#if defined (ZAEHLERINTERRUPT) +#ifndef ZAEHLER_CHANNEL +#define ZAEHLER_CHANNEL 13 +#endif +#ifndef ZAEHLER_LO_CHANNEL +#define ZAEHLER_LO_CHANNEL 11 +#endif +#ifndef ZAEHLER_HI_CHANNEL +#define ZAEHLER_HI_CHANNEL 12 +#endif +#ifndef ZAEHLER_LO_SET_CHANNEL +#define ZAEHLER_LO_SET_CHANNEL 51 +#endif +#ifndef ZAEHLER_HI_SET_CHANNEL +#define ZAEHLER_HI_SET_CHANNEL 52 +#endif + +#ifndef INTPIN +#define INTPIN 2 +#endif +#endif + #if defined(LOAD_BALANCER_PIN) #ifndef LOAD_BALANCER #define LOAD_BALANCER 0.2 @@ -441,6 +498,9 @@ #define NEOPIXEL_B_DEFAULT 100 #endif #endif +#ifndef SLEEPTYPE +#define SLEEPTYPE sleep4ms +#endif // Sleeptime in Seconds !! // (valid: 10 ... 32.400) #ifndef SLEEPTIME diff --git a/avr/Node/config.h b/avr/Node/config.h deleted file mode 100644 index 8095ab2..0000000 --- a/avr/Node/config.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @file config.h - * @brief Headerdatei mit Configurationen für Hub und Gateway - * */ - -#ifndef _CONFIG_H_ /* Include guard */ -#define _CONFIG_H_ - -/** - * @defgroup cfgprm "Config Parameter" - * @{ - */ -/// Hier wird der Name des übergreifenden Config-Files festgelegt -#define DEFAULT_CONFIG_FILE "/etc/rf24hub/rf24hub.cfg" -#define PARAM_MAXLEN 80 -// The Key for the Messagebuffer (Hub) -#define MSGKEYHUB 3452 -// The Key for the Messagebuffer (GW) -#define MSGKEYGW 3453 -// Interval to send/repeat a request in millisec. -#define SENDINTERVAL 100 -// Number of stopmessages to send -#define SENDSTOPCOUNT 3 -// Interval for deleting unanswered requests in millisec. -#define DELETEINTERVAL 500 -// Intervall to sync sensordata_d to sensordata -// Time in Seconds: 86400 = 24 Hours -#define DBSYNCINTERVAL 86400 -// array of char sizes -#define DEBUGSTRINGSIZE 600 -#define FHEMDEVLENGTH 50 -#define TELNETBUFFERSIZE 200 -#define TSBUFFERSIZE 30 -#define SQLSTRINGSIZE 500 -#define TSBUFFERSTRING " " -#define NODENAMESIZE 50 -#define IPADDRESSLENGTH 20 - -// Verboselevel -#define VERBOSECRITICAL 0b0000000000000001 -#define VERBOSESTARTUP 0b0000000000000010 -#define VERBOSECONFIG 0b0000000000000100 -#define VERBOSEORDER 0b0000000000001000 -#define VERBOSEOBUFFER 0b0000000000010000 -#define VERBOSETELNET 0b0000000000100000 -#define VERBOSESQL 0b0000000001000000 -#define VERBOSERF24 0b0000000010000000 -#define VERBOSEOTHER 0b0000000100000000 -#define VERBOSEORDEREXT 0b0000001000000000 -#define VERBOSEBUFFERPOINTER 0b0000010000000000 -#define VERBOSEOBUFFEREXT 0b0000100000000000 -#define VERBOSEPOINTER 0b0001000000000000 -#define VERBOSESENSOR 0b0010000000000000 -#define VERBOSENODE 0b0100000000000000 -#define VERBOSEALL 0b0111111111111111 -#define VERBOSENONE 0b0000000000000011 - -#define STARTUPVERBOSELEVEL 0b0000000000000011 -//#define STARTUPVERBOSELEVEL 0b0011111111111111 - -/// @} -#endif // _CONFIG_H_ - diff --git a/avr/Node/config.h b/avr/Node/config.h new file mode 120000 index 0000000..bcbb687 --- /dev/null +++ b/avr/Node/config.h @@ -0,0 +1 @@ +../../linux/config.h \ No newline at end of file diff --git a/avr/Node/dataformat.h b/avr/Node/dataformat.h deleted file mode 100644 index 77bd940..0000000 --- a/avr/Node/dataformat.h +++ /dev/null @@ -1,256 +0,0 @@ -/** - * @file dataformat.h - * @brief As we use our own dataformat it is defined here - * - * Stellt die Funktionen bereit um das Zahlenformat - * für die Übertragung aufzubereiten und nach der - * Übertragung wieder zu dekodieren - * - * Genauigkeit: 1 von 100.000 = 0,01 Promille - * - */ -#ifndef _DATAFORMAT_H_ /* Include guard */ -#define _DATAFORMAT_H_ - -#include -#include -#include -#include -#include -#include "rf24_config.h" -//#include "config.h" - -/** - * @defgroup datafmt Definitions to the own dataformat - * @addtogroup datafmt - * @brief All precompiler macros for the dataformat start with "ZF_" - * @{ - */ - -/// Rückgabewerte der Funktion getDataType(data) -/// Hier: float -#define ZF_FLOAT 0 - -/// Rückgabewerte der Funktion getDataType(data) -/// Hier: Signed Integer 16 bit -#define ZF_INT 1 - -/// Rückgabewerte der Funktion getDataType(data) -/// Hier: Unsigned Integer 16 bit -#define ZF_UINT 2 - -/// Rückgabewerte der Funktion getDataType(data) -/// Hier: Char -#define ZF_CHAR 3 - -/// Rückgabewerte der Funktion getDataType(data) -/// Hier: Unbekannt -#define ZF_UNKNOWN 9 - -/// Anzahl der Rechtsschiebungen um den Channel als normale Zahl darzustellen -/// channel = (data & ZF_CHANNEL) >> ZF_SHIFT_CHANNEL -#define ZF_SHIFT_CHANNEL 23 - -/// Anzahl der Rechtsschiebungen um den Exponenten (bei float) als normale Zahl darzustellen -/// exponent = (data & ZF_EXPO_WERT) >> ZF_SHIFT_EXPO -#define ZF_SHIFT_EXPO 17 - -/// Anzahl der Rechtsschiebungen um den Channel als normale Zahl darzustellen -/// dataformat = (data & ZF_FORMAT) >> ZF_FORMAT -#define ZF_SHIFT_FORMAT 30 - -/// Datenformat float zur Bildung von data im eigenen Format -#define ZF_FORMAT_FLOAT 0b00000000000000000000000000000000 - -/// Datenformat integer zur Bildung von data im eigenen Format -#define ZF_FORMAT_INT 0b01000000000000000000000000000000 - -/// Datenformat unsigned integer zur Bildung von data im eigenen Format -#define ZF_FORMAT_UINT 0b10000000000000000000000000000000 - -/// Datenformat char zur Bildung von data im eigenen Format -#define ZF_FORMAT_CHAR 0b11000000000000000000000000000000 - -/// Digits in denen beim eigenen Zahlenformat der Datentyp gespeichert wird -#define ZF_FORMAT 0b11000000000000000000000000000000 - -/// Digits in denen beim eigenen Zahlenformat der Channel gespeichert wird -#define ZF_CHANNEL 0b00111111100000000000000000000000 - -/// Digit in dem beim eigenen Zahlenformat das Vorzeichen der Zahl (1 = negativ) gespeichert wird -#define ZF_ZAHL_NEGATIV 0b00000000010000000000000000000000 - -/// Digit in dem beim eigenen Zahlenformat das Vorzeichen des Exponenten (1 = negativ) gespeichert wird -#define ZF_EXPO_NEGATIV 0b00000000001000000000000000000000 - -/// Digits in denen beim eigenen Zahlenformat der Betrag des Exponenten gespeichert wird -#define ZF_EXPO_WERT 0b00000000000111100000000000000000 - -/// Digits in denen beim eigenen Zahlenformat für den Datentyp Float der Betrag der Mantisse gespeichert wird -#define ZF_ZAHL_WERT_FLOAT 0b00000000000000001111111111111111 - -/// Digits in denen beim eigenen Zahlenformat für den Datentyp Integer der Betrag der Zahl gespeichert wird -#define ZF_ZAHL_WERT_INT 0b00000000000000000111111111111111 - -/// Digits in denen beim eigenen Zahlenformat für den Datentyp Unsigned Integer der Betrag der Zahl gespeichert wird -#define ZF_ZAHL_WERT_UINT 0b00000000000000001111111111111111 - -/** - * @brief Beschreibung des verwendeten Zahlenformates zur Übertragung (TransportWert) - * Es handelt sich um ein 32 Bit unsigned Integer Format. - * Der Sensorwert wird mit einer Genauigkeit von 17 Bit - * (131072 max, genutzt 100000 = 5 Stellen = 0,01 Promille) gespeichert. - * Zahlenformat X * 10^Y - * Format des Sensorwertes - * Bitreihenfolge: Bit 1 (MSB) ... Bit 32 (LSB) - * - * 1) FLOAT - * Bit 1..2: Verwendetes Zahlenformat (0b00) - * Bit 3..9: Sensornummer (1..127) - * Bit 10: Vorzeichen (0=positiv; 1=negativ) - * Bit 11: Vorzeichen Exponent (0=10^X; 1=10^-X) - * Bit 12..15 Exponent (0..15) - * Bit 16..32 Mantisse (0..100000) - * - * 2) INTEGER - * Bit 1..2: Verwendetes Zahlenformat (0b01) - * Bit 3..9: Sensornummer (1..127) - * Bit 10: Vorzeichen (0=positiv; 1=negativ) - * Bit 11..17: ungenutzt - * Bit 18..32 15 bit unsigned Integer (0..32767) - * - * 3) UNSIGNED INTEGER - * Bit 1..2: Verwendetes Zahlenformat (0b10) - * Bit 3..9: Sensornummer (1..127) - * Bit 11..16: ungenutzt - * Bit 17..32 16 bit unsigned Integer (0..65536) - * - * 4) CHARACTER (2 Characters) - * Bit 1..2: Verwendetes Zahlenformat (0b11) - * Bit 3..9: Sensornummer (1..127) - * Bit 11..16: ungenutzt - * Bit 17..32 2*8 bit Char - * - */ - -/** - * Diese Funktion ist nur für das Debugging des Zahlenformates bestimmt !!!!! - */ -void printBits(size_t const size, void const * const ptr); - -/** - * Verpackt die Sensornummer und den Messwert zu einem - * TransportWert des Datentyps uint32_t. - * @param channel Der Channel, gültige Werte zwischen 1..127 - * @param value: gültige Werte: -1*10^19 .. 1*10^19 - * @return Der Transportwert - */ -uint32_t calcTransportValue(uint8_t channel, float value); - -/** - * Verpackt die Sensornummer und den Messwert zu einem - * TransportWert des Datentyps uint32_t. - * @param channel Der Channel, gültige Werte zwischen 1..127 - * @param value: Der Wert, gültige Werte: 0 .. 65535 - * @return Der Transportwert - */ -uint32_t calcTransportValue(uint8_t channel, uint16_t value); - -/** - * Verpackt die Sensornummer und den Messwert zu einem - * TransportWert des Datentyps uint32_t. - * @param channel gültige Werte zwischen 1..127 - * @param value: gültige Werte: -32,768 to 32,767 - * @return Der Transportwert - */ -uint32_t calcTransportValue(uint8_t channel, int16_t value); - -/** - * Verpackt die Sensornummer und 2 Zeichen zu einem TransportWert - * des Datentyps uint32_t. - * @param channel gültige Werte zwischen 1..127 - * @param value1: Ein beliebiger Character (8bit) - * @param value2: Ein beliebiger Character (8bit) - * @return Der Transportwert - ******************************************************/ -uint32_t calcTransportValue(uint8_t channel, char* value1, char* value2); - -/** - * Entpackt die übertragenen Daten - * @note Der übergebene **buf** muss gross genug sein um den Rückgabewert aufzunehmen - * - */ -char* unpackTransportValue(uint32_t data, char* buf); - -//#if defined(__linux__) - -/** - * Diese Funktion packt die Daten entsprechend des übergebenen Datatypes ein. - * @note Diese Funktion läuft wegen den verwendetetn C Funktionen nur auf Linux Systemen - * @param channel Der Channel - * @param value Der Wert als String - * @param dataType Der Datentyp - * @return Den gepackten Transportwert - */ -uint32_t calcTransportValue(uint8_t channel, char* value, uint8_t dataType); - -/** - * Diese Funktion packt die Daten ein. - * Ist der Value eine Fließkommazahl (enthält einen "." als Dezimaltrenner) wird der Datatype FLOAT verwendet, - * sonst int16. - * @note Diese Funktion läuft wegen den verwendetetn C Funktionen nur auf Linux Systemen - * @param channel Der Channel - * @param value Der Wert als String - * @return Den gepackten Transportwert - */ -uint32_t calcTransportValue(uint8_t channel, char* value); - -//#endif - -/** - * Extrahiert den Datentyp aus den Transportdaten - * Dabei gilt folgende Zuordnung: - * 0 => float Value - * 1 => integer Value - * 2 => unsigned int Value - * 3 => Character - * @param data Der Transportwert - * @return Der verwendete Datentyp - */ -uint8_t getDataType(uint32_t data); - -/** - * Extrahiert die Channel aus dem Transportwert - * @param data Der Transportwert - * @return Der verwendete Channel - */ -uint8_t getChannel(uint32_t data); - -/** - * Extrahiert den Sensorwert aus dem Transportwert - * Hier: Float - * @param data Der Transportwert - * @param zahl Ein Zeiger auf eine FLOAT Variable, hier wird das Ergebnis hinterlegt. - * @return "true" wenn im Transportwert ein float eingepackt war, wurde eine Konvertierung durchgeführt wird ein "false" zurückgegeben. - */ -bool getValue(uint32_t data, float* zahl); - -/** - * Extrahiert den Sensorwert aus dem Transportwert - * Hier: Integer (15 Bit + Vorzeichen) - * @param data Der Transportwert - * @param zahl Ein Zeiger auf eine int16_t Variable, hier wird das Ergebnis hinterlegt. - * @return "true" wenn im Transportwert ein int16_t eingepackt war, wurde eine Konvertierung durchgeführt wird ein "false" zurückgegeben. - */ -bool getValue(uint32_t data, int16_t* zahl); - -/** - * Extrahiert den Sensorwert aus dem Transportwert - * Hier: unsigned int (16 Bit) - * @param data Der Transportwert - * @param zahl Ein Zeiger auf eine uint16_t Variable, hier wird das Ergebnis hinterlegt. - * @return "true" wenn im Transportwert ein uint16_t eingepackt war, wurde eine Konvertierung durchgeführt wird ein "false" zurückgegeben. - */ -bool getValue(uint32_t data, uint16_t* zahl); - -#endif diff --git a/avr/Node/dataformat.h b/avr/Node/dataformat.h new file mode 120000 index 0000000..b591e73 --- /dev/null +++ b/avr/Node/dataformat.h @@ -0,0 +1 @@ +../../linux/dataformat.h \ No newline at end of file diff --git a/avr/Node/dataformat.ino b/avr/Node/dataformat.ino deleted file mode 100644 index 31b2736..0000000 --- a/avr/Node/dataformat.ino +++ /dev/null @@ -1,303 +0,0 @@ -#include "dataformat.h" - -// some forward declaration -float getValue_f(uint32_t data); -int16_t getValue_i(uint32_t data); -uint16_t getValue_ui(uint32_t data); -// END some forward declaration - -// This function is only for debugging -void printBits(size_t const size, void const * const ptr) { - unsigned char *b = (unsigned char*) ptr; - unsigned char byte; - int i, j; - - for (i = size-1; i >= 0; i--) { - for (j = 7; j >= 0; j--) { - byte = (b[i] >> j) & 1; - printf("%u", byte); - } - } - puts(""); -} -// END This function is only for debugging - - -uint32_t calcTransportValue(uint8_t channel, float value) { - float _val = value; - uint32_t ui_val = 0; - uint32_t exponent = 0; - bool expo_negativ = false; - uint32_t result = 0; - result = ((uint32_t)channel << ZF_SHIFT_CHANNEL); - if ( value > 0.00001 || value < -0.00001 ) { - bool negativ = value < 0.0; - if ( negativ ) { - result |= ZF_ZAHL_NEGATIV; - _val *= -1; - } - while ( _val < 6553.6 ) { - expo_negativ = true; - exponent++; - _val *= 10.0; - } - if ( expo_negativ ) { - result |= ZF_EXPO_NEGATIV; - } - while ( _val > 65536.0 ) { - exponent++; - _val /= 10.0; - } - ui_val = 1 * _val; - ui_val &= ZF_ZAHL_WERT_FLOAT; - exponent <<= ZF_SHIFT_EXPO; - result |= ZF_FORMAT_FLOAT; - result |= exponent; - result |= ui_val; - } - return result; -} - -uint32_t calcTransportValue(uint8_t channel, uint16_t value) { - uint32_t result = 0; - result = (uint32_t)channel << ZF_SHIFT_CHANNEL; - result &= ZF_CHANNEL; - result |= ((uint32_t)value & ZF_ZAHL_WERT_UINT); - result |= ZF_FORMAT_UINT; - return result; -} - -uint32_t calcTransportValue(uint8_t channel, int16_t value) { - uint32_t result = 0; - result = (uint32_t)channel << ZF_SHIFT_CHANNEL; - result &= ZF_CHANNEL; - result |= ((uint32_t)value & ZF_ZAHL_WERT_INT); - result |= ZF_FORMAT_INT; - return result; -} - -uint32_t calcTransportValue(uint8_t channel, char value1, char value2) { - uint32_t result = 0; - uint32_t c2 = value2<<8; - uint32_t c1 = value1; - result = channel; - result <<= ZF_SHIFT_CHANNEL; - result &= ZF_CHANNEL; - result = result | ZF_FORMAT_CHAR | c1 | c2; - return result; -} - -#if defined(__linux__) || defined(ESP8266) -uint32_t calcTransportValue(uint8_t channel, char* value, uint8_t dataType) { - uint32_t retval = 0; - char* pEnd; - switch ( dataType ) { - case ZF_FLOAT: - { - float val_f = strtof(value, &pEnd); - retval = calcTransportValue(channel, val_f); - } - break; - case ZF_INT: - { - int16_t val_i = (int16_t)strtol(value, &pEnd, 10); - retval = calcTransportValue(channel, val_i); - } - break; - case ZF_UINT: - { - uint16_t val_ui = (uint16_t)strtoul(value, &pEnd, 10); - retval = calcTransportValue(channel, val_ui); - } - break; - case ZF_CHAR: - // ToDo Wort kann ein kompletter Text sein, das in verschiedene Channels zerlegt wird - // Max Länge 20*3=60 Zeichen - break; - } - return retval; -} - -uint32_t calcTransportValue(uint8_t channel, char* value) { - uint8_t dataType = ZF_UNKNOWN; - for (size_t i=0; i= 'a' && value[i] <= 'z') || (value[i] >= 'A' && value[i] <= 'Z') ) dataType = ZF_CHAR; - } - if ( dataType == ZF_CHAR || dataType == ZF_UNKNOWN ) { - if ( value[0] >= '0' && value[0] <= '9' ) dataType = ZF_UINT; - } - if ( dataType == ZF_CHAR || dataType == ZF_UINT || dataType == ZF_UNKNOWN ) { - if ( value[0] == '-' ) dataType = ZF_INT; - } - for (size_t i=0; i 32768) && (dataType == ZF_INT)) || ((val_f > 65536) && (dataType == ZF_UINT)) ) dataType = ZF_FLOAT; - return calcTransportValue(channel, value, dataType); -} - -#endif - - -bool getValue(uint32_t data, float* zahl) { - bool retval = false; - if ( getDataType(data) == ZF_FLOAT ) { - *zahl = getValue_f(data); - retval = true; - } - if ( getDataType(data) == ZF_INT ) { - *zahl = (float)getValue_i(data); - retval = false; - } - if ( getDataType(data) == ZF_UINT ) { - *zahl = (float)getValue_ui(data); - retval = false; - } - return retval; -} - -bool getValue(uint32_t data, int16_t * zahl) { - bool retval = false; - if ( getDataType(data) == ZF_FLOAT ) { - *zahl = (int16_t)getValue_f(data); - retval = false; - } - if ( getDataType(data) == ZF_INT ) { - *zahl = getValue_i(data); - retval = true; - } - if ( getDataType(data) == ZF_UINT ) { - *zahl = (int16_t)getValue_ui(data); - retval = false; - } - return retval; -} - -bool getValue(uint32_t data, uint16_t* zahl) { - bool retval = false; - if ( getDataType(data) == ZF_FLOAT ) { - *zahl = (uint16_t)getValue_f(data); - retval = false; - } - if ( getDataType(data) == ZF_INT ) { - *zahl = (uint16_t)getValue_i(data); - retval = false; - } - if ( getDataType(data) == ZF_UINT ) { - *zahl = getValue_ui(data); - retval = true; - } - return retval; -} - -uint8_t getDataType(uint32_t data) { - uint8_t retval; - retval = ((data & ZF_FORMAT) >> ZF_SHIFT_FORMAT); - return retval; -} - -uint8_t getChannel(uint32_t data) { - uint8_t retval; - retval = (data & ZF_CHANNEL) >> ZF_SHIFT_CHANNEL; - return retval; -} - -char* unpackTransportValue(uint32_t data, char* buf) { - uint8_t dataType = getDataType(data); - switch ( dataType ) { - case ZF_FLOAT: - { - float myval; - getValue(data, &myval); - if ( myval > 500 ) { -#if defined(__linux__) || defined(ESP8266) - snprintf(buf,9,"%.1f", myval); -#else - dtostrf(myval, 4, 0, buf); -#endif - } else { - if ( myval > 9.9 ) { -#if defined(__linux__) || defined(ESP8266) - snprintf(buf,9,"%.2f", myval); -#else - dtostrf(myval, 4, 1, buf); -#endif - } else { -#if defined(__linux__) || defined(ESP8266) - snprintf(buf,9,"%.3f", myval); -#else - dtostrf(myval, 4, 2, buf); -#endif - } - } - } - break; - case ZF_INT: - { - int16_t myval; - getValue(data, &myval); - sprintf(buf,"%d",myval); - } - break; - case ZF_UINT: - { - uint16_t myval; - getValue(data, &myval); - sprintf(buf,"%u",myval); - } - break; - case ZF_CHAR: - // ToDo Wort kann ein kompletter Text sein, das in verschiedene Channels zerlegt wird - // Max Länge 20*3=60 Zeichen - break; - } - return buf; -} - -/*************************************** - * getValue_? sind nur modulintern und deshalb - * nicht in dataformat.h deklariert !!!!! - **************************************/ -float getValue_f(uint32_t data) { - float zahl; - if ( getDataType(data) == ZF_FLOAT ) { - uint32_t exponent = (data & ZF_EXPO_WERT) >> 17; - bool expo_negativ = data & ZF_EXPO_NEGATIV; - bool zahl_negativ = data & ZF_ZAHL_NEGATIV; - zahl = data & ZF_ZAHL_WERT_FLOAT; - if ( expo_negativ ) { - for (uint8_t i=exponent;i>0;i--) { - zahl /= 10.0; - } - } else { - for (uint8_t i=exponent;i>0;i--) { - zahl *= 10.0; - } - } - if ( zahl_negativ ) { - zahl *= -1.0; - } - } - return zahl; -} - -int16_t getValue_i(uint32_t data) { - int16_t zahl; - if ( getDataType(data) == ZF_INT ) { - zahl = data & ZF_ZAHL_WERT_INT; - } - return zahl; -} - -uint16_t getValue_ui(uint32_t data) { - uint16_t zahl; - if ( getDataType(data) == ZF_UINT ) { - zahl = data & ZF_ZAHL_WERT_UINT; - } - return zahl; -} - diff --git a/avr/Node/dataformat.ino b/avr/Node/dataformat.ino new file mode 120000 index 0000000..363034a --- /dev/null +++ b/avr/Node/dataformat.ino @@ -0,0 +1 @@ +../../linux/dataformat.cpp \ No newline at end of file diff --git a/avr/Node/rf24_config.h b/avr/Node/rf24_config.h deleted file mode 100644 index 45105c6..0000000 --- a/avr/Node/rf24_config.h +++ /dev/null @@ -1,294 +0,0 @@ -#ifndef RF24_CONFIG_H -#define RF24_CONFIG_H - -/** - * @file rf24_config.h - * @brief Definition der RF24 Parameter - * Diese Datei wird vom GW, vom Hub und von den Nodes eingebunden !!! - * Hier sind alle Parameter zum RF24-Netzwerk und die Register definiert. - * Zusätzlich sind hier die Payload Struktur und diee Udpdata Struktur definiert. - */ - -/** @defgroup rf24makros RF24 Makros - * @addtogroup rf24makros - * @brief Definition der RF24 Netzwerk Einstellungen - * @{ - */ -///Der verwendete RF24 Funkkanal -#define RF24_CHANNEL 92 -/// Die Übertragungsgeschwindigkeit -#define RF24_SPEED RF24_250KBPS -/// Der Netzwerkschlüssel Hub zum Node -#define RF24_HUB2NODE { 0xf0, 0xcc, 0xfc, 0xcc, 0xcc} -/// Der Netzwerkschlüssel Node zum Hub -#define RF24_NODE2HUB { 0x33, 0xcc, 0xfc, 0xcc, 0xcc} -/// Der Datentyp für die Node_ID. Ist aktuell auf 1...255 festgelegt. Werden mehr Nodes benötigt, kann der Datentyp hier zentral umgestellt werden. -#define NODE_DATTYPE uint8_t -/// Der Datentyp für die Ordernummer. Auch hier eine zentrale Festlegung des Datentyps, der ggf. die Umstellung vereinfacht. -#define ONR_DATTYPE uint8_t -/// @} - -/** - * @defgroup reggrp Definition der Registergruppen - * @addtogroup reggrp - * Definition der Channel Verteilung (generische Definitionen und Sonderbehandlung) - * Achtung: Bereiche müssen streng getrennt sein und dürfen sich nicht überschneiden - * Es werden folgende Bereiche unterschieden:
- * SENSOR_CHANNEL: In diesem Bereich sind die normalen Sensoren und Aktoren angesiedelt.
- * SENSOR_BATT: Ein Sensor mit Sonderbehandlung für die Batterie im Bereich der normalen Sensoren
- * REG_NOSTORE: Hier sind die Register angesiedelt deren Inhalte (im Node) einmal verarbeitet und dann vergessen werden.
- * REG_NORMAL: Normale Register, die geschrieben, gelesen und wieder überschrieben werden können.
- * REG_READONLY: Register, die nur gelesen werden können.
- * - * @{ - */ -/// Erster normaler Sensorchannel -#define SENSOR_CHANNEL_FIRST 1 -/// Letzter normaler Sensorchannel -#define SENSOR_CHANNEL_LAST 79 -/// Erstes Register, das vom Hub nicht gespeichert wird -#define REG_NOSTORE_FIRST 80 -/// Letztes Register, das vom Hub nicht gespeichert wird -#define REG_NOSTORE_LAST 89 -/// Erstes Register gilt die normale Behandlung -#define REG_NORMAL_FIRST 90 -/// Letztes Register gilt die normale Behandlung -#define REG_NORMAL_LAST 120 -/// Erstes Read only Register -#define REG_READONLY_FIRST 121 -/// Letztes Read only Register -#define REG_READONLY_LAST 127 -/// @} - -/** - * @defgroup reg Definition der Register - * @addtogroup reg - * Definition der Kontrollregister
- * Nicht jedes Register ist in jedem Node verfügbar. Dies ist abhängig von der verbauten Hardware und der eingespielten Software. - * @{ - */ -/// Sensor für den Spannungswert der Batterie auf Channel 79 -#define SENSOR_BATT 79 -/// Einmalige Korrektur der Schlafzeit in Sekunden -/// Format: int16_t; Wertebereich: -1000 ... 1000 -#define REG_SLEEPTIME_KOR 80 -/// Schreiben eines beliebigen Wertes startet den Registertransfer zum Hub. -/// Format: uint16_t; Wertebereich: beliebig -#define REG_TRANSREG 81 -/// Schreiben eines beliebigen Wertes startet die PA Messung. -/// Format: uint16_t; Wertebereich: beliebig -#define REG_TRANSPA 82 -/// Schreiben eines beliebigen Wertes in dieses Register setzt alle EEPROM Werte auf Default zurück. -/// Format: uint16_t; Wertebereich: beliebig -#define REG_DEFAULT 83 -/// EntladeSpannung Level 1
-/// Bei Überschreiten dieser Spannung wird der ATMega nicht mehr in den Schlafmodus versetzt. -/// Format: float; Wertebereich: 1...20 -#define REG_DISCHARGE_LEV1 91 -/// EntladeSpannung Level 2
-/// Bei Überschreiten dieser Spannung wird die Batterie zusätzlich über einen Widerstand entladen. -/// Format: float; Wertebereich: 1...20 -#define REG_DISCHARGE_LEV2 92 -/// EntladeSpannung Level 2
-/// Bei Überschreiten dieser Spannung wird die Batterie zusätzlich über einen Widerstand entladen. -/// Format: float; Wertebereich: 1...20 -#define REG_DISCHARGE_LEV3 93 -/// Maximal zulässige Differenzspannung bei 2 Batterien. -/// Wird diese Spannung überschritten, wirden die Spannungspegel durch gezieltes laden/entladen angepasst. -#define REG_LOAD_BALLANCER 94 -/// Kontrastpegel (nur bei Displays) -#define REG_CONTRAST 95 -/// Helligkeitspegel (nur bei Displays) -#define REG_BRIGHTNES 96 -/// Spannungskorrekturfaktor -/// U = Umess * factor + offset -/// Format: float; Wertebereich: 0.1 ... 10; Default: 1 -#define REG_VOLT_FAC 110 -/// Spannungsoffset -/// U = Umess * factor + offset -/// Format: float; Wertebereich: -10 ... 10; Default: 0 -#define REG_VOLT_OFF 111 -/// Low Voltage Level -/// Bei unterschreiten dieser Spannung geht der Node in den Low Voltage Modus. Dann gilt die SLEEPTIME_LV. -/// Format: float; Wertebereich: 1 ... 5; Default: 2 -#define REG_VOLT_LV 112 -/// Schlafzeit im Low Voltgage Modus -/// Der einstellbare Bereich liegt von 10 Sekunden bis 9 Stunden (=32400 Integer Begrenzung) -/// Format: uint16_t; Wertebereich: 10 ... 32400; Default: 900 -#define REG_SLEEPTIME_LV 113 -/// Normale Schlafzeit -/// Der einstellbare Bereich liegt von 10 Sekunden bis 9 Stunden (=32400 Integer Begrenzung) -/// Format: uint16_t; Wertebereich: 10 ... 32400; Default: 300 -#define REG_SLEEPTIME 114 -/// Feinjustierung der Sekunden für den Tiefschlaf -/// Format: uint16_t; Wertebereich: 500 ... 2000; Default: 1000 -#define REG_SLEEP4MS_FAC 115 -/// Verzögerung zwischen zwei Sendungen/Sendewiederholung -/// Format: uint16_t; Wertebereich: 50 ... 1000; Default: 500 -#define REG_SENDDELAY 116 -/// Maximale Anzahl von Sendeversuchen für normale Sendungen -/// Format: uint16_t; Wertebereich: 1 ... 20; Default: 10 -#define REG_MAX_SENDCOUNT 117 -/// Maximale Anzahl von Sendeversuchen für stopp Sendungen -/// Format: uint16_t; Wertebereich: 1 ... 20; Default: 3 -#define REG_MAX_STOPCOUNT 118 -/// Anzahl der Loops ohne Sendungen -/// Format: uint16_t; Wertebereich: 0 ... 20; Default: 0 -#define REG_EMPTYLOOPS 119 -/// Sendefeldstärke -/// Legt die Felstärke fest mit der dieser Node sendet. 1 = Min(-18dbm), 2 = Low(-12dbm), 3 = High(-6dbm), 4 = Max(0dbm) -/// Format: uint16_t; Wertebereich: 0 ... 3; Default: 3 -#define REG_PALEVEL 120 -/// Empfangsfeldstärke -/// Legt die Felstärke fest mit der dieser Node vom Hub empfangen wurde. -/// 0 = Min(-18dbm), 1 = Low(-12dbm), 2 = High(-6dbm), 3 = Max(0dbm) -/// Format: uint16_t; Wertebereich: 0 ... 3; -/// Diese Information wird nicht zum Node übertragen -#define REG_RECLEVEL 121 -/// Softwarestand -/// Wird im Format XYZZ übertragen: X=Release, Y=Subrelease, ZZ=Änderungszähler -/// Format: uint16_t; Wertebereich: 0 ... 20; Default: 0 -#define REG_SW 125 -/// @} - -/** - * @defgroup msgflg Definition der Messageflags - * @addtogroup msgflg - * Definition der Messageflags => Payload Message Flags - * @{ - */ - -/// Leeres Messageflag -#define PAYLOAD_FLAG_EMPTY 0b00000000 -/// Flag zeigt an das diese Nachricht die letzte (Teil-)Nachricht war -#define PAYLOAD_FLAG_LASTMESSAGE 0b00000001 -/// Flag zeigt an das die Spannung im Node kritisch ist -#define PAYLOAD_FLAG_LOWVOLTAGE 0b00000010 -///@} - - -/** - * @defgroup msgtyp Definition der Messagetypen - * @addtogroup msgtyp - * Nachrichten werden in abhängigkeit von ihrem Nachrichtentyp im Hub unterschiedlich behandelt. - * Sonderfall Ping zur Feldstärkenmessung: - * Ein Ping geht immer vom Node aus. Durch die unterschiedlichen Sendeleistungen kann die Qualität der Funkverbindung beurteilt werden. - * - * @{ -*/ - -/// Nachricht ist ein Init -/// Ursprung: Node; Empfänger: Hub -#define PAYLOAD_TYPE_INIT 1 - -/// Nachricht ist ein Messwert aus einem ESPNode -/// Ursprung: ESPNode; Empfänger: Hub -/// Diese Nachricht wird nicht vom Hub beantwortet -#define PAYLOAD_TYPE_ESP 41 - -/// Nachricht ist ein initialer Heatbeat -/// Ursprung: Node; Empfänger: Hub -#define PAYLOAD_TYPE_HB 51 - -/// Nachricht ist eine Quittung für einen Heatbeat, -/// Alle 6 data Felder sind leer (0) -/// Ursprung: Hub; Empfänger: Node -#define PAYLOAD_TYPE_HB_RESP 52 - -/// Nachricht ist ein Folge Heatbeat -/// Ursprung: Node; Empfänger: Hub -#define PAYLOAD_TYPE_HB_F 55 - -/// Nachricht ist eine Quittung für einen Folge Heatbeat, -/// Alle 6 data Felder sind leer (0) -/// Ursprung: Hub; Empfänger: Node -#define PAYLOAD_TYPE_HB_F_RESP 56 - -/// Daten Nachricht, erfolgt als Antwort auf einen Heartbeat wenn der Hub dem Node etwas mitteilen möchte. -/// Ursprung: Hub; Empfänger: Node -#define PAYLOAD_TYPE_DAT 61 - -/// Antwort auf Daten Nachricht -/// verarbeitete Daten werden unverändert zurückgesand -/// Ursprung: Node; Empfänger: Hub -#define PAYLOAD_TYPE_DATRESP 62 - -// Antwort auf Datenantwort(PAYLOAD_TYPE_DATRES) / Stoppnachricht -// Alle Datenfelder sind leer -// Ursprung: Hub; Empfänger: Node -#define PAYLOAD_TYPE_DATSTOP 63 - -/// Nachricht ist ein Ping. -/// Sendeleistung ist Minimal (-18 dBm) -#define PAYLOAD_TYPE_PING_POW_MIN 101 -/// Nachricht ist ein Ping. -/// Sendeleistung ist Low (-12 dBm) -#define PAYLOAD_TYPE_PING_POW_LOW 102 -/// Nachricht ist ein Ping. -/// Sendeleistung ist High (-6 dBm) -#define PAYLOAD_TYPE_PING_POW_HIGH 103 -/// Nachricht ist ein Ping. -/// Sendeleistung ist Max ( 0 dBm) -#define PAYLOAD_TYPE_PING_POW_MAX 104 -/// Nachricht ist ein Ping. -/// Ende des Tests Sendeleistung ist Max ( 0 dBm) -#define PAYLOAD_TYPE_PING_END 105 -/// @} - -/** - * @typedef payload_t Die Datenstructur zur Übertragung der Daten zwischen Gateway und Node - * In der aktuellen Struktur können bis zu 6 Transprortwerte (Vereinigeung von Channel und Wert) transportiert werden. - * Der nrf24l01 kann einen Payload von 32byte transportieren. dieser Datentyp ist genau 32bylte lang. - */ -typedef struct { -/// Die Node_ID ist der eindeutige Identifizierer für einen Node. -/// Aktuell können hier die Nodes 1..255 genutzt werden (8 Bit Begrenzung) -/// Damit der Datentyp einfach gewechselt werden kann ist er nur indirekt festgelegt. - NODE_DATTYPE node_id; -/// Die MSG_ID ist der eindeutige Identifizierer einer Nachricht. -/// Muss einen Nachricht wiederholt werden, wird sie hochgezählt. - uint8_t msg_id; -/// Art der Nachricht, Definition siehe Nachrichtentyp. - uint8_t msg_type; -/// Nachrichtenflag, Definition siehe Nachrichtenflags. - uint8_t msg_flags; -/// Ordernummern werden im Hub verwaltet und dort nach jeder Order hochgezählt. -/// Auf eine Anfrage vom Hub wird immer mit der selben Ordernummer geantwortet. -/// Nachrichten, die ihren Ursprung im Node haben ( z.B. Heatbeatmessages ) -/// erhalten die Ordernummer "0", Ordernummern größer 250 diesen zur Messung des PA Levels. - ONR_DATTYPE orderno; -/// Die heartbeatno wird bei jedem neuen Heartbeat hochgezählt -/// Da es sich um eine 8 Bit Zahl handelt wird der gültige Bereich für normale Heartbeats von 1...200 festgelegt -/// Der Bereich 201...255 gilt für besondere Nachrichten (z.B. Initialisierung ) - uint8_t heartbeatno; -/// noch nicht genutzt - uint8_t reserved1; -/// noch nicht genutzt - uint8_t reserved2; -/// Datenpaket 1 (32Bit) - uint32_t data1; -/// Datenpaket 2 (32Bit) - uint32_t data2; -/// Datenpaket 3 (32Bit) - uint32_t data3; -/// Datenpaket 4 (32Bit) - uint32_t data4; -/// Datenpaket 5 (32Bit) - uint32_t data5; -/// Datenpaket 6 (32Bit) - uint32_t data6; -} payload_t; - -/** - * @typedef udpdata_t Die Datenstructur zur Übertragung der Daten zwischen Gateway und Hub - * Im Prinzig ebtspricht diese Struktur der payload_t Struktur erweitert um ein Feld zur Aufnahme der Gateway_id. - * - */ -typedef struct { -/// Die eindeutige Gateway ID - uint16_t gw_no; // the number of the sending gateway -/// Die Payloadstruktur wie unter payload_t definiert. - payload_t payload; // the payload to send forward -} udpdata_t; - -#endif diff --git a/avr/Node/rf24_config.h b/avr/Node/rf24_config.h new file mode 120000 index 0000000..9485461 --- /dev/null +++ b/avr/Node/rf24_config.h @@ -0,0 +1 @@ +../../linux/rf24_config.h \ No newline at end of file diff --git a/database/create_tab.sql b/database/create_rf24hub_tab.sql similarity index 96% rename from database/create_tab.sql rename to database/create_rf24hub_tab.sql index 8106c7e..29e4151 100644 --- a/database/create_tab.sql +++ b/database/create_rf24hub_tab.sql @@ -158,6 +158,9 @@ CREATE TABLE `sensordata` ( PARTITION `p2019` VALUES LESS THAN (1577833200) ENGINE = InnoDB, PARTITION `p2020` VALUES LESS THAN (1609455600) ENGINE = InnoDB, PARTITION `p2021` VALUES LESS THAN (1640991600) ENGINE = InnoDB, + PARTITION `p2022` VALUES LESS THAN (1672527600) ENGINE = InnoDB, + PARTITION `p2023` VALUES LESS THAN UNIX_TIMESTAMP('24/01/01') ENGINE = InnoDB, + PARTITION `p2024` VALUES LESS THAN UNIX_TIMESTAMP('25/01/01') ENGINE = InnoDB, PARTITION `pnow` VALUES LESS THAN MAXVALUE ENGINE = InnoDB); create index sensordata_id on sensordata(sensor_id); @@ -196,6 +199,8 @@ CREATE TABLE `sensordata_d` ( PARTITION `p2020` VALUES LESS THAN (1609455600) ENGINE = InnoDB, PARTITION `p2021` VALUES LESS THAN (1640991600) ENGINE = InnoDB, PARTITION `p2022` VALUES LESS THAN (1672527600) ENGINE = InnoDB, + PARTITION `p2023` VALUES LESS THAN UNIX_TIMESTAMP('24/01/01') ENGINE = InnoDB, + PARTITION `p2024` VALUES LESS THAN UNIX_TIMESTAMP('25/01/01') ENGINE = InnoDB, PARTITION `p_now` VALUES LESS THAN MAXVALUE ENGINE = InnoDB); --DROP TABLE IF EXISTS numbers; diff --git a/doc/ARDUINO_NODE_GUIDE.md b/doc/ARDUINO_NODE_GUIDE.md deleted file mode 100644 index 49e2587..0000000 --- a/doc/ARDUINO_NODE_GUIDE.md +++ /dev/null @@ -1,34 +0,0 @@ -# A howto to build an Avr node from the internal template -## A minimalistic Node without attached Sensor -### Node Schematic -![Layout minimalistic node](https://raw.githubusercontent.com/wilmsn/RF24Hub/master/doc/Avr_minimal_Schaltplan.png "Schematic minimalistic Node") -### Node configuration -- Open the Node Sketch (avr/Node/Node.ino) in your favorite IDE (Arduino IDE works fine for me). -- Go to the file Node.ino -- In the lines above "// ------ End of configuration part ------------" we select the node to build. All other konfigurationlines **must** be commented out (with "//" at the beginning of the line)! -- look for **"//#define TESTNODE"** and remove the slashs (uncomment it) -Now you can compile it. - -Here are the configurations behind TESTNODE (file Node_settings.h) - - #if defined(TESTNODE) - #define RF24NODE 100 - #define SLEEPTIME 60 - #define EMPTYLOOPS 0 - #define SENSOR_DUMMY - #define DUMMY_TEMP 33.3 - #endif - -So we get a Node with id=100 that will send every 60 seconds a dummy value of "33.3" on channel "1" - -### Board settings -I use "Mini Core" as the board template. To install it look at "https://github.com/MCUdude/MiniCore" for details. -Once the Mini Core is installed use this settings: - -![Arduino Settings](https://raw.githubusercontent.com/wilmsn/RF24Hub/master/doc/Arduino_IDE_settings.png "Arduino settings") - -Important: - -- We use internal clock (8 Mhz or less) -- We do not need a bootloader - diff --git a/doc/AVR_GUIDE.md b/doc/AVR_GUIDE.md new file mode 100644 index 0000000..6473c73 --- /dev/null +++ b/doc/AVR_GUIDE.md @@ -0,0 +1,205 @@ +# A howto to build an Avr node from the internal template + +**RF24Hub startpage: [wilmsn.github.io/rf24hub](index.html)** + +## A minimalistic Node without attached Sensor + +### Node Schematic + +![Layout minimalistic node](https://wilmsn.github.io/rf24hub/Avr_minimal_Schaltplan.png "Schematic minimalistic Node") + +### Node configuration + +- Open the Node Sketch (avr/Node/Node.ino) in your favorite IDE (Arduino IDE works fine for me). + +- Go to the file Node.ino + +- In the lines above + + // ------ End of configuration part ------------ + + we select the node to build. All other konfigurationlines **must** be commented out (with "//" at the beginning of the line)! + +- look for **"//#define TESTNODE"** and remove the slashs (uncomment it) + +Here are the configurations behind TESTNODE (file Node_settings.h) + + #if defined(TESTNODE) + #define RF24NODE 100 + #define SLEEPTIME 60 + #define EMPTYLOOPS 0 + #define SENSOR_DUMMY + #define DUMMY_TEMP 33.3 + #endif + +So we get a Node with id=100 that will send every 60 seconds a dummy value of "33.3" on channel "1" + +### Board settings + +I use "Mini Core" as the board template. To install it look at "https://github.com/MCUdude/MiniCore" for details. +Once the Mini Core is installed use this settings: + +![Arduino Settings](https://wilmsn.github.io/rf24hub/Arduino_IDE_settings.png "Arduino settings") + +Important: + +- We use internal clock (8 Mhz or less) +- We do not need a bootloader + +### Compiling and uploading + +If all the settings are done you can compile the sketch. + +For transfering the compiled code onto the AVR microcontroler i use the USBASP Programmer. But there are lots of alternatives (eg. to use Arduino Uno as a programmer - google for it). + +## Build a node to your needs + +If you want to build your own node there are two posibilities to do it: + +1. If all of the sensors you used are already implemented you can configure it easily. + +2. If you used a new, unimplemented sensor you have to implement it first. + +### Node configuration + +- Open the Node Sketch (avr/Node/Node.ino) in your favorite IDE (Arduino IDE works fine for me). + +- Go to the file Node_settings.ino + +* First set up your Node configuration +* Set up the basics: +* * Give the node a unique name, here: MYFIRSTNODE +* * Define a unique ID inside the network, here: 200 +The result ooks like this: + +~~~c++ +//*********************************************** +// Individual settings +//----------------------------------------------------- +#if defined(MYFIRSTNODE) +#define RF24NODE 200 +#endif +//----------------------------------------------------- +~~~ + +* Scroll down Node_settings.ino to check if a sensor is implemented. + +In this case we will add a temerature sensor 18b20 + +Here is the definition from Node_settings.ino: + +~~~c++ +// Dallas 18B20 Sensor +#ifdef SENSOR_18B20 +// Resolution for DS18B20 sensor +#ifndef SENSOR_18B20_RESOLUTION +#define SENSOR_18B20_RESOLUTION 9 +#endif +// Delaytime for 18B20 measurement +#ifndef SENSOR_18B20_DELAYTIME +#define SENSOR_18B20_DELAYTIME 100 +#endif +// Channel for temperature +#ifndef TEMP_18B20_CHANNEL +#define TEMP_18B20_CHANNEL 1 +#endif +#endif +~~~ + +So the only thing we have to add to the node definition is: + +~~~c++ +#define SENSOR_18B20 +~~~ + +Now we have configured the 18b20 sensor which will send the temperature on channel 1,has a resolution of 9 (see datasheet) and has a conversation delay of 100ms (see datasheet) + +The resulting node configuration is: + +~~~c++ +//*********************************************** +// Individual settings +//----------------------------------------------------- +#if defined(MYFIRSTNODE) +#define RF24NODE 200 +#define SENSOR_18B20 +#endif +//----------------------------------------------------- +~~~ + +If you want to change the resulution or the delaytime just add the corespondending line from the configuratuin (#define ...) to your node configuration. This will overwrite the defaults! + +### Implementing a new sensor + +In this step you should be able to programm in c++. + +You will need a library that can handle your sensor! + +Usually there are some steps that have to be programmed. + +In the following lines i show the steps for the 18b20 sensor. + +1. Define a name for your sensor and get it running on Arduino board + +The name will be **SENSOR_18B20** + +2. Goto **Node.ino** and include the library + +~~~c++ +#if defined(SENSOR_18B20) +#include +#include +#endif +~~~ + +3. Define Initial treatment of the sensor at startup + +Define variables and objects: + +~~~c++ +#if defined(SENSOR_18B20) +OneWire oneWire(SENSOR_18B20); +DallasTemperature s_18b20(&oneWire); +DeviceAddress sensorAddress; +float temp_18b20; +#endif +~~~ + +~~~c++ +void setup(void) { + + +#if defined(SENSOR_18B20) + s_18b20.begin(); + s_18b20.setWaitForConversion(false); + for(byte i=0; i ${TARGETDIR}/index.html markdown rf24hub_flow.md > ${TARGETDIR}/rf24hub_flow.html - markdown quickstartquide.md > ${TARGETDIR}/quickstartquide.html - + markdown quickstartquide.md > ${TARGETDIR}/quickstartguide.html + markdown DB_GUIDE.md > ${TARGETDIR}/dbguide.html + markdown AVR_GUIDE.md > ${TARGETDIR}/avrguide.html + markdown ESP_GUIDE.md > ${TARGETDIR}/espguide.html + markdown README_doc.md > ${TARGETDIR}/doku.html + cp overview.png ${TARGETDIR}/overview.png + cp Avr_minimal_Schaltplan.png ${TARGETDIR}/Avr_minimal_Schaltplan.png + cp Arduino_IDE_settings.png ${TARGETDIR}/Arduino_IDE_settings.png diff --git a/doc/README.md b/doc/README.md index 29c3b4f..b85223a 100644 --- a/doc/README.md +++ b/doc/README.md @@ -30,15 +30,18 @@ With: - low energy cost ## Guides -- [Quick Start](doc/quickstartguide.html) +- [Quick Start](quickstartguide.html) -- [Database](doc/dbguide.html) +- [Database](dbguide.html) -- [Avr Node](doc/avrguide.html) +- [Avr Node](avrguide.html) -- [ESP Node](doc/espguide.html) +- [ESP Gateway](espguide.html) ## Documentation Parts + +- [Documentation](doku.html) + - [Linux Programs](linux/index.html) - [Avr Node](avr/index.html) diff --git a/doc/README_doc.md b/doc/README_doc.md index 27304e9..e5e605f 100644 --- a/doc/README_doc.md +++ b/doc/README_doc.md @@ -1,8 +1,11 @@ -# Änderungen an der Dokumentation: +# RF24Hub Änderungen an der Dokumentation: + +**RF24Hub startpage: [wilmsn.github.io/rf24hub](index.html)** Die Basis für die Dokumentation befindet sich komplett im Repository RF24Hub. Die Ausgangsdatei ist eine **Markdown** Datei. Die entsprechenden **Html** Dateien werden durch: make doc + erzeugt. **Achtung**: Die Zielstruktur ist für mich festgeschrieben. Sollte jemand anderes das Erzeugungsskript aufrufen sind zunächst die Einträge im **Makefile** zu ändern \ No newline at end of file diff --git a/doc/einbindung.png b/doc/einbindung.png new file mode 100644 index 0000000..6a5934b Binary files /dev/null and b/doc/einbindung.png differ diff --git a/doc/overview.odp b/doc/overview.odp index 5daa168..5d1ad58 100755 Binary files a/doc/overview.odp and b/doc/overview.odp differ diff --git a/doc/quickstartquide.md b/doc/quickstartquide.md index a969af7..c010279 100644 --- a/doc/quickstartquide.md +++ b/doc/quickstartquide.md @@ -1,5 +1,9 @@ # RF24Hub Quick Start Guide + +**RF24Hub startpage: [wilmsn.github.io/rf24hub](index.html)** + ## 0. Prerequisite + - MariaDB is installed - Developmenttools are installed - Arduino-IDE (or any other tool to compile the SW for the ATMEGA) is installed @@ -7,8 +11,11 @@ - - The nrf24l01 transceiver module is connected to your server/host - **Option 2:** - - Build an ESP32 or ESP8266 Node with the nrf24l01 transceiver module as Gateway + ## 1. Go to your development directory - cd ~/entw + + cd ~/entw + ## 2. (Option 1 only) Clone, Compile and Install the RF24 Repo git clone https://github.com/nRF24/RF24.git RF24 @@ -33,6 +40,7 @@ [Have a look at the DB-Guide](https://wilmsn.github.io/rf24hub/arduinoguide.html) ## 5. Do a test run + Edit the config file to your needs/environment: rf24hub.cfg diff --git a/esp/ESPNode/ESPNode.ino b/esp/ESPNode/ESPNode.ino deleted file mode 100755 index a3fc9fd..0000000 --- a/esp/ESPNode/ESPNode.ino +++ /dev/null @@ -1,1500 +0,0 @@ -/* - A Node for the rf24hub based on esp8266. - Can be used as switch or a matrix display - - Build in Parts (selectable): - Relais - Matrix Display - NeoPixel - LEDPWM - Dallas Temperature Sensor 18B20 - Rf24GW - - On Branch: master@rpi1 !!!!! - - -*/ -//**************************************************** -// My definitions for my nodes based on this sketch -// Select only one at one time !!!! -#define TEICHPUMPE -//#define TERASSENNODE -//#define FLURLICHT -//#define WOHNZIMMERNODE -//#define TESTNODE -//#define WITTYNODE -//#define RF24GWTEST -//#define ESPMINI -//#define TESTNODE -//**************************************************** -// Default settings are in "default.h" !!!!! -#include "defaults.h" -// Default settings for the individual nodes are in "Node_settings.h" -#include "Node_settings.h" -//----------------------------------------------------- -//***************************************************** -/* Configuration of NTP */ -#define MY_NTP_SERVER "de.pool.ntp.org" -#define MY_TZ "CET-1CEST,M3.5.0/02,M10.5.0/03" -/* Configuration of update server */ -//#define ATOMIC_FS_UPDATE -// ------ End of configuration part ------------ - -#include -//#include -#include -#include -#include -//#include -#include -//#include -#include -#include -#include -#include -#include -#include -#include "config.h" -#include "secrets.h" -#include "version.h" -#include "defaults.h" -#include "Node_settings.h" -#include "version.h" -#if defined(SENSOR_18B20) -#include -#include -#endif -#include "rf24_config.h" -#if defined(RF24GW) -#include -#include "dataformat.h" -#endif -#if defined(LEDMATRIX) -#include -#endif -#if defined(NEOPIXEL) -#include -#endif - -ESP8266WebServer httpServer(80); -ESP8266HTTPUpdateServer httpUpdater; -WiFiClient mqtt_wifi_client; -Uptime uptime; -#if defined(MQTT) -PubSubClient mqttClient(mqtt_wifi_client); -#endif -Logger logger(LOGGER_NUMLINES, LOGGER_LINESIZE); -#if defined(SENSOR_18B20) -OneWire oneWire(ONE_WIRE_BUS); -DallasTemperature sensors(&oneWire); -#endif -WiFiUDP udp; -#if defined(RF24GW) -RF24 radio(RF24_RADIO_CE_PIN, RF24_RADIO_CSN_PIN); -#endif -#if defined(LEDMATRIX) -LED_Matrix matrix(LEDMATRIX_DIN, LEDMATRIX_CLK, LEDMATRIX_CS, LEDMATRIX_DEVICES_X, LEDMATRIX_DEVICES_Y); -#endif -#if defined(NEOPIXEL) -Adafruit_NeoPixel pixels(NEOPIXELNUM, NEOPIXELPIN, NEO_GRB + NEO_KHZ800); -#endif - -typedef enum {message = 0, sensorweb, sensormqtt, sensorinfo} call_t; -typedef enum {ok_json = 0, ok_html, ok_text, nochange, epromchange, error} status_t; -typedef enum {on = 0, off, toggle, state, unknown} tristate_t; -time_t now; -tm tm; -char timeStr[9]; -char mytopic[TOPIC_BUFFER_SIZE]; -char info_str[INFOSIZE]; -unsigned long lastDbg = 0; -unsigned long lastMsg = 0; -unsigned long lastInfo = 0; -const char c_on[] = "Ein"; -const char c_off[] = "Aus"; -#if defined(NEOPIXEL) -uint32_t rgb = RGBINIT; -#endif -#if defined(LEDPWM) -uint8_t intensity = LEDPWMINIT; -#endif -//bool log_startup = false; -#if defined(SWITCH1) -bool state_switch1 = SWITCH1INITSTATE; -#endif -#if defined(SWITCH2) -bool state_switch2 = SWITCH2INITSTATE; -#endif -#if defined(SWITCH3) -bool state_switch3 = SWITCH3INITSTATE; -#endif -#if defined(SWITCH4) -bool state_switch4 = SWITCH4INITSTATE; -#endif -#if defined(RF24GW) -payload_t payload; -uint8_t rf24_node2hub[] = RF24_NODE2HUB; -uint8_t rf24_hub2node[] = RF24_HUB2NODE; -uint16_t rf24_verboselevel = RF24_GW_STARTUPVERBOSELEVEL; -#endif -ADC_MODE(ADC_VCC); - -struct eeprom_t { - uint32_t magicNo; - bool logfile; - bool logger; - bool log_startup; - bool log_rf24; - bool log_sensor; - bool log_mqtt; - bool log_webcmd; - bool log_sysinfo; -}; -eeprom_t eepromdata; - -udpdata_t udpdata; - -void wifi_con(void) { - if (WiFi.status() != WL_CONNECTED) { - WiFi.persistent(false); - WiFi.mode(WIFI_STA); - WiFi.hostname(HOSTNAME); - WiFi.begin(ssid, password); - - // ... Give ESP 10 seconds to connect to station. - unsigned int i = 0; - while (WiFi.status() != WL_CONNECTED && i < 100) { - delay(200); - i++; - } - configTime(MY_TZ, MY_NTP_SERVER); -#if defined(FS_DEBUG) - fill_timeStr(); - File f = LittleFS.open("/debugfile.txt", "a"); - if (f) { - f.print(datetimeStr); - f.print(": WiFi reconnect\n"); - f.close(); - } -#endif - while (WiFi.status() != WL_CONNECTED) { -#if defined(FS_DEBUG) - fill_timeStr(); - File f = LittleFS.open("/debugfile.txt", "a"); - if (f) { - f.print(datetimeStr); - f.print(": WiFi give up - reboot\n"); - f.close(); - } -#endif - delay(3000); - ESP.restart(); - } - } -} - -void setup() { - pinMode(BUILTIN_LED, OUTPUT); - digitalWrite(BUILTIN_LED, LOW); - Serial.begin(115200); - - EEPROM.begin(512); - EEPROM.get( 0, eepromdata ); - //EEPROM.end(); - - if ( eepromdata.magicNo != MAGICNO ) { - eepromdata.magicNo = MAGICNO; - eepromdata.logfile = false; - eepromdata.logger = false; - eepromdata.log_startup = false; - eepromdata.log_rf24 = false; - eepromdata.log_sensor = false; - eepromdata.log_mqtt = false; - eepromdata.log_webcmd = false; - eepromdata.log_sysinfo = false; - EEPROM.put( 0, eepromdata ); - EEPROM.commit(); - } - logger.begin(); - httpServer.begin(); - - if (!LittleFS.begin()) { - ESP.restart(); - return; - } else { - if (eepromdata.log_startup) { - snprintf(info_str, INFOSIZE, "%s", F("+++++ Begin Startup ++++++ LittleFS mounted +++++")); - write2log(info_str); - } - } - - wifi_con(); - -#if defined(FS_DEBUG) - fill_timeStr(); - File f = LittleFS.open("/debugfile.txt", "a"); - if (f) { - f.print(datetimeStr); - f.print(": Boot device\n"); - f.close(); - } -#endif - if (eepromdata.log_startup) { - snprintf(info_str, INFOSIZE, "%s %s %s %s", F("WLAN: Connected to "), ssid, F(" IP address: "), WiFi.localIP().toString().c_str() ); - write2log(info_str); - } - -#if defined(RF24GW) - udp.begin(RF24_GW_UDP_PORTNO); - if (eepromdata.log_startup) { - snprintf(info_str, INFOSIZE, "%s %u", F("RF24: Opened UDP Port: "), RF24_GW_UDP_PORTNO ); - write2log(info_str); - } -#endif - - //MQTT -#if defined(MQTT) - mqttClient.setServer(MQTT_SERVER, 1883); - mqttClient.setCallback(callback); - mqttClient.setBufferSize(512); - if (eepromdata.log_startup) { - snprintf(info_str, INFOSIZE, "%s %s %s", F("MQTT: Connected to Server "), MQTT_SERVER, F(" Port: 1883") ); - write2log(info_str); - } -#endif - // OTA - // ArduinoOTA.setHostname(HOSTNAME); - // ArduinoOTA.begin(); - // MDNS.begin(HOSTNAME); - httpUpdater.setup(&httpServer); - // httpServer.begin(); - // MDNS.addService("http", "tcp", 80); - // setupFS(); - httpServer.on("/", handleWebRoot); - httpServer.on("/cmd", handleCmd); - httpServer.on("/restart", []() { - httpServer.send(304, "message/http"); - ESP.restart(); - }); - httpServer.on("/console", []() { - httpServer.send(200, "text/plain", logger.printBuffer()); - }); - httpServer.onNotFound([]() { - if (!handleFile(httpServer.urlDecode(httpServer.uri()))) - httpServer.send(404, "text/plain", "FileNotFound"); - }); - - // Init additional modules -#if defined(RF24GW) - // init rf24 - radio.begin(); - delay(100); - radio.setChannel(RF24_CHANNEL); - radio.setDataRate(RF24_SPEED); - radio.setPALevel(RF24_PA_MAX); - radio.setRetries(0, 0); - radio.setAutoAck(false); - radio.disableDynamicPayloads(); - radio.setPayloadSize(32); - radio.setCRCLength(RF24_CRC_16); - radio.openWritingPipe(rf24_hub2node); - radio.openReadingPipe(1, rf24_node2hub); - radio.startListening(); - radio.printDetails(); -#endif -#if defined(LEDMATRIX) - matrix.begin(); - for (int address = 0; address < (LEDMATRIX_DEVICES_X * LEDMATRIX_DEVICES_Y); address++) { - matrix.displayTest(address, true); - delay(200); - matrix.displayTest(address, false); - } - matrix.setFont(2); - matrix.setIntensity(1); - matrix.setCursor(3, 8); - matrix.print("Init"); - matrix.display(); - delay(500); - matrix.off(); - delay(500); - matrix.on(); - delay(500); - matrix.clear(); - matrix.display(); -#endif -#if defined(NEOPIXEL) - pixels.begin(); -#endif -#if defined(LEDPWM) - pinMode(LEDPWM_PIN, OUTPUT); - //analogWriteFreq(10000); - //analogWrite(LEDPWM_PIN, 0); -#endif - - // Init sensors -#if defined(SENSOR_18B20) - sensors.begin(); - sensors.setResolution(SENSOR_18B20_RESOLUTION); -#endif - -#if defined(SWITCH1) -#if defined(SWITCH1PIN1) - pinMode(SWITCH1PIN1, OUTPUT); -#endif -#if defined(SWITCH1PIN2) - pinMode(SWITCH1PIN2, OUTPUT); -#endif - if (SWITCH1INITSTATE) { - handleSwitch1(on); - } else { - handleSwitch1(off); - } -#endif - -#if defined(SWITCH2) -#if defined(SWITCH2PIN1) - pinMode(SWITCH2PIN1, OUTPUT); -#endif -#if defined(SWITCH2PIN2) - pinMode(SWITCH2PIN2, OUTPUT); -#endif - if (SWITCH2INITSTATE) { - handleSwitch2(on); - } else { - handleSwitch2(off); - } -#endif - -#if defined(SWITCH3) -#if defined(SWITCH3PIN1) - pinMode(SWITCH3PIN1, OUTPUT); -#endif -#if defined(SWITCH3PIN2) - pinMode(SWITCH3PIN2, OUTPUT); -#endif - if (SWITCH3INITSTATE) { - handleSwitch3(on); - } else { - handleSwitch3(off); - } -#endif - -#if defined(SWITCH4) -#if defined(SWITCH4PIN1) - pinMode(SWITCH4PIN1, OUTPUT); -#endif -#if defined(SWITCH4PIN2) - pinMode(SWITCH4PIN2, OUTPUT); -#endif - if (SWITCH4INITSTATE) { - handleSwitch4(on); - } else { - handleSwitch4(off); - } -#endif - -#if defined(VALUE1_PIN) - pinMode(VALUE1_PIN, INPUT); -#endif - delay(200); - if (eepromdata.log_startup) { - snprintf(info_str, INFOSIZE, "%s", F("-------------------Ende Startup-------------------------")); - write2log(info_str); - } - digitalWrite(BUILTIN_LED, HIGH); -#if defined(LEDPWM) - analogWrite(LEDPWM_PIN, 0); -#endif -} - -tristate_t get_tristate(const char* mystate) { - tristate_t retval = unknown; - if (strncmp(mystate, "Ein", 3) == 0 || strncmp(mystate, "ein", 3) == 0 || strncmp(mystate, "on", 2) == 0 || strncmp(mystate, "On", 2) == 0 || strncmp(mystate, "1", 1) == 0 ) - retval = on; - if (strncmp(mystate, "Aus", 3) == 0 || strncmp(mystate, "aus", 3) == 0 || strncmp(mystate, "off", 3) == 0 || strncmp(mystate, "Off", 3) == 0 || strncmp(mystate, "0", 1) == 0 ) - retval = off; - // togg* oder Togg* - if (strncmp(mystate, "toggle", 4) == 0 || strncmp(mystate, "Toggle", 4) == 0 ) - retval = toggle; - // state, State, status oder Status - if (strncmp(mystate, "state", 4) == 0 || strncmp(mystate, "Stat", 3) == 0 ) - retval = state; - return retval; -} - -void handleCmd() { - status_t status = error; - bool do_eepromchange = false; - for (int argNo = 0; argNo < httpServer.args(); argNo++ ) { - if ( httpServer.argName(argNo) == "dellogfile" ) { - if (LittleFS.remove("logfile.txt")) { - snprintf(info_str, INFOSIZE, "%s", "Logfile deleted"); - status = ok_text; - } - } - if ( httpServer.argName(argNo) == F("saveeprom") ) { - if (httpServer.arg(argNo) == "1" ) { - do_eepromchange = true; - status = epromchange; - } - } - if ( httpServer.argName(argNo) == F("logfile") ) { - if (status == error) status = nochange; - if (httpServer.arg(argNo) == "1" ) { - if ( ! eepromdata.logfile) { - eepromdata.logfile = true; - status = epromchange; - } - } else { - if ( eepromdata.logfile) { - eepromdata.logfile = false; - status = epromchange; - } - } - } - if ( httpServer.argName(argNo) == F("logger") ) { - if (status == error) status = nochange; - if (httpServer.arg(argNo) == "1" ) { - if ( ! eepromdata.logger) { - eepromdata.logger = true; - status = epromchange; - } - } else { - if ( eepromdata.logger) { - eepromdata.logger = false; - status = epromchange; - } - } - } - if ( httpServer.argName(argNo) == F("log_startup") ) { - if (status == error) status = nochange; - if (httpServer.arg(argNo) == "1" ) { - if ( ! eepromdata.log_startup) { - eepromdata.log_startup = true; - status = epromchange; - } - } else { - if ( eepromdata.log_startup) { - eepromdata.log_startup = false; - status = epromchange; - } - } - } - if ( httpServer.argName(argNo) == F("log_rf24") ) { - if (status == error) status = nochange; - if (httpServer.arg(argNo) == "1" ) { - if ( ! eepromdata.log_rf24) { - eepromdata.log_rf24 = true; - status = epromchange; - } - } else { - if ( eepromdata.log_rf24) { - eepromdata.log_rf24 = false; - status = epromchange; - } - } - } - if ( httpServer.argName(argNo) == F("log_sensor") ) { - if (status == error) status = nochange; - if (httpServer.arg(argNo) == "1" ) { - if ( ! eepromdata.log_sensor) { - eepromdata.log_sensor = true; - status = epromchange; - } - } else { - if ( eepromdata.log_sensor) { - eepromdata.log_sensor = false; - status = epromchange; - } - } - } - if ( httpServer.argName(argNo) == F("log_mqtt") ) { - if (status == error) status = nochange; - if (httpServer.arg(argNo) == "1" ) { - if ( ! eepromdata.log_mqtt) { - eepromdata.log_mqtt = true; - status = epromchange; - } - } else { - if ( eepromdata.log_mqtt) { - eepromdata.log_mqtt = false; - status = epromchange; - } - } - } - if ( httpServer.argName(argNo) == F("log_webcmd") ) { - if (status == error) status = nochange; - if (httpServer.arg(argNo) == "1" ) { - if ( ! eepromdata.log_webcmd) { - eepromdata.log_webcmd = true; - status = epromchange; - } - } else { - if ( eepromdata.log_webcmd) { - eepromdata.log_webcmd = false; - status = epromchange; - } - } - } - if ( httpServer.argName(argNo) == F("log_sysinfo") ) { - if (status == error) status = nochange; - if (httpServer.arg(argNo) == "1" ) { - if ( ! eepromdata.log_sysinfo) { - eepromdata.log_sysinfo = true; - status = epromchange; - } - } else { - if ( eepromdata.log_sysinfo) { - eepromdata.log_sysinfo = false; - status = epromchange; - } - } - } - if ( httpServer.argName(argNo) == F("sysinfo1") ) { - fill_sysinfo1(info_str); - status = ok_json; - } - if ( httpServer.argName(argNo) == F("sysinfo2") ) { - fill_sysinfo2(info_str); - status = ok_json; - } - if ( httpServer.argName(argNo) == F("sysinfo3") ) { - fill_sysinfo3(info_str); - status = ok_json; - } - if ( httpServer.argName(argNo) == F("sysinfo4") ) { - fill_sysinfo4(info_str); - status = ok_json; - } - if ( httpServer.argName(argNo) == F("sysinfo5") ) { - fill_sysinfo5(info_str); - status = ok_json; - } - if ( httpServer.argName(argNo) == F("sysinfo6") ) { - fill_sysinfo6(info_str); - status = ok_json; - } - if ( httpServer.argName(argNo) == F("webcfg1") ) { - fill_webcfg1(info_str); - status = ok_json; - } - if ( httpServer.argName(argNo) == F("webcfg2") ) { - fill_webcfg2(info_str); - status = ok_json; - } - if ( httpServer.argName(argNo) == F("status") ) { - handlestatus(info_str); - status = ok_json; - } - if ( httpServer.argName(argNo) == F("sensor1") ) { - handlesensor(info_str, sensorweb); - status = ok_json; - } - if ( httpServer.argName(argNo) == F("message1") ) { - handlesensor(info_str, message); - status = ok_json; - } - -#if defined(SWITCH1) - if ( httpServer.argName(argNo) == "sw1" ) { - handleSwitch1(get_tristate(httpServer.arg(argNo).c_str())); - status = ok_json; - } -#endif -#if defined(SWITCH2) - if ( httpServer.argName(argNo) == "sw2" ) { - handleSwitch2(get_tristate(httpServer.arg(argNo).c_str())); - status = ok_json; - } -#endif -#if defined(SWITCH3) - if ( httpServer.argName(argNo) == "sw3" ) { - handleSwitch3(get_tristate(httpServer.arg(argNo).c_str())); - status = ok_json; - } -#endif -#if defined(SWITCH4) - if ( httpServer.argName(argNo) == "sw4" ) { - handleSwitch4(get_tristate(httpServer.arg(argNo).c_str())); - status = ok_json; - } -#endif -#if defined(RF24GW) - if ( httpServer.argName(argNo) == "rf24gw" ) { - handlerf24gw(info_str); - status = ok_json; - } -#endif -#if defined(LEDMATRIX) - if ( httpServer.argName(argNo) == "matrixFB" ) { - getMatrixFB(info_str); - status = ok_text; - } - if ( httpServer.argName(argNo) == "intensity" ) { - uint8_t intensity = atoi(httpServer.arg(argNo).c_str()); - if ( intensity < 16) { - matrix.setIntensity(intensity); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, "intensity"); - mqttClient.publish(mytopic, httpServer.arg(argNo).c_str()); - if (eepromdata.log_mqtt) { - snprintf(info_str, INFOSIZE, "MQTT: %s : %s", mytopic, httpServer.arg(argNo).c_str()); - write2log(info_str); - } - } - snprintf(info_str, INFOSIZE, "%s", httpServer.arg(argNo).c_str()); - status = ok_text; - } -#endif -#if defined(NEOPIXEL) - if ( httpServer.argName(argNo) == "getrgb" ) { - snprintf(info_str, INFOSIZE, "%u", rgb); - status = ok_text; - } - if ( httpServer.argName(argNo) == "setrgb" ) { - rgb = httpServer.arg(argNo).toInt(); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, "RGB"); - mqttClient.publish(mytopic, httpServer.arg(argNo).c_str()); - if (state_switch1) set_neopixel(on); - status = ok_text; - } -#endif -#if defined(LEDPWM) - if ( httpServer.argName(argNo) == "getledpwm" ) { - snprintf(info_str, INFOSIZE, "%u", intensity); - status = ok_text; - } - if ( httpServer.argName(argNo) == "setledpwm" ) { - intensity = httpServer.arg(argNo).toInt(); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, "intensity"); - mqttClient.publish(mytopic, httpServer.arg(argNo).c_str()); - if (eepromdata.log_mqtt) { - snprintf(info_str, INFOSIZE, "MQTT: %s : %s", mytopic, httpServer.arg(argNo).c_str()); - write2log(info_str); - } - if (state_switch1) set_ledpwm(on); - status = ok_text; - } - /* if ( httpServer.argName(argNo) == "intensity" ) { - intensity = httpServer.arg(argNo).toInt(); - snprintf(mytopic,TOPIC_BUFFER_SIZE,"%s/%s/%s","stat",MQTT_NODENAME,"intensity"); - mqttClient.publish(mytopic, httpServer.arg(argNo).c_str()); - if (eepromdata.log_mqtt) { - snprintf(info_str,INFOSIZE,"MQTT: %s : %s",mytopic, httpServer.arg(argNo).c_str()); - write2log(info_str); - } - snprintf(info_str,INFOSIZE,"%s",httpServer.arg(argNo).c_str()); - status = ok_text; - }*/ -#endif - } - switch (status) { - case ok_json: - httpServer.send(200, "application/json", info_str ); - break; - case ok_text: - httpServer.send(200, "text/plain", info_str ); - break; - case ok_html: - httpServer.send(200, "text/html", info_str ); - break; - case epromchange: - if ( do_eepromchange ) { - EEPROM.put( 0, eepromdata ); - EEPROM.commit(); - httpServer.send(200, "text/plain", "EEPROM changed" ); - } else { - httpServer.send(200, "text/plain", "Settings temporary changed" ); - } - break; - case nochange: - httpServer.send(200, "text/plain", "No settings changed" ); - break; - case error: - httpServer.send(200, "text/plain", "ERROR" ); - break; - } -} - -#if defined(SWITCH1) -void mqtt_send_swtch1() { - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, SWITCH1MQTT); -#if defined(MQTT) - mqttClient.publish(mytopic, state_switch1 ? c_on : c_off); -#endif - if (eepromdata.log_mqtt) { - snprintf(info_str, INFOSIZE, "MQTT: %s : %s", mytopic, state_switch1 ? c_on : c_off); - write2log(info_str); - } -} - -void switchSwitch1(bool stat) { -#if defined(SWITCH1_NODE) - send_udp_msg(SWITCH1_NODE, calcTransportValue((uint8_t)SWITCH1_CHANNEL, stat ? (uint16_t)1 : (uint16_t)0 )); -#endif - if ( stat ) { -#if defined(SWITCH1PIN1) - digitalWrite(SWITCH1PIN1, SWITCH1ACTIVESTATE); -#endif -#if defined(SWITCH1PIN2) - digitalWrite(SWITCH1PIN2, SWITCH1ACTIVESTATE); -#endif -#if defined(LEDMATRIX) - matrix.on(); -#endif -#if defined(NEOPIXEL) - set_neopixel(on); -#endif -#if defined(LEDPWM) - set_ledpwm(on); -#endif - } else { -#if defined(SWITCH1PIN1) - digitalWrite(SWITCH1PIN1, ! SWITCH1ACTIVESTATE); -#endif -#if defined(SWITCH1PIN2) - digitalWrite(SWITCH1PIN2, ! SWITCH1ACTIVESTATE); -#endif -#if defined(LEDMATRIX) - matrix.off(); -#endif -#if defined(NEOPIXEL) - set_neopixel(off); -#endif -#if defined(LEDPWM) - set_ledpwm(off); -#endif - } -} - -void handleSwitch1(tristate_t stat) { - if ( stat == on || stat == off || stat == toggle ) { - if ( stat == on ) { - state_switch1 = true; - } - if ( stat == off ) { - state_switch1 = false; - } - if ( stat == toggle ) { - state_switch1 = !state_switch1; - } - switchSwitch1(state_switch1); -#if defined(SWITCH1PIN1) - state_switch1 = (digitalRead(SWITCH1PIN1) == SWITCH1ACTIVESTATE); -#endif - mqtt_send_swtch1(); - if (eepromdata.log_sensor) { - snprintf(info_str, INFOSIZE, "Schalter1 %s", state_switch1 ? c_on : c_off); - write2log(info_str); - } - } - snprintf(info_str, INFOSIZE, "{\"state\":\"%s\",\"label\":\"%s\"}", state_switch1 ? c_on : c_off, SWITCH1TXT); -} -#endif - -#if defined(SWITCH2) -void mqtt_send_swtch2() { - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, SWITCH2MQTT); -#if defined(MQTT) - mqttClient.publish(mytopic, state_switch2 ? c_on : c_off); -#endif - if (eepromdata.log_mqtt) { - snprintf(info_str, INFOSIZE, "MQTT: %s : %s", mytopic, state_switch2 ? c_on : c_off); - write2log(info_str); - } -} - -void switchSwitch2(bool stat) { -#if defined(SWITCH2_NODE) - send_udp_msg(SWITCH2_NODE, calcTransportValue((uint8_t)SWITCH2_CHANNEL, stat ? (uint16_t)1 : (uint16_t)0 )); -#endif - if ( stat ) { -#if defined(SWITCH2PIN1) - digitalWrite(SWITCH2PIN1, SWITCH2ACTIVESTATE); -#endif -#if defined(SWITCH2PIN2) - digitalWrite(SWITCH2PIN2, SWITCH2ACTIVESTATE); -#endif - } else { -#if defined(SWITCH2PIN1) - digitalWrite(SWITCH2PIN1, ! SWITCH2ACTIVESTATE); -#endif -#if defined(SWITCH2PIN2) - digitalWrite(SWITCH2PIN2, ! SWITCH2ACTIVESTATE); -#endif - } -} - -void handleSwitch2(tristate_t stat) { - if ( stat == on || stat == off || stat == toggle ) { - if ( stat == on ) { - state_switch2 = true; - } - if ( stat == off ) { - state_switch2 = false; - } - if ( stat == toggle ) { - state_switch2 = !state_switch2; - } - switchSwitch2(state_switch2); -#if defined(SWITCH2PIN1) - state_switch2 = (digitalRead(SWITCH2PIN1) == SWITCH2ACTIVESTATE); -#endif - mqtt_send_swtch2(); - if (eepromdata.log_sensor) { - snprintf(info_str, INFOSIZE, "Schalter2 %s", state_switch2 ? c_on : c_off); - write2log(info_str); - } - } - snprintf(info_str, INFOSIZE, "{\"state\":\"%s\",\"label\":\"%s\"}", state_switch2 ? c_on : c_off, SWITCH2TXT); -} -#endif - -#if defined(SWITCH3) -void mqtt_send_swtch3() { - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, SWITCH3MQTT); -#if defined(MQTT) - mqttClient.publish(mytopic, state_switch3 ? c_on : c_off); -#endif - if (eepromdata.log_mqtt) { - snprintf(info_str, INFOSIZE, "MQTT: %s : %s", mytopic, state_switch3 ? c_on : c_off); - write2log(info_str); - } -} - -void switchSwitch3(bool stat) { - if ( stat ) { -#if defined(SWITCH3PIN1) - digitalWrite(SWITCH3PIN1, SWITCH3ACTIVESTATE); -#endif -#if defined(SWITCH3PIN2) - digitalWrite(SWITCH3PIN2, SWITCH3ACTIVESTATE); -#endif - } else { -#if defined(SWITCH3PIN1) - digitalWrite(SWITCH3PIN1, ! SWITCH3ACTIVESTATE); -#endif -#if defined(SWITCH3PIN2) - digitalWrite(SWITCH3PIN2, ! SWITCH3ACTIVESTATE); -#endif - } -} - -void handleSwitch3(tristate_t stat) { - if ( stat == on || stat == off || stat == toggle ) { - if ( stat == on ) { - state_switch3 = true; - } - if ( stat == off ) { - state_switch3 = false; - } - if ( stat == toggle ) { - state_switch3 = !state_switch3; - } - switchSwitch3(state_switch3); -#if defined(SWITCH3PIN1) - state_switch3 = (digitalRead(SWITCH3PIN1) == SWITCH3ACTIVESTATE); -#endif - mqtt_send_swtch3(); - if (eepromdata.log_sensor) { - snprintf(info_str, INFOSIZE, "Schalter3 %s", state_switch3 ? c_on : c_off); - write2log(info_str); - } - } - snprintf(info_str, INFOSIZE, "{\"state\":\"%s\",\"label\":\"%s\"}", state_switch3 ? c_on : c_off, SWITCH3TXT); -} -#endif - -#if defined(SWITCH4) -void mqtt_send_swtch4() { - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, SWITCH4MQTT); -#if defined(MQTT) - mqttClient.publish(mytopic, state_switch4 ? c_on : c_off); -#endif - if (eepromdata.log_mqtt) { - snprintf(info_str, INFOSIZE, "MQTT: %s : %s", mytopic, state_switch4 ? c_on : c_off); - write2log(info_str); - } -} - -void switchSwitch4(bool stat) { - if ( stat ) { -#if defined(SWITCH4PIN1) - digitalWrite(SWITCH4PIN1, SWITCH4ACTIVESTATE); -#endif -#if defined(SWITCH4PIN2) - digitalWrite(SWITCH4PIN2, SWITCH4ACTIVESTATE); -#endif - } else { -#if defined(SWITCH4PIN1) - digitalWrite(SWITCH4PIN1, ! SWITCH4ACTIVESTATE); -#endif -#if defined(SWITCH4PIN2) - digitalWrite(SWITCH4PIN2, ! SWITCH4ACTIVESTATE); -#endif - } -} - -void handleSwitch4(tristate_t stat) { - if ( stat == on || stat == off || stat == toggle ) { - if ( stat == on ) { - state_switch4 = true; - } - if ( stat == off ) { - state_switch4 = false; - } - if ( stat == toggle ) { - state_switch4 = !state_switch4; - } - switchSwitch4(state_switch4); -#if defined(SWITCH4PIN1) - state_switch4 = (digitalRead(SWITCH4PIN1) == SWITCH4ACTIVESTATE); -#endif - mqtt_send_swtch4(); - if (eepromdata.log_sensor) { - snprintf(info_str, INFOSIZE, "Schalter4 %s", state_switch4 ? c_on : c_off); - write2log(info_str); - } - } - snprintf(info_str, INFOSIZE, "{\"state\":\"%s\",\"label\":\"%s\"}", state_switch4 ? c_on : c_off, SWITCH4TXT); -} -#endif - -#if defined(NEOPIXEL) -void set_neopixel(tristate_t mystate) { - uint32_t red; - uint32_t green; - uint32_t blue; - if ( mystate == on ) { - red = rgb & 0x0000FF; - green = rgb & 0x00FF00; - green >>= 8; - blue = rgb & 0xFF0000; - blue >>= 16; - } - if ( mystate == off ) { - red = 0; - green = 0; - blue = 0; - } - for (int i = 0; i < NEOPIXELNUM; i++) { - pixels.setPixelColor(i, pixels.Color(red, green, blue)); - } - pixels.show(); -} -#endif - -#if defined(LEDPWM) -void set_ledpwm(tristate_t mystate) { - uint8_t myintensity; - if ( mystate == on ) { - myintensity = intensity; - } - if ( mystate == off ) { - myintensity = 0; - } - analogWrite(LEDPWM_PIN, myintensity); -} -#endif - -#if defined(RF24GW) -void handlerf24gw(char* response) { - snprintf(response, INFOSIZE, "{\"gwno\":%d}", RF24_GW_NO); -} -#endif - -void handlestatus(char* myjson) { - char tmp[10]; - snprintf(myjson, 10, "%s", "{ "); -#if defined(LEDMATRIX) - if (strlen(myjson) > 5) strcat(myjson, ","); - strcat(myjson, " \"intensity\":"); - snprintf(tmp, 10, "%u", matrix.getIntensity()); - strcat(myjson, tmp); - strcat(myjson, ", \"display\":"); - snprintf(tmp, 10, "\"%s\"", matrix.displayIsOn() ? c_on : c_off); - strcat(myjson, tmp); -#endif - strcat(myjson, "}"); -} - -void send_udp_msg(NODE_DATTYPE node_id, uint32_t data) { -#if defined(RF24GW) - udpdata.gw_no = RF24_GW_NO; - udpdata.payload.node_id = node_id; - udpdata.payload.msg_id = 0; - udpdata.payload.msg_type = PAYLOAD_TYPE_ESP; - udpdata.payload.msg_flags = PAYLOAD_FLAG_LASTMESSAGE; - udpdata.payload.orderno = 0; - udpdata.payload.data1 = data; - udpdata.payload.data2 = 0; - udpdata.payload.data3 = 0; - udpdata.payload.data4 = 0; - udpdata.payload.data5 = 0; - udpdata.payload.data6 = 0; - udp.beginPacket(RF24_HUB_SERVER, RF24_HUB_UDP_PORTNO); - udp.write((char*)&udpdata, sizeof(udpdata)); - udp.endPacket(); - if (eepromdata.log_rf24) write2log(printPayload("S>H", &udpdata.payload, info_str)); -#endif -} - -void handlesensor(char* myjson, call_t call) { - char tmp[10]; -#if defined(SENSOR_18B20) - uint8_t resolution = 0; - float tempC = -99; - uint8_t numDev = sensors.getDeviceCount(); - if ( numDev > 0 ) { - resolution = sensors.getResolution(); - sensors.requestTemperatures(); - tempC = sensors.getTempCByIndex(0); - } - switch ( call ) { - case sensormqtt: -#if defined(SENSOR_CHANNEL) - snprintf(tmp, 9, "%4.1f", tempC); - send_udp_msg(SENSOR_NODE, calcTransportValue(SENSOR_CHANNEL, tempC)); -#endif - case sensorweb: - sprintf(myjson, "{\"Sensor\":\"18B20\", \"Temperatur\":%4.1f, \"Resolution\":%u }", tempC, resolution); - break; - default: - sprintf(myjson, "{\"msg1txt\":\"Temperatur %4.1f °C\"}", tempC); - } -#endif -#if defined(SENSOR_ANALOG) - int myval = analogRead(A0); - switch ( call ) { - case sensorinfo: - sprintf(myjson, "{\"Sensor\":\"analog an A0\", \"Messwert\":%d }", myval); - break; - default: - sprintf(myjson, "{\"msg1txt\":\"%s %d\"}", SENSOR_TEXT, myval); - } -#endif -#if defined(NOSENSOR) - switch ( call ) { - case sensorinfo: - sprintf(myjson, "{\"Sensor\":\"Kein Sensor angeschlossen\" }"); - break; - default: - sprintf(myjson, "{\"msg1\":0}"); - } -#endif -} - -void handleWebRoot() { - File file = LittleFS.open("/index.html", "r"); - if (file.available()) { - httpServer.send(200, "text/html", file.readString() ); - } else { - httpServer.send(200, "text/plain", "Datei nicht vorhanden" ); - } - file.close(); -} - -void setupFS() { // Funktionsaufruf "setupFS();" muss im Setup eingebunden werden - LittleFS.begin(); - httpServer.onNotFound([]() { - if (!handleFile(httpServer.urlDecode(httpServer.uri()))) - httpServer.send(404, "text/plain", "FileNotFound"); - }); -} - -bool handleFile(String &&path) { - if (path.endsWith("/")) path += "index.html"; - return LittleFS.exists(path) ? ({File f = LittleFS.open(path, "r"); httpServer.streamFile(f, mime::getContentType(path)); f.close(); true;}) : false; -} - -void fill_sysinfo1(char* mystr) { - int rssi = WiFi.RSSI(); - int rssi_quality = 0; - if (rssi <= -100) { - rssi_quality = 0; - } else if (rssi >= -50) { - rssi_quality = 100; - } else { - rssi_quality = 2 * (rssi + 100); - } - snprintf (mystr, INFOSIZE, "{\"Hostname\":\"%s\", \"SSID\":\"%s (%ddBm / %d%%)\", \"IP\":\"%s\", \"Channel\":\"%d\", \"GW-IP\":\"%s\"}", - WiFi.hostname().c_str(), WiFi.SSID().c_str(), rssi, rssi_quality, WiFi.localIP().toString().c_str(), WiFi.channel(), WiFi.gatewayIP().toString().c_str()); -} - -void fill_sysinfo2(char* mystr) { - snprintf (mystr, INFOSIZE, "{\"Freespace\":\"%0.0fKB\", \"Sketchsize\":\"%0.0fKB\", \"FlashSize\":\"%dMB\", \"FlashFreq\":\"%dMHz\", \"CpuFreq\":\"%dMHz\", \"Vcc\":\"%.2fV\"}", - ESP.getFreeSketchSpace() / 1024.0, ESP.getSketchSize() / 1024.0, (int)(ESP.getFlashChipSize() / 1024 / 1024), - (int)(ESP.getFlashChipSpeed() / 1000000), (int)(F_CPU / 1000000), (float)ESP.getVcc() / 1000.0 ); -} - -void fill_sysinfo3(char* mystr) { - uint32_t free; - uint16_t max; - uint8_t frag; - ESP.getHeapStats(&free, &max, &frag); - snprintf (mystr, INFOSIZE, "{\"MAC\":\"%s\",\"SubNetMask\":\"%s\",\"ResetReason\":\"%s\",\"Heap_max\":\"%0.2fKB\",\"Heap_free\":\"%0.2fKB\",\"Heap_frag\":\"%u\"}", - WiFi.macAddress().c_str(), WiFi.subnetMask().toString().c_str(), ESP.getResetReason().c_str(), (float)max / 1024.0, (float)free / 1024.0, frag); -} - -void fill_sysinfo4(char* mystr) { - snprintf (mystr, INFOSIZE, "{\"DnsIP\":\"%s\", \"BSSID\":\"%s\", \"CoreVer\":\"%s\", \"IdeVer\":\"%u\", \"SdkVer\":\"%s\"}", - WiFi.dnsIP().toString().c_str(), WiFi.BSSIDstr().c_str(), ESP.getCoreVersion().c_str(), ARDUINO, ESP.getSdkVersion()); -} -/* -void fill_sysinfo5(char* mystr) { - snprintf (mystr, INFOSIZE, "{\"MQTT-Server\":\"%s\", \"MQTT-Hostname\":\"%s\", \"UpTime\":\"%uT%02u:%02u:%02u\", \"SW\":\"%s / %s\"}", - MQTT_SERVER, MQTT_NODENAME, uptime::getDays(), uptime::getHours(), uptime::getMinutes(), uptime::getSeconds(), SWVERSION_STR, __DATE__ ); -} -*/ -void fill_sysinfo5(char* mystr) { - snprintf (mystr, INFOSIZE, "{\"MQTT-Server\":\"%s\", \"MQTT-Hostname\":\"%s\", \"UpTime\":\"%s\", \"SW\":\"%s / %s\"}", - MQTT_SERVER, MQTT_NODENAME, uptime.uptimestr(), SWVERSION_STR, __DATE__ ); -} - -void fill_sysinfo6(char* mystr) { - snprintf (mystr, INFOSIZE, "{\"RF24HUB-Server\":\"%s\", \"RF24HUB-Port\":%d, \"RF24GW-Port\":%d}", - RF24_HUB_SERVER, RF24_HUB_UDP_PORTNO, RF24_GW_UDP_PORTNO ); -} - -void fill_webcfg1(char* mystr) { - sprintf(mystr, "{\"titel1\":\""); - strcat(mystr, TITEL1); - strcat(mystr, "\""); -#if defined(TITEL2) - strcat(mystr, ",\"titel2\":\""); - strcat(mystr, TITEL2); - strcat(mystr, "\""); -#endif -#if defined(MESSAGE1) - strcat(mystr, ",\"msg1\":1 "); -#endif -#if defined(MESSAGE2) - strcat(mystr, ",\"msg2\":1 "); -#endif -#if defined(SWITCH1) - strcat(mystr, ",\"sw1\":1 "); -#endif -#if defined(SWITCH2) - strcat(mystr, ",\"sw2\":1 "); -#endif -#if defined(SWITCH3) - strcat(mystr, ",\"sw3\":1 "); -#endif -#if defined(SWITCH4) - strcat(mystr, ",\"sw4\":1 "); -#endif -#if defined(RF24GW) - strcat(mystr, ",\"rf24\":1 "); -#endif -#if defined(LEDMATRIX) - strcat(mystr, ", \"ledmatrix\":1 "); -#endif -#if defined(NEOPIXEL) - strcat(mystr, ", \"neopixel\":1 "); -#endif -#if defined(LEDPWM) - strcat(mystr, ", \"ledpwm\":1 "); -#endif - strcat(mystr, "}"); -} - -void fill_webcfg2(char* mystr) { - snprintf(mystr, INFOSIZE, "{\"logfile\":\"%d\", \"logger\":\"%d\", \"log_sensor\":\"%d\", \"log_rf24\":\"%d\", \"log_startup\":\"%d\", \"log_mqtt\":\"%d\", \"log_webcmd\":\"%d\", \"log_sysinfo\":\"%d\"}", - eepromdata.logfile, eepromdata.logger, eepromdata.log_sensor, eepromdata.log_rf24, eepromdata.log_startup, eepromdata.log_mqtt, eepromdata.log_webcmd, eepromdata.log_sysinfo); -} - -void fill_timeStr() { - time(&now); // read the current time - localtime_r(&now, &tm); // update the structure tm with the current time - snprintf(timeStr, 9, "%02d:%02d:%02d", tm.tm_hour, tm.tm_min, tm.tm_sec); -} - -void write2log(char* text) { - fill_timeStr(); - if (eepromdata.logfile) { - File f = LittleFS.open("/logfile.txt", "a"); - if (f) { - f.print(timeStr); - f.print(": "); - f.print(text); - f.print("\n"); - f.close(); - } - } - if (eepromdata.logger) { - logger.print(timeStr); - logger.println(text); - } -} - -#if defined(MQTT) -void mqtt_send_stat() { - char tmp[LOGGER_LINESIZE]; - if (eepromdata.log_mqtt) { - snprintf(info_str, INFOSIZE, "%s", F("Sende MQTT stat Interval")); - write2log(info_str); - } -#if defined(SWITCH1) - mqtt_send_swtch1(); -#endif -#if defined(SWITCH2) - mqtt_send_swtch2(); -#endif -#if defined(SWITCH3) - mqtt_send_swtch3(); -#endif -#if defined(SWITCH4) - mqtt_send_swtch4(); -#endif -#if defined(SENSOR_18B20) || defined(SENSOR_ANALOG) - handlesensor(info_str, sensormqtt); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, "sensordata"); - mqttClient.publish(mytopic, info_str); - if (eepromdata.log_mqtt) { - write2log(mytopic); - write2log(info_str); - } -#endif - handlestatus(info_str); - if ( strlen(info_str) > 5 ) { - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, "devicestatus"); - mqttClient.publish(mytopic, info_str); - if (eepromdata.log_mqtt) { - write2log(mytopic); - write2log(info_str); - } - } -} - -void mqtt_send_tele() { - if (eepromdata.log_mqtt) { - snprintf(info_str, INFOSIZE, "%s", F("Sende MQTT tele Interval")); - write2log(info_str); - } - fill_sysinfo1(info_str); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "tele", MQTT_NODENAME, "info1"); - mqttClient.publish(mytopic, info_str); - if (eepromdata.log_mqtt) { - write2log(mytopic); - write2log(info_str); - } - fill_sysinfo2(info_str); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "tele", MQTT_NODENAME, "info2"); - mqttClient.publish(mytopic, info_str); - if (eepromdata.log_mqtt) { - write2log(mytopic); - write2log(info_str); - } - fill_sysinfo3(info_str); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "tele", MQTT_NODENAME, "info3"); - mqttClient.publish(mytopic, info_str); - if (eepromdata.log_mqtt) { - write2log(mytopic); - write2log(info_str); - } - fill_sysinfo4(info_str); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "tele", MQTT_NODENAME, "info4"); - mqttClient.publish(mytopic, info_str); - if (eepromdata.log_mqtt) { - write2log(mytopic); - write2log(info_str); - } - fill_sysinfo5(info_str); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "tele", MQTT_NODENAME, "info5"); - mqttClient.publish(mytopic, info_str); - if (eepromdata.log_mqtt) { - write2log(mytopic); - write2log(info_str); - } -} - -void callback(char* topic, byte* payload, unsigned int length) { - char delimiter[] = "/"; - char *ptr; - tristate_t mystate; - char part1[TOPIC_PART1_SIZE]; - char part2[TOPIC_PART2_SIZE]; - char part3[TOPIC_PART3_SIZE]; - char msg[10]; - char* cmd = (char*)malloc(length + 2); - snprintf(cmd, length + 1, "%s", (char*)payload); - snprintf (info_str, INFOSIZE, "Callback Msg: T:%s l:%u c:%s", topic, length, cmd); - if (eepromdata.log_mqtt) { - write2log(info_str); - } - ptr = strtok(topic, delimiter); - if (ptr != NULL) snprintf(part1, TOPIC_PART1_SIZE, "%s", ptr); - ptr = strtok(NULL, delimiter); - if (ptr != NULL) snprintf(part2, TOPIC_PART2_SIZE, "%s", ptr); - ptr = strtok(NULL, delimiter); - if (ptr != NULL) snprintf(part3, TOPIC_PART3_SIZE, "%s", ptr); - if ( strncmp(part1, MQTT_CMD, sizeof MQTT_CMD) == 0 ) { - if ( strncmp(part2, MQTT_NODENAME, sizeof MQTT_NODENAME) == 0 ) { -#if defined(SWITCH1) - if ( strncmp(part3, SWITCH1MQTT, sizeof SWITCH1MQTT) == 0 ) { - mystate = get_tristate(cmd); - handleSwitch1(mystate); - snprintf(msg, 10, "%s", mystate == on ? c_on : c_off); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, SWITCH1MQTT); - mqttClient.publish(mytopic, msg, strlen(msg) ); - } -#endif -#if defined(SWITCH2) - if ( strncmp(part3, SWITCH2MQTT, sizeof SWITCH2MQTT) == 0 ) { - mystate = get_tristate(cmd); - handleSwitch2(mystate); - snprintf(msg, 10, "%s", mystate == on ? c_on : c_off); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, SWITCH2MQTT); - mqttClient.publish(mytopic, msg, strlen(msg) ); - } -#endif -#if defined(SWITCH3) - if ( strncmp(part3, SWITCH3MQTT, sizeof SWITCH3MQTT) == 0 ) { - mystate = get_tristate(cmd); - handleSwitch3(mystate); - snprintf(msg, 10, "%s", mystate == on ? c_on : c_off); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, SWITCH3MQTT); - mqttClient.publish(mytopic, msg, strlen(msg) ); - } -#endif -#if defined(SWITCH4) - if ( strncmp(part3, SWITCH4MQTT, sizeof SWITCH4MQTT) == 0 ) { - mystate = get_tristate(cmd); - handleSwitch4(mystate); - snprintf(msg, 10, "%s", mystate == on ? c_on : c_off); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, SWITCH4MQTT); - mqttClient.publish(mytopic, msg, strlen(msg) ); - } -#endif -#if defined(LEDMATRIX) - if ( strncmp(part3, "graph", sizeof "graph") == 0 ) { - for (unsigned int pos = 0; pos + 5 <= length; pos += 5) { - unsigned int cur_x = (cmd[pos] - '0') * 10 + (cmd[pos + 1] - '0'); - unsigned int cur_y = (cmd[pos + 2] - '0') * 10 + (cmd[pos + 3] - '0'); - matrix.setPixel(cur_x, cur_y, cmd[pos + 4] - '0'); - } - matrix.display(); - } - if ( strncmp(part3, "intensity", sizeof "intensity") == 0 ) { - uint8_t intensity = atoi(cmd); - if ( intensity < 16 ) { - matrix.setIntensity(intensity); - snprintf(info_str, INFOSIZE, "{ \"intensity\":%u }", matrix.getIntensity()); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, "matrixdata"); - mqttClient.publish(mytopic, info_str); - } - } - if ( strncmp(part3, "line", sizeof "line") == 0 ) { - print_line(cmd); - } -#endif -#if defined(NEOPIXEL) - if ( strncmp(part3, "RGB", sizeof "RGB") == 0 ) { - char *eptr; - rgb = strtoul(cmd, &eptr, 10); - if (state_switch1) set_neopixel(on); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, "devicestatus"); - mqttClient.publish(mytopic, cmd); - } -#endif -#if defined(LEDPWM) - if ( strncmp(part3, "intensity", sizeof "intensity") == 0 ) { - char *eptr; - intensity = strtoul(cmd, &eptr, 10); - if (state_switch1) set_ledpwm(on); - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "stat", MQTT_NODENAME, "intensity"); - mqttClient.publish(mytopic, cmd); - } -#endif - } - } - // Free the memory - free(cmd); -} - -void mqtt_reconnect() { - // Loop until we're reconnected - while (!mqttClient.connected()) { - // Attempt to connect - if (mqttClient.connect(MQTT_NODENAME)) { - // Once connected, publish an announcement... - // mqtt_send_stat(); - // ... and resubscribe - snprintf(mytopic, TOPIC_BUFFER_SIZE, "%s/%s/%s", "cmnd", MQTT_NODENAME, "#"); - mqttClient.subscribe(mytopic); - } else { - // Wait 1 seconds before retrying - delay(1000); - } - } -} -#endif - -#if defined(RF24GW) -char* printPayload(char* prefix, payload_t *payload, char* placeholder) { - char buf1[10]; - char buf2[10]; - char buf3[10]; - char buf4[10]; - char buf5[10]; - char buf6[10]; - snprintf(placeholder, INFOSIZE, "%s: N:%u T:%u m:%u F:0x%02x O:%u H:%u (%u/%s)(%u/%s)(%u/%s)(%u/%s)(%u/%s)(%u/%s)", prefix - , payload->node_id, payload->msg_type, payload->msg_id, payload->msg_flags, payload->orderno, payload->heartbeatno - , getChannel(payload->data1), unpackTransportValue(payload->data1, buf1) - , getChannel(payload->data2), unpackTransportValue(payload->data2, buf2) - , getChannel(payload->data3), unpackTransportValue(payload->data3, buf3) - , getChannel(payload->data4), unpackTransportValue(payload->data4, buf4) - , getChannel(payload->data5), unpackTransportValue(payload->data5, buf5) - , getChannel(payload->data6), unpackTransportValue(payload->data6, buf6) - ); - return placeholder; -} -#endif - -void loop() { - delay(0); -#if defined(RF24GW) - while ( radio.available() ) { - radio.read(&payload, sizeof(payload)); - if (eepromdata.log_rf24) write2log(printPayload("N>G", &payload, info_str)); - udpdata.gw_no = RF24_GW_NO; - memcpy(&udpdata.payload, &payload, sizeof(payload)); - udp.beginPacket(RF24_HUB_SERVER, RF24_HUB_UDP_PORTNO); - udp.write((char*)&udpdata, sizeof(udpdata)); - udp.endPacket(); - } - if (udp.parsePacket() > 0 ) { - udp.read((char*)&udpdata, sizeof(udpdata)); - memcpy(&payload, &udpdata.payload, sizeof(payload)); - if (eepromdata.log_rf24) write2log(printPayload("G>N", &payload, info_str)); - radio.stopListening(); - radio.write(&payload, sizeof(payload)); - radio.startListening(); - } -#endif -#if defined(MQTT) - if ( ! mqttClient.connected()) { - if (eepromdata.log_mqtt) { - sprintf(info_str, "%s", F("MQTT reconnect")); - write2log(info_str); - } - mqtt_reconnect(); - } - mqttClient.loop(); - delay(0); - if ((millis() - lastMsg) > STATINTERVAL) { - lastMsg = millis(); - mqtt_send_stat(); - } - if ((millis() - lastInfo) > TELEINTERVAL) { - lastInfo = millis(); - mqtt_send_tele(); - } -#endif - delay(0); - httpServer.handleClient(); - // MDNS.update(); - // ArduinoOTA.handle(); // Wait for OTA connection - wifi_con(); - uptime.update(); - delay(0); -} diff --git a/esp/ESPNode/LEDMatrix.ino b/esp/ESPNode/LEDMatrix.ino deleted file mode 100644 index 891b0a1..0000000 --- a/esp/ESPNode/LEDMatrix.ino +++ /dev/null @@ -1,169 +0,0 @@ -#if defined(LEDMATRIX) -/****************************************** - * Definition der Zeilenbeschriftung (line) - * In den ersten 6 Zeichen werden Formatierungsangaben übertragen: - * zeile[0]: die Zeilennummer - * zeile[1] und zeile[2]: offset in Pixel, gezählt von der Formatierungsseite. Wertebereich "00" bis "99" - * zeile[3]: verwendeter font: "1" = variable x-size; "2" = fixed x-size - * zeile[4]: Überblendmodus: "0" = just wipe; "9" = wipe with sprite - * - * zeile[5]: Ausrichtung: "R" = rechtsbündig; "L" = linksbündig - * - * Definition der Graphikübertragung (graph) - * zeile[N*5+0] und zeile[N*5+1]: X-Koordinaten; Wertebereich "00" bis "99" - * zeile[N*5+2] und zeile[N*5+3]: Y-Koordinaten; Wertebereich "00" bis "99" - * zeile[N*5+4]: "0" = Pixel löschen; "1" = Pixel setzen - * ==> mit N zwischen 0 ... 3 - * Achtung: Wenn die Zeile länger wird stürzt der MC ab!!!! - ******************************************/ - - -byte sprite[][8]={ - {B00011000, - B00100100, - B00100100, - B00011000, - B01111110, - B00011000, - B00100100, - B01000010}, - - { B00011000, - B00100100, - B00100100, - B00011010, - B01111100, - B00011000, - B01100100, - B00000010}, - - { B00011000, - B00100100, - B00100100, - B00011010, - B00111100, - B01011000, - B00110100, - B00000100}, - - { B00011000, - B00100100, - B00100100, - B00011010, - B00111100, - B01011000, - B00011000, - B00011000}, - - { B00011000, - B00100100, - B00100100, - B00011010, - B00111100, - B01011000, - B00010100, - B00010000}, - - { B00011000, - B00100100, - B00100100, - B00011000, - B00111110, - B01011000, - B00010100, - B00010100} -}; - - -void drawSprite( byte* sprite, int x, int y, int width, int height ) -{ - byte mask = B10000000; - for( int iy = 0; iy < height; iy++ ) - { - for( int ix = 0; ix < width; ix++ ) - { - matrix.setPixel(x + ix, y + iy, (bool)(sprite[iy] & mask )); - mask = mask >> 1; - } - mask = B10000000; - } -} - -void print_line(char* rohtext ) { - unsigned int cursor_x, cursor_y; - char linetext[LINE_SIZE]; - uint8_t line = rohtext[0]-'0'; - uint8_t offset = (rohtext[1]-'0')*10 + (rohtext[2]-'0'); - uint8_t font = (rohtext[3]-'0'); - unsigned char changemode = rohtext[4]-'0'; - uint8_t textallign = rohtext[5]; - uint8_t textlen = strlen(rohtext)-6; - if (textlen > 0) { - memcpy( linetext, &rohtext[6], textlen ); - linetext[textlen]='\0'; - } else { - linetext[0]='\0'; - } - switch (changemode) { - case 9: // Sprite - { - for (int x1 = 0; x1 < 6; x1++) { - for (int x2 = 0; x2 < 6; x2++) { - drawSprite( (byte*)&sprite[x2], x1 * 6 + x2, (line-1)*8, 8, 8 ); - matrix.display(); - delay(LED_MATRIX_ANIM_DELAY); - } - } - } - break; - case 0: // just wipe - default: - { - matrix.clear(0,(line-1)*8,31,line*8-1); - } - } - matrix.setFont(font); - switch (line) { - case 1: - cursor_y = 0; - break; - case 2: - cursor_y = 8; - break; - case 3: - cursor_y = 17; - break; - } - cursor_x = offset; - if (textallign == 'L') { - matrix.setCursor(cursor_x, cursor_y); - } - if (textallign == 'R') { - cursor_x = matrix.getNumDevicesX()*8 - matrix.getSize(linetext) - offset; - matrix.setCursor(cursor_x,cursor_y); - } -//char mytext[100]; -//sprintf(mytext,"Line:%u TA:%c X:%u Y:%u OS: %u Text:%s len:%u",line,textallign,cursor_x,cursor_y,offset,linetext,strlen(linetext)); -//write2log(mytext); -//sprintf(mytext,"NumDev: %u SizeText: %u Offset: %u", matrix.getNumDevicesX(), matrix.getSize(rohtext), offset); -//write2log(mytext); - matrix.print(linetext); - matrix.display(); -} - -void getMatrixFB(char* mymsg) { - unsigned int dotx = matrix.getNumDevicesX() * 8; - unsigned int doty = matrix.getNumDevicesY() * 8; - memset(mymsg,0,sizeof mymsg); - for (unsigned int y=0; y --- Use LEDMATRIX -// #define LEDMATRIX -- the status LED --- define a pin (default is 3) -// #define STATUSLED --- a pin level for on (default is HIGH) -// #define STATUSLED_ON --- a pin level for off (default is LOW) -// #define STATUSLED_OFF -- version of the EEPROM (only a different version stores new values!!) -// #define EEPROM_VERSION 5 - -******************************************************/ -//***************************************************** -// Individual settings -//----------------------------------------------------- -#if defined(TEICHPUMPE) -#define HOSTNAME "teichpumpe" -#define MQTT_SERVER "rpi1.fritz.box" -#define MQTT_NODENAME "teichpumpe" -#define TITEL1 "Teichpumpe" -#define RF24GW -#define RF24_HUB_SERVER "rpi1.fritz.box" -#define RF24_GW_NO 101 -#define SENSOR_18B20 -#define SENSOR_NODE 1 -#define SENSOR_CHANNEL 11 -#define SWITCH1 -#define SWITCH1PIN1 0 -#define SWITCH1PIN2 2 -#define SWITCH1TXT "Relais" -#define SWITCH1INITSTATE false -#define SWITCH1ACTIVESTATE LOW -#define SWITCH1MQTT "relais" -#define SWITCH1_NODE 1 -#define SWITCH1_CHANNEL 12 -#endif -//----------------------------------------------------- -#if defined(TERASSENNODE) -#define HOSTNAME "terassennode" -#define MQTT_SERVER "rpi1.fritz.box" -#define MQTT_NODENAME "terassennode" -#define TITEL1 "TerassenNode" -#define RF24GW -#define RF24_HUB_SERVER "rpi1.fritz.box" -#define RF24_GW_NO 104 -#define SENSOR_18B20 -#define SENSOR_NODE 1 -#define SENSOR_CHANNEL 1 -#define SWITCH1 -#define SWITCH1PIN1 2 -#define SWITCH1TXT "Terasse" -#define SWITCH1INITSTATE LOW -#define SWITCH1ACTIVESTATE LOW -#define SWITCH1MQTT "terasse" -#define SWITCH1_NODE 1 -#define SWITCH1_CHANNEL 2 -#define SWITCH2 -#define SWITCH2PIN1 0 -#define SWITCH2TXT "Balkon" -#define SWITCH2INITSTATE LOW -#define SWITCH2ACTIVESTATE LOW -#define SWITCH2MQTT "balkon" -#define SWITCH2_NODE 1 -#define SWITCH2_CHANNEL 3 -#endif -//----------------------------------------------------- -#if defined(WOHNZIMMERNODE) -#define HOSTNAME "wohnzimmernode" -#define MQTT_SERVER "rpi1.fritz.box" -#define MQTT_NODENAME "wohnzimmernode" -#define TITEL1 "Wohnzimmernode" -#define LINE_SIZE 15 -#define RF24_GW_NO 102 -#define RF24_HUB_SERVER "rpi1.fritz.box" -#define RF24GW -#define SENSOR_18B20 -#define SENSOR_NODE 1 -#define SENSOR_CHANNEL 6 -#define LEDMATRIX -#define SWITCH1 -#define SWITCH1TXT "Display" -#define SWITCH1MQTT "display" -#define SWITCH1INITSTATE true -#endif -//----------------------------------------------------- -#if defined(FLURLICHT) -#define HOSTNAME "flurlicht" -#define MQTT_NODENAME "flurlicht" -#define TITEL1 "Flurlicht" -#define TITEL2 "Licht im Flur" -#define LEDPWM -#define LEDPWMINIT 150 -#define SWITCH1 -#define SWITCH1TXT "Licht" -#define SWITCH1MQTT "licht" -#define SWITCH1INITSTATE false -#define SWITCH1_NODE 1 -#define SWITCH1_CHANNEL 17 -#define RF24_GW_NO 103 -#define SENSOR_18B20 -#define SENSOR_NODE 1 -#define SENSOR_CHANNEL 16 - -#endif -//----------------------------------------------------- -#if defined(WITTYNODE) -#define HOSTNAME "wittynode" -#define MQTT_NODENAME "wittynode" -#define TITEL1 "Wittynode" -#define TITEL2 "A Witty Node" -#define SWITCH1 -#define SWITCH1PIN1 WITTY_RGB_BL -#define SWITCH1TXT "Blau" -#define SWITCH1INITSTATE LOW -#define SWITCH1ACTIVESTATE HIGH -#define SWITCH1MQTT "RGB_BL" -#define SWITCH2 -#define SWITCH2PIN1 WITTY_RGB_GN -#define SWITCH2TXT "Grün" -#define SWITCH2INITSTATE LOW -#define SWITCH2ACTIVESTATE HIGH -#define SWITCH2MQTT "RGB_GN" -#define SWITCH3 -#define SWITCH3PIN1 WITTY_RGB_RT -#define SWITCH3TXT "Rot" -#define SWITCH3INITSTATE LOW -#define SWITCH3ACTIVESTATE HIGH -#define SWITCH3MQTT "RGB_RT" -#define SENSOR_ANALOG -#define SENSOR_TEXT "LDR: " -#endif -//----------------------------------------------------- -#if defined(RF24GWTEST) -#define HOSTNAME "rf24gwtest" -#define MQTT_NODENAME "rf24gwtest" -#define TITEL1 "rf24gwtest" -#define RF24GW -#define RF24_GW_NO 102 -#define SENSOR_18B20 -#define SWITCH1 -#define SWITCH1TXT "int. LED" -#define SWITCH1PIN1 BUILTIN_LED -#define SWITCH1INITSTATE LOW -#define SWITCH1ACTIVESTATE LOW -#define SWITCH1MQTT "intLED" -#endif -//----------------------------------------------------- -#if defined(ESPMINI) -#define HOSTNAME "espmini" -#define MQTT_NODENAME "espmini" -#define TITEL1 "ESPmini" -#define SWITCH1 -#define SWITCH1TXT "int. LED" -#define SWITCH1PIN1 BUILTIN_LED -#define SWITCH1INITSTATE LOW -#define SWITCH1ACTIVESTATE LOW -#define SWITCH1MQTT "intLED" -#endif -//----------------------------------------------------- -#if defined(TESTNODE) -#define HOSTNAME "testnode" -#define MQTT_NODENAME "testnode" -#define TITEL1 "TestNode" -#undef MQTT -//#define RF24GW -#define RF24_GW_NO 105 -//#define SENSOR_18B20 -#define SWITCH1 -#define SWITCH1PIN1 2 -#define SWITCH1TXT "Terasse" -#define SWITCH1INITSTATE LOW -#define SWITCH1ACTIVESTATE LOW -#define SWITCH1MQTT "terasse" -#define SWITCH2 -#define SWITCH2PIN1 0 -#define SWITCH2TXT "Balkon" -#define SWITCH2INITSTATE LOW -#define SWITCH2ACTIVESTATE LOW -#define SWITCH2MQTT "balkon" -#endif -//----------------------------------------------------- - -//define constrains for precompiler -#if defined(SENSOR_18B20) -#define MESSAGE1 -#undef NOSENSOR -#endif -#if defined(SENSOR_ANALOG) -#define MESSAGE1 -#undef NOSENSOR -#endif -#if defined(RF24_GW_NO) -#define RF24GW -#endif diff --git a/esp/ESPNode/config.h b/esp/ESPNode/config.h deleted file mode 100644 index f253683..0000000 --- a/esp/ESPNode/config.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @file config.h - * @brief Headerdatei mit Configurationen für Hub und Gateway - * */ - -#ifndef _CONFIG_H_ /* Include guard */ -#define _CONFIG_H_ - -/** - * @defgroup cfgprm "Config Parameter" - * @{ - */ -/// Hier wird der Name des übergreifenden Config-Files festgelegt -#define DEFAULT_CONFIG_FILE "/etc/rf24hub/rf24hub.cfg" -#define PARAM_MAXLEN 80 -// The Key for the Messagebuffer (Hub) -#define MSGKEYHUB 3452 -// The Key for the Messagebuffer (GW) -#define MSGKEYGW 3453 -// Interval to send/repeat a request in millisec. -#define SENDINTERVAL 100 -// Number of stopmessages to send -#define SENDSTOPCOUNT 3 -// Interval for deleting unanswered requests in millisec. -#define DELETEINTERVAL 500 -// Intervall to sync sensordata_d to sensordata -// Time in Seconds: 86400 = 24 Hours -#define DBSYNCINTERVAL 86400 -// array of char sizes -#define DEBUGSTRINGSIZE 600 -#define FHEMDEVLENGTH 50 -#define TELNETBUFFERSIZE 200 -#define TSBUFFERSIZE 30 -#define SQLSTRINGSIZE 500 -#define TSBUFFERSTRING " " -#define NODENAMESIZE 50 - -// Verboselevel -#define VERBOSECRITICAL 0b0000000000000001 -#define VERBOSESTARTUP 0b0000000000000010 -#define VERBOSECONFIG 0b0000000000000100 -#define VERBOSEORDER 0b0000000000001000 -#define VERBOSEOBUFFER 0b0000000000010000 -#define VERBOSETELNET 0b0000000000100000 -#define VERBOSESQL 0b0000000001000000 -#define VERBOSERF24 0b0000000010000000 -#define VERBOSEOTHER 0b0000000100000000 -#define VERBOSEORDEREXT 0b0000001000000000 -#define VERBOSEBUFFERPOINTER 0b0000010000000000 -#define VERBOSEOBUFFEREXT 0b0000100000000000 -#define VERBOSEPOINTER 0b0001000000000000 -#define VERBOSESENSOR 0b0010000000000000 -#define VERBOSENODE 0b0100000000000000 -#define VERBOSEALL 0b0111111111111111 -#define VERBOSENONE 0b0000000000000011 - -#define STARTUPVERBOSELEVEL 0b0000000000000011 -//#define STARTUPVERBOSELEVEL 0b0011111111111111 - -/// @} -#endif // _CONFIG_H_ - diff --git a/esp/ESPNode/data/console.html b/esp/ESPNode/data/console.html deleted file mode 100644 index 0c9d1b0..0000000 --- a/esp/ESPNode/data/console.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - -
-
-

Titel1

-

Titel2

-
-
-
- -
-

-
- - -
- - diff --git a/esp/ESPNode/data/espnode.js b/esp/ESPNode/data/espnode.js deleted file mode 100644 index 6b21dc1..0000000 --- a/esp/ESPNode/data/espnode.js +++ /dev/null @@ -1,685 +0,0 @@ -var htmlversion = "2.21 / Jun. 5 2022"; -var msg1_active = 0; -var msg2_active = 0; -var sw1_active = 0; -var sw2_active = 0; -var sw3_active = 0; -var sw4_active = 0; -var sw5_active = 0; -var rf24_active = 0; -var num_sw = 0; -var ledpwm = 0; -var red = 0; -var green = 0; -var blue = 0; -var ledmatrix_active = 0; -var neopixel_active = 0; -var ledpwm_active = 0; -var intervalperiode = 5000; - -$(document).ready(function(){ - $("#titel2").hide(); - $("#msg1").hide(); - $("#msg2").hide(); - $("#sw1").hide(); - $("#sw2").hide(); - $("#sw3").hide(); - $("#sw4").hide(); - $("#sw5").hide(); - $("#sw1txt").hide(); - $("#sw2txt").hide(); - $("#sw3txt").hide(); - $("#sw4txt").hide(); - $("#ledmatrix").hide(); - if ( page == "settings" ) { - $("#div_rf24").hide(); - } - $.getJSON( "/cmd?webcfg1", function( data ) { - $.each( data, function( key, val ) { - prozessJS( key, val ); - }); - if ( page == "index" ) { - var swwidth; - var sw5width; - switch (num_sw) { - case 1: - swwidth = "100%"; - break; - case 2: - swwidth = "50%"; - sw5width = "40%"; - break; - case 3: - swwidth = "33%"; - break; - case 4: - swwidth = "25%"; - break; - } - $("#sw1").css("width",swwidth); - $("#sw2").css("width",swwidth); - $("#sw3").css("width",swwidth); - $("#sw4").css("width",swwidth); - $("#sw5").css("width",sw5width); - if ( ledmatrix_active ) { - for (let y = 0; y < 24; y++) { - $("#display").append("
"); - for (let x = 0; x < 32; x++) { - var z = 32 * y + x; - $("#disp_line_"+y).append("
"); - } - } - } - } - }); - $.getJSON( "/cmd?webcfg2", function( data ) { - $.each( data, function( key, val ) { - prozessJS( key, val ); - }); - }); - $.getJSON('/cmd?message1', function(data) { - $.each( data, function( key, val ) { - prozessJS( key, val ); - }); - }); - if ( page == "sysinfo" ) { - $.getJSON( "/cmd?sysinfo1", function( data ) { - $.each( data, function( key, val ) { - prozessJS( key, val ); - }); - }); - $.getJSON( "/cmd?sysinfo2", function( data ) { - $.each( data, function( key, val ) { - prozessJS( key, val ); - }); - }); - $.getJSON( "/cmd?sysinfo3", function( data ) { - $.each( data, function( key, val ) { - prozessJS( key, val ); - }); - }); - $.getJSON( "/cmd?sysinfo4", function( data ) { - $.each( data, function( key, val ) { - prozessJS( key, val ); - }); - }); - $.getJSON( "/cmd?sysinfo5", function( data ) { - $.each( data, function( key, val ) { - prozessJS( key, val ); - }); - }); - $.getJSON( "/cmd?sysinfo6", function( data ) { - $.each( data, function( key, val ) { - prozessJS( key, val ); - }); - }); - $("#f_htmlversion").html(htmlversion); - $.getJSON( "/cmd?sensor1", function( data ) { - $("#Tab>tbody").append("Sensor: "); - $.each( data, function( key, val ) { - switch(key) { - case "Sensor": - $("#Tab>tbody").append(" Sensor: "+val+" "); - break; - case "Resolution": - $("#Tab>tbody").append(" Resolution: "+val+" "); - break; - case "Temperatur": - $("#Tab>tbody").append(" Temperatur: "+val+" °C"); - break; - case "Messwert": - $("#Tab>tbody").append(" Messwert: "+val+" "); - break; - } - }); - }); - $.getJSON( "/cmd?rf24gw", function( data ) { - $.each( data, function( key, val ) { - switch(key) { - case "gwno": - $("#Tab>tbody").append("RF24 Gateway: "); - $("#Tab>tbody").append(" Gateway Nummer: "+val+" "); - break; - } - }); - }); - } - if ( page == "settings" ) { - $.getJSON( "/cmd?webcfg2", function( data ) { - $.each( data, function( key, val ) { - prozessJS( key, val ); - }); - }); - } - if ( page == "index" ) { - $.getJSON( "/cmd?status", function( data ) { - $.each( data, function( key, val ) { - prozessJS( key, val ); - }); - }); - } - intervalfunction(); - setInterval(intervalfunction, intervalperiode); -}); - -function prozessJS( key, val ) { - switch(key) { - case "titel1": - $("#titel1").html(val); - $("#titel").html(val+" - "+title); - break; - case "titel2": - $("#titel2").html(val); - $("#titel2").show(); - break; - case "msg1": - if ( val == 1 ) { - msg1_active = 1; - $("#msg1").html("


"); - $("#msg1").show(); - } - break; - case "msg2": - if ( val == 1 ) { - msg2_active = 1; - $("#msg2").html("


"); - $("#msg2").show(); - } - break; - case "msg1txt": - $("#msg1txt").html(val); - break; - case "display": - do_display(val); - break; - case "intensity": - $("#slider1label").html("Helligkeit:"+val); - $("#slider1").val(val); - break; - case "sw1": - if ( val == 1 ) { - sw1_active = 1; - num_sw++; - $("#sw1").show(); - do_sw1('state'); - } - break; - case "sw2": - if ( val == 1 ) { - num_sw++; - sw2_active = 1; - $("#sw2").show(); - do_sw2('state'); - } - break; - case "sw3": - if ( val == 1 ) { - num_sw++; - sw3_active = 1; - $("#sw3").show(); - do_sw3('state'); - } - break; - case "sw4": - if ( val == 1 ) { - num_sw++; - sw4_active = 1; - $("#sw4").show(); - do_sw4('state'); - } - break; - case "rf24": - if ( val == 1 ) { - rf24_active = 1; - if ( page == "settings" ) { - $("#div_rf24").show(); - } - } - break; - case "ledmatrix": - if ( val == 1 ) { - num_sw++; - ledmatrix_active = 1; - sw5_active = 1; - fill_ledmatrix(); - $("#ledmatrix").show(); - $("#sw5").show(); - $("#sw5cont").html(""); - $.getJSON( "/cmd?status", function( data ) { - $.each( data, function( key, val ) { - prozessJS( key, val ); - }); - }); - intervalperiode = 30000; - $("#slider1").change(function() { - var wert = $(this).val(); - $("#slider1label").html("Helligkeit: "+wert); - $.get( "/cmd?intensity="+wert, function( data ) { - }); - }); - } - break; - case "ledpwm": - if ( val == 1 ) { - num_sw++; - ledpwm_active = 1; - sw5_active = 1; - $("#sw5").show(); - $("#sw5cont").html(""); - get_ledpwm(); - do_sw1("state"); - $("#slider1").change(function() { - ledpwm = parseInt($(this).val()); - set_ledpwm(); - }); - } - break; - case "neopixel": - if ( val == 1 ) { - num_sw++; - neopixel_active = 1; - sw5_active = 1; - $("#sw5").show().css("height","160px").css("padding-bottom","unset").css("padding-top","unset").css("font-size","smaller"); - $("#sw5cont").html(""); - $("#sw5txt").hide(); - get_rgb(); - do_sw1("state"); - $("#slider1").change(function() { - red = parseInt($(this).val()); - set_rgb(); - }); - $("#slider2").change(function() { - green = parseInt($(this).val()); - set_rgb(); - }); - $("#slider3").change(function() { - blue = parseInt($(this).val()); - set_rgb(); - }); - } - break; - case "IP": - $("#f_localip").html(val); - break; - case "GW-IP": - $("#f_gatewayip").html(val); - break; - case "DnsIP": - $("#f_dnsip").html(val); - break; - case "SSID": - $("#f_ssid").html(val); - break; - case "Channel": - $("#f_channel").html(val); - break; - case "SubNetMask": - $("#f_subnetmask").html(val); - break; - case "BSSID": - $("#f_bssid").html(val); - break; - case "MAC": - $("#f_macaddress").html(val); - break; - case "Hostname": - $("#f_hostname").html(val); - break; - case "ResetReason": - $("#f_resetreason").html(val); - break; - case "CpuFreq": - $("#f_cpufreq").html(val); - break; - case "Freespace": - $("#f_freespace").html(val); - break; - case "Sketchsize": - $("#f_sketchsize").html(val); - break; - case "Heap_max": - $("#f_maxheep").html(val); - break; - case "Heap_free": - $("#f_freeheep").html(val); - break; - case "Heap_frag": - $("#f_heapfrag").html(val+"%"); - break; - case "FlashSize": - $("#f_flashsize").html(val); - break; - case "FlashFreq": - $("#f_flashspeed").html(val); - break; - case "CoreVer": - $("#f_coreversion").html(val); - break; - case "IdeVer": - $("#f_ideversion").html(val); - break; - case "MQTT-Hostname": - $("#f_mqtthostname").html(val); - break; - case "MQTT-Server": - $("#f_mqttserver").html(val); - break; - case "RF24HUB-Server": - $("#f_rf24hubserver").html(val); - break; - case "RF24HUB-Port": - $("#f_rf24hubport").html(val); - break; - case "RF24GW-Port": - $("#f_rf24gwport").html(val); - break; - case "SdkVer": - $("#f_sdkversion").html(val); - break; - case "SW": - $("#f_swversion").html(val); - break; - case "Vcc": - $("#f_vcc").html(val); - break; - case "UpTime": - $("#f_uptime").html(val); - break; - case "logfile": - if ( val == 1 ) $("#logfile").attr('checked', true); - break; - case "logger": - if ( val == 1 ) $("#console").attr('checked', true); - break; - case "log_sensor": - if ( val == 1 ) $("#log_sensor").attr('checked', true); - break; - case "log_rf24": - if ( val == 1 ) $("#log_rf24").attr('checked', true); - break; - case "log_startup": - if ( val == 1 ) $("#log_startup").attr('checked', true); - break; - case "log_mqtt": - if ( val == 1 ) $("#log_mqtt").attr('checked', true); - break; - case "log_webcmd": - if ( val == 1 ) $("#log_webcmd").attr('checked', true); - break; - case "log_sysinfo": - if ( val == 1 ) $("#log_sysinfo").attr('checked', true); - break; - } -} - -function fill_ledmatrix() { - if ( ((sw1_active ==1) && ($("#sw1sw").html() == "Ein")) || (sw1_active == 0) ) { - $.get("/cmd?matrixFB", function(data) { - //alert(data[9]); - for (let i = 0; i < data.length; i++) { - if ( data[i] == "1" ) { - $("#disp_dot_"+i).css("background","white"); - } else { - $("#disp_dot_"+i).css("background","gray"); - } - } - }); - } else { - for (let i = 0; i < 768; i++) { - $("#disp_dot_"+i).css("background","gray"); - } - } -} - -function do_display( val ) { - //alert("display"); - $("#sw1sw").html(val); - if (val == "Ein") { - $("#sw1sw").removeClass("bg_bk").addClass("bg_yl"); - } else { - $("#sw1sw").removeClass("bg_yl").addClass("bg_bk"); - } -} - -function do_sw1( cmd ) { - $.getJSON( "/cmd?sw1="+cmd, function( data ) { - $.each( data, function( key, val ) { - switch(key) { - case "state": - $("#sw1sw").html(val); - if (val == "Ein") { - $("#sw1sw").removeClass("bg_bk").addClass("bg_yl"); - } else { - $("#sw1sw").removeClass("bg_yl").addClass("bg_bk"); - } - break; - case "label": - $("#sw1txt").html(val); - $("#sw1txt").show(); - break; - } - }); - }); -} - -function do_sw2( cmd ) { - $.getJSON( "/cmd?sw2="+cmd, function( data ) { - $.each( data, function( key, val ) { - switch(key) { - case "state": - $("#sw2sw").html(val); - if (val == "Ein") { - $("#sw2sw").removeClass("bg_bk").addClass("bg_yl"); - } else { - $("#sw2sw").removeClass("bg_yl").addClass("bg_bk"); - } - break; - case "label": - $("#sw2txt").html(val); - $("#sw2txt").show(); - break; - } - }); - }); -} - -function do_sw3( cmd ) { - $.getJSON( "/cmd?sw3="+cmd, function( data ) { - $.each( data, function( key, val ) { - switch(key) { - case "state": - $("#sw3sw").html(val); - if (val == "Ein") { - $("#sw3sw").removeClass("bg_bk").addClass("bg_yl"); - } else { - $("#sw3sw").removeClass("bg_yl").addClass("bg_bk"); - } - break; - case "label": - $("#sw3txt").html(val); - $("#sw3txt").show(); - break; - } - }); - }); -} - -function do_sw4( cmd ) { - $.getJSON( "/cmd?sw4="+cmd, function( data ) { - $.each( data, function( key, val ) { - switch(key) { - case "state": - $("#sw4sw").html(val); - if (val == "Ein") { - $("#sw4sw").removeClass("bg_bk").addClass("bg_yl"); - } else { - $("#sw4sw").removeClass("bg_yl").addClass("bg_bk"); - } - break; - case "label": - $("#sw4txt").html(val); - $("#sw4txt").show(); - break; - } - }); - }); -} - -function do_sw5( cmd ) { - if ( ledmatrix_active == 1 ) { - $.get( "/cmd?intensity="+cmd, function( data ) { - //alert("do_sw5: "+data); - }); - } -} - -function set_rgb() { - $("#slider1label").html("Rot: "+red); - $("#slider2label").html("Grün: "+green); - $("#slider3label").html("Blau: "+blue); - var r = red; - var g = green << 8; - var b = blue << 16; - var rgb = r + g + b; - $.get( "/cmd?setrgb="+rgb, function( data ) { - }); -} - -function get_rgb() { - $.get( "/cmd?getrgb", function( data ) { - red = data & 0x0000FF; - green = data & 0x00FF00; - green >>= 8; - blue = data & 0xFF0000; - blue >>= 16; - $("#slider1label").html("Rot: "+red); - $("#slider1").val(red); - $("#slider2label").html("Grün: "+green); - $("#slider2").val(green); - $("#slider3label").html("Blau: "+blue); - $("#slider3").val(blue); - }); -} - -function set_ledpwm() { - $("#slider1label").html("LED: "+ledpwm); - $.get( "/cmd?setledpwm="+ledpwm, function( data ) { - }); -} - -function get_ledpwm() { - $.get( "/cmd?getledpwm", function( data ) { - ledpwm = data; - $("#slider1label").html("LED: "+ledpwm); - $("#slider1").val(ledpwm); - }); -} - -function do_restart() { - var r = confirm("Wirklich neustarten?"); - if (r == true) { - $.get("/restart", function(data) { - alert(data); - }); - } -} - -function dellog() { - $.get("/cmd?dellogfile", function(data) { - alert(data); - }); -} - -function store() { - //alert($("input[name='saveeprom']:checked").val()); - var mycmd = "/cmd?"; - mycmd = mycmd + "saveeprom=" + $("input[name='saveeprom']:checked").val(); - if ( $("#logfile").is(":checked") ) { - mycmd = mycmd + "&logfile=1"; - } else { - mycmd = mycmd + "&logfile=0"; - } - if ( $("#console").is(":checked") ) { - mycmd = mycmd + "&logger=1"; - } else { - mycmd = mycmd + "&logger=0"; - } - if ( $("#log_startup").is(":checked") ) { - mycmd = mycmd + "&log_startup=1"; - } else { - mycmd = mycmd + "&log_startup=0"; - } - if ( $("#log_rf24").is(":checked") ) { - mycmd = mycmd + "&log_rf24=1"; - } else { - mycmd = mycmd + "&log_rf24=0"; - } - if ( $("#log_sensor").is(":checked") ) { - mycmd = mycmd + "&log_sensor=1"; - } else { - mycmd = mycmd + "&log_sensor=0"; - } - if ( $("#log_mqtt").is(":checked") ) { - mycmd = mycmd + "&log_mqtt=1"; - } else { - mycmd = mycmd + "&log_mqtt=0"; - } - if ( $("#log_webcmd").is(":checked") ) { - mycmd = mycmd + "&log_webcmd=1"; - } else { - mycmd = mycmd + "&log_webcmd=0"; - } - if ( $("#log_sysinfo").is(":checked") ) { - mycmd = mycmd + "&log_sysinfo=1"; - } else { - mycmd = mycmd + "&log_sysinfo=0"; - } - //alert(mycmd); - $.get(mycmd, function(data) { - alert(data); - }); -} - -function runCmd() { - var cmd = $("#cmd").val() - $.get('/cmd?'+cmd, function(data) { -// alert(data); - }); -} - -function intervalfunction() { - if ( page == "index" ) { - if ( ledmatrix_active == 1 ) { - fill_ledmatrix(); - } - if ( neopixel_active == 1 ) { - do_sw1("state"); - get_rgb(); - } - if ( ledpwm_active == 1 ) { - do_sw1("state"); - get_ledpwm(); - } - if ( ledmatrix_active == 0 && neopixel_active == 0 && ledpwm_active == 0) { - if ( sw1_active == 1) do_sw1('state'); - } - if ( sw2_active == 1) do_sw2('state'); - if ( sw3_active == 1) do_sw3('state'); - if ( sw4_active == 1) do_sw4('state'); - $.getJSON('/cmd?message1', function(data) { - $.each( data, function( key, val ) { - prozessJS( key, val ); - }); - }); - $.getJSON('/cmd?status', function(data) { - $.each( data, function( key, val ) { - prozessJS( key, val ); - }); - }); - } - if ( page == "console" ) { - $.get('console', function(data) { - $('#console').html(data); - }); - } -} diff --git a/esp/ESPNode/data/help.html b/esp/ESPNode/data/help.html deleted file mode 100644 index 4ee1d79..0000000 --- a/esp/ESPNode/data/help.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - -ESPNode Hilfeseite - - - -

cmd Abfragen

- -

webcfg1

-Wird von jeder der eingebauten Seiten aufgerufen, enthält die konfiguration als JSON. -Folgende Key / Value Paare werden bereitgestellt: - - - - - - -
KeyValueAnmerkung
titel1Text der obersten ZeileMuss vorhanden sein
titel2Text der zweiten ZeileOptional, wenn nicht vorhanden wird die Zeile nicht angezeigt
msg11Soll das 1. Nachrichtenfeld angezeigt werden wird eine "1" gesendet, soll das Feld nicht angezeigt werden entfällt dieser Key
msg21Soll das 2. Nachrichtenfeld angezeigt werden wird eine "1" gesendet, soll das Feld nicht angezeigt werden entfällt dieser Key
- -

webcfg2

-Einstellungen zum Logging - - -

sw1 ... sw4

-Gibt Eigenschaften des Schalters 1...4 als JSON zurück. -Das sind die Keys: state = Ein oder Aus; label = Beschriftungstext des Schalters. - -

sensor1

-Gibt Informationen zum verbauten Sensor als JSON zurück. - - - - - -
KeyValueAnmerkung
typDer SensortypMuss vorhanden sein
TemperaturDie gemessene TemperaturOptional: Bei Temperatursensoren
ResolutionDie Auflösung des SensorsOptional
- -

FHEM

-

Fhem Codeschnipsel, damit auch der Weg FHEM zu DEVICE funktioniert.

-
-  attr MQTT2_wittynode setList RGB_RT:0,1 cmnd/wittynode/RGB_RT $EVTPART1\
-  RGB_BL:0,1 cmnd/wittynode/RGB_BL $EVTPART1\
-  RGB_GN:0,1 cmnd/wittynode/RGB_GN $EVTPART1
-
-

Aufruf in FHEM mit:

-
-  set MQTT2_wittynode RGB_BL 1
-
- - - -Unsortiert: -
-  define MQTT2_ESPNode MQTT2_DEVICE ESPNode
-setuuid MQTT2_ESPNode 6060a478-f33f-88ab-0c6b-389c8e0d6d014b6b
-attr MQTT2_ESPNode IODev MQTT2_FHEM_Server
-attr MQTT2_ESPNode readingList ESPNode:stat/ESPNode/LED:.* LED\
-ESPNode:stat/ESPNode/Line1:.* Line1\
-ESPNode:tele/ESPNode/INFO1:.* { json2nameValue($EVENT) }\
-ESPNode:tele/ESPNode/INFO2:.* { json2nameValue($EVENT) }\
-ESPNode:stat/ESPNode/LED_intensity:.* LED_intensity\
-ESPNode:stat/ESPNode/Line2:.* Line2\
-ESPNode:stat/ESPNode/Line3:.* Line3\
-ESPNode:stat/ESPNode/Grafik:.* Grafik\
-ESPNode:stat/ESPNode/Text:.* Text
-attr MQTT2_ESPNode room MQTT2_DEVICE
-attr MQTT2_ESPNode setList Line1:textField cmnd/ESPNode/Line1 $EVTPART1 \\
-Line2:textField cmnd/ESPNode/Line2 $EVTPART1 \\
-Line3:textField cmnd/ESPNode/Line3 $EVTPART1 \\
-Text:textField cmnd/ESPNode/Text $EVTPART1 \\
-Grafik:textField cmnd/ESPNode/Grafik $EVTPART1 \\
-LED:0,1 cmnd/ESPNode/LED $EVTPART1 \\
-LED_intensity cmnd/ESPNode/LED_intensity $EVTPART1
-define job_every_min at +*0:01 { \
-  fhem("set MQTT2_ESPNode Line1 ".substr($hms,0,5));; \
-}
-setuuid job_every_min 6060d110-f33f-88ab-1ad1-d259bbab254dc700
-attr job_every_min alignTime 17:21
-attr job_every_min room Jobs
-
-Die letzten 3 Backups der fhem.cfg befinden sich unter: /sd_p2/opt/fhem/restoreDir/save/ -(ggf. im Backup suchen) - - - - - diff --git a/esp/ESPNode/data/index.html b/esp/ESPNode/data/index.html deleted file mode 100644 index 6678959..0000000 --- a/esp/ESPNode/data/index.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - -
-
-

Titel1

-

Titel2

-
-
-
-
- Testnachricht -
-
-
- Testnachricht -
-
-
-
???
- -
-
-
???
- -
-
-
???
- -
-
-
???
- -
-
-
-
-
-
-
-
-
-
- - - - - -
- - diff --git a/esp/ESPNode/data/settings.html b/esp/ESPNode/data/settings.html deleted file mode 100644 index a805acb..0000000 --- a/esp/ESPNode/data/settings.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - -
-
-

Titel1

-

Titel2

-
-
-
-
- Logmedium: - -
- -
-
- -
- Zu loggende Inhalte: - -
-
- -
-
- -
- -
- -
- -
-
- -
- Dauerhaft speichern? - -
- -
-
- -
- - - -
- Firmware:
- - -
-
- FileSystem:
- - -
- - - - -
- - diff --git a/esp/ESPNode/data/style.css b/esp/ESPNode/data/style.css deleted file mode 100644 index 73231e2..0000000 --- a/esp/ESPNode/data/style.css +++ /dev/null @@ -1,132 +0,0 @@ -body { - font-family:verdana,sans-serif; - background:#AAAAAA; - color:#111111; - display: flex; - flex-flow: column; - align-items: center; -} -textarea { - resize:vertical; - width:98%; - height:318px; - padding:5px; - overflow:auto; - background:#1f1f1f; - color:#65c115; -} -input { - width:98%; - padding:5px; - background:#1f1f1f; - color:#65c115; -} -label { - text-align:left; -} -.wrapper { - width: 340px; -} -.div_header { - width: 100%; -} -.titel1 { - font-size:20px; - text-align:center; -} -.titel2 { - font-size:15px; - text-align:center; -} -.div_content { - width: 100%; -} -.div_footer { - width: 100%; - text-align:right; - font-size:11px; -} -.msg_div { - width: 100%; - font-size:18px; - text-align: center; -} -.sw_button { - border:2px solid black; - border-radius:3rem; - line-height:2.4rem; - font-size:1.2rem; - width:60px; - height:60px; -} -.sw_label { - height: 1.1rem; - text-align: center; - width: 100%; -} -.sw_div { - padding-top: 2%; - padding-bottom: 2%; - float: left; - text-align: center; -} -.button { -/* border:0;*/ - border-radius:3rem; - line-height:2.4rem; - font-size:1.2rem; - width:100%; - margin-top: 1rem; - padding: unset; -} -.bg_rt { - background:#A80329; - color:#faffff; -} -.bg_gr { - background:#444444; - color:#faffff; -} -.bg_bk { - background:#111111; - color:#faffff; -} -.bg_yl { - background:#FFFF08; - color:#111111; -} -.ledmatrix_div { -/* border:2;*/ - position: relative; - float: left; -} -.ledmatrix_line { - height: 10px; -} -.ledmatrix_dot { - position: relative; - width: 8px; - height: 8px; - background: grey; - display: inline-block; - border: 1px; - border-style: solid; - border-color: black; -} -.tab_left { - text-align: right; -} -.tab_right { - text-align: left; -} -.tab_head { - font-weight: bold; - border-style: double; - text-align: center; -} -.checkbox { - width: 10%; -} -.display { - margin: 10px; -} diff --git a/esp/ESPNode/data/sysinfo.html b/esp/ESPNode/data/sysinfo.html deleted file mode 100644 index 76dcce2..0000000 --- a/esp/ESPNode/data/sysinfo.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - -
-
-

Titel1

-

Titel2

-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Host:
Hostname:
xxx
CPU Speed:
xxx
Flash Size:
xxx
Flash Speed:
xxx
Sketch Size:
xxx
Free Space:
xxx
Heap free:
xxx
Heap max:
xxx
Heap Fragmentation:
xxx
Reset Reason:
xxx
Uptime:
xxx
Vcc:
xxx
MQTT:
MQTT Server:
xxx
MQTT Hostname:
xxx
RF24:
RF24 Hub Server:
xxx
RF24 Hub UDP Port:
xxx
RF24 GW UDP Port:
xxx
Network:
IP Adress:
xxx
Sub Net Mask:
xxx
Gateway IP:
xxx
DNS Server IP:
xxx
SSID:
xxx
Channel:
xxx
BSSID:
xxx
Mac Address:
xxx
Build System:
IDE Version:
xxx
Core Version:
xxx
SDK Version:
xxx
Software Version:
xxx
HTML Version:
xxx
-
- - -
- - diff --git a/esp/ESPNode/dataformat.h b/esp/ESPNode/dataformat.h deleted file mode 100644 index 77bd940..0000000 --- a/esp/ESPNode/dataformat.h +++ /dev/null @@ -1,256 +0,0 @@ -/** - * @file dataformat.h - * @brief As we use our own dataformat it is defined here - * - * Stellt die Funktionen bereit um das Zahlenformat - * für die Übertragung aufzubereiten und nach der - * Übertragung wieder zu dekodieren - * - * Genauigkeit: 1 von 100.000 = 0,01 Promille - * - */ -#ifndef _DATAFORMAT_H_ /* Include guard */ -#define _DATAFORMAT_H_ - -#include -#include -#include -#include -#include -#include "rf24_config.h" -//#include "config.h" - -/** - * @defgroup datafmt Definitions to the own dataformat - * @addtogroup datafmt - * @brief All precompiler macros for the dataformat start with "ZF_" - * @{ - */ - -/// Rückgabewerte der Funktion getDataType(data) -/// Hier: float -#define ZF_FLOAT 0 - -/// Rückgabewerte der Funktion getDataType(data) -/// Hier: Signed Integer 16 bit -#define ZF_INT 1 - -/// Rückgabewerte der Funktion getDataType(data) -/// Hier: Unsigned Integer 16 bit -#define ZF_UINT 2 - -/// Rückgabewerte der Funktion getDataType(data) -/// Hier: Char -#define ZF_CHAR 3 - -/// Rückgabewerte der Funktion getDataType(data) -/// Hier: Unbekannt -#define ZF_UNKNOWN 9 - -/// Anzahl der Rechtsschiebungen um den Channel als normale Zahl darzustellen -/// channel = (data & ZF_CHANNEL) >> ZF_SHIFT_CHANNEL -#define ZF_SHIFT_CHANNEL 23 - -/// Anzahl der Rechtsschiebungen um den Exponenten (bei float) als normale Zahl darzustellen -/// exponent = (data & ZF_EXPO_WERT) >> ZF_SHIFT_EXPO -#define ZF_SHIFT_EXPO 17 - -/// Anzahl der Rechtsschiebungen um den Channel als normale Zahl darzustellen -/// dataformat = (data & ZF_FORMAT) >> ZF_FORMAT -#define ZF_SHIFT_FORMAT 30 - -/// Datenformat float zur Bildung von data im eigenen Format -#define ZF_FORMAT_FLOAT 0b00000000000000000000000000000000 - -/// Datenformat integer zur Bildung von data im eigenen Format -#define ZF_FORMAT_INT 0b01000000000000000000000000000000 - -/// Datenformat unsigned integer zur Bildung von data im eigenen Format -#define ZF_FORMAT_UINT 0b10000000000000000000000000000000 - -/// Datenformat char zur Bildung von data im eigenen Format -#define ZF_FORMAT_CHAR 0b11000000000000000000000000000000 - -/// Digits in denen beim eigenen Zahlenformat der Datentyp gespeichert wird -#define ZF_FORMAT 0b11000000000000000000000000000000 - -/// Digits in denen beim eigenen Zahlenformat der Channel gespeichert wird -#define ZF_CHANNEL 0b00111111100000000000000000000000 - -/// Digit in dem beim eigenen Zahlenformat das Vorzeichen der Zahl (1 = negativ) gespeichert wird -#define ZF_ZAHL_NEGATIV 0b00000000010000000000000000000000 - -/// Digit in dem beim eigenen Zahlenformat das Vorzeichen des Exponenten (1 = negativ) gespeichert wird -#define ZF_EXPO_NEGATIV 0b00000000001000000000000000000000 - -/// Digits in denen beim eigenen Zahlenformat der Betrag des Exponenten gespeichert wird -#define ZF_EXPO_WERT 0b00000000000111100000000000000000 - -/// Digits in denen beim eigenen Zahlenformat für den Datentyp Float der Betrag der Mantisse gespeichert wird -#define ZF_ZAHL_WERT_FLOAT 0b00000000000000001111111111111111 - -/// Digits in denen beim eigenen Zahlenformat für den Datentyp Integer der Betrag der Zahl gespeichert wird -#define ZF_ZAHL_WERT_INT 0b00000000000000000111111111111111 - -/// Digits in denen beim eigenen Zahlenformat für den Datentyp Unsigned Integer der Betrag der Zahl gespeichert wird -#define ZF_ZAHL_WERT_UINT 0b00000000000000001111111111111111 - -/** - * @brief Beschreibung des verwendeten Zahlenformates zur Übertragung (TransportWert) - * Es handelt sich um ein 32 Bit unsigned Integer Format. - * Der Sensorwert wird mit einer Genauigkeit von 17 Bit - * (131072 max, genutzt 100000 = 5 Stellen = 0,01 Promille) gespeichert. - * Zahlenformat X * 10^Y - * Format des Sensorwertes - * Bitreihenfolge: Bit 1 (MSB) ... Bit 32 (LSB) - * - * 1) FLOAT - * Bit 1..2: Verwendetes Zahlenformat (0b00) - * Bit 3..9: Sensornummer (1..127) - * Bit 10: Vorzeichen (0=positiv; 1=negativ) - * Bit 11: Vorzeichen Exponent (0=10^X; 1=10^-X) - * Bit 12..15 Exponent (0..15) - * Bit 16..32 Mantisse (0..100000) - * - * 2) INTEGER - * Bit 1..2: Verwendetes Zahlenformat (0b01) - * Bit 3..9: Sensornummer (1..127) - * Bit 10: Vorzeichen (0=positiv; 1=negativ) - * Bit 11..17: ungenutzt - * Bit 18..32 15 bit unsigned Integer (0..32767) - * - * 3) UNSIGNED INTEGER - * Bit 1..2: Verwendetes Zahlenformat (0b10) - * Bit 3..9: Sensornummer (1..127) - * Bit 11..16: ungenutzt - * Bit 17..32 16 bit unsigned Integer (0..65536) - * - * 4) CHARACTER (2 Characters) - * Bit 1..2: Verwendetes Zahlenformat (0b11) - * Bit 3..9: Sensornummer (1..127) - * Bit 11..16: ungenutzt - * Bit 17..32 2*8 bit Char - * - */ - -/** - * Diese Funktion ist nur für das Debugging des Zahlenformates bestimmt !!!!! - */ -void printBits(size_t const size, void const * const ptr); - -/** - * Verpackt die Sensornummer und den Messwert zu einem - * TransportWert des Datentyps uint32_t. - * @param channel Der Channel, gültige Werte zwischen 1..127 - * @param value: gültige Werte: -1*10^19 .. 1*10^19 - * @return Der Transportwert - */ -uint32_t calcTransportValue(uint8_t channel, float value); - -/** - * Verpackt die Sensornummer und den Messwert zu einem - * TransportWert des Datentyps uint32_t. - * @param channel Der Channel, gültige Werte zwischen 1..127 - * @param value: Der Wert, gültige Werte: 0 .. 65535 - * @return Der Transportwert - */ -uint32_t calcTransportValue(uint8_t channel, uint16_t value); - -/** - * Verpackt die Sensornummer und den Messwert zu einem - * TransportWert des Datentyps uint32_t. - * @param channel gültige Werte zwischen 1..127 - * @param value: gültige Werte: -32,768 to 32,767 - * @return Der Transportwert - */ -uint32_t calcTransportValue(uint8_t channel, int16_t value); - -/** - * Verpackt die Sensornummer und 2 Zeichen zu einem TransportWert - * des Datentyps uint32_t. - * @param channel gültige Werte zwischen 1..127 - * @param value1: Ein beliebiger Character (8bit) - * @param value2: Ein beliebiger Character (8bit) - * @return Der Transportwert - ******************************************************/ -uint32_t calcTransportValue(uint8_t channel, char* value1, char* value2); - -/** - * Entpackt die übertragenen Daten - * @note Der übergebene **buf** muss gross genug sein um den Rückgabewert aufzunehmen - * - */ -char* unpackTransportValue(uint32_t data, char* buf); - -//#if defined(__linux__) - -/** - * Diese Funktion packt die Daten entsprechend des übergebenen Datatypes ein. - * @note Diese Funktion läuft wegen den verwendetetn C Funktionen nur auf Linux Systemen - * @param channel Der Channel - * @param value Der Wert als String - * @param dataType Der Datentyp - * @return Den gepackten Transportwert - */ -uint32_t calcTransportValue(uint8_t channel, char* value, uint8_t dataType); - -/** - * Diese Funktion packt die Daten ein. - * Ist der Value eine Fließkommazahl (enthält einen "." als Dezimaltrenner) wird der Datatype FLOAT verwendet, - * sonst int16. - * @note Diese Funktion läuft wegen den verwendetetn C Funktionen nur auf Linux Systemen - * @param channel Der Channel - * @param value Der Wert als String - * @return Den gepackten Transportwert - */ -uint32_t calcTransportValue(uint8_t channel, char* value); - -//#endif - -/** - * Extrahiert den Datentyp aus den Transportdaten - * Dabei gilt folgende Zuordnung: - * 0 => float Value - * 1 => integer Value - * 2 => unsigned int Value - * 3 => Character - * @param data Der Transportwert - * @return Der verwendete Datentyp - */ -uint8_t getDataType(uint32_t data); - -/** - * Extrahiert die Channel aus dem Transportwert - * @param data Der Transportwert - * @return Der verwendete Channel - */ -uint8_t getChannel(uint32_t data); - -/** - * Extrahiert den Sensorwert aus dem Transportwert - * Hier: Float - * @param data Der Transportwert - * @param zahl Ein Zeiger auf eine FLOAT Variable, hier wird das Ergebnis hinterlegt. - * @return "true" wenn im Transportwert ein float eingepackt war, wurde eine Konvertierung durchgeführt wird ein "false" zurückgegeben. - */ -bool getValue(uint32_t data, float* zahl); - -/** - * Extrahiert den Sensorwert aus dem Transportwert - * Hier: Integer (15 Bit + Vorzeichen) - * @param data Der Transportwert - * @param zahl Ein Zeiger auf eine int16_t Variable, hier wird das Ergebnis hinterlegt. - * @return "true" wenn im Transportwert ein int16_t eingepackt war, wurde eine Konvertierung durchgeführt wird ein "false" zurückgegeben. - */ -bool getValue(uint32_t data, int16_t* zahl); - -/** - * Extrahiert den Sensorwert aus dem Transportwert - * Hier: unsigned int (16 Bit) - * @param data Der Transportwert - * @param zahl Ein Zeiger auf eine uint16_t Variable, hier wird das Ergebnis hinterlegt. - * @return "true" wenn im Transportwert ein uint16_t eingepackt war, wurde eine Konvertierung durchgeführt wird ein "false" zurückgegeben. - */ -bool getValue(uint32_t data, uint16_t* zahl); - -#endif diff --git a/esp/ESPNode/dataformat.ino b/esp/ESPNode/dataformat.ino deleted file mode 100644 index 31b2736..0000000 --- a/esp/ESPNode/dataformat.ino +++ /dev/null @@ -1,303 +0,0 @@ -#include "dataformat.h" - -// some forward declaration -float getValue_f(uint32_t data); -int16_t getValue_i(uint32_t data); -uint16_t getValue_ui(uint32_t data); -// END some forward declaration - -// This function is only for debugging -void printBits(size_t const size, void const * const ptr) { - unsigned char *b = (unsigned char*) ptr; - unsigned char byte; - int i, j; - - for (i = size-1; i >= 0; i--) { - for (j = 7; j >= 0; j--) { - byte = (b[i] >> j) & 1; - printf("%u", byte); - } - } - puts(""); -} -// END This function is only for debugging - - -uint32_t calcTransportValue(uint8_t channel, float value) { - float _val = value; - uint32_t ui_val = 0; - uint32_t exponent = 0; - bool expo_negativ = false; - uint32_t result = 0; - result = ((uint32_t)channel << ZF_SHIFT_CHANNEL); - if ( value > 0.00001 || value < -0.00001 ) { - bool negativ = value < 0.0; - if ( negativ ) { - result |= ZF_ZAHL_NEGATIV; - _val *= -1; - } - while ( _val < 6553.6 ) { - expo_negativ = true; - exponent++; - _val *= 10.0; - } - if ( expo_negativ ) { - result |= ZF_EXPO_NEGATIV; - } - while ( _val > 65536.0 ) { - exponent++; - _val /= 10.0; - } - ui_val = 1 * _val; - ui_val &= ZF_ZAHL_WERT_FLOAT; - exponent <<= ZF_SHIFT_EXPO; - result |= ZF_FORMAT_FLOAT; - result |= exponent; - result |= ui_val; - } - return result; -} - -uint32_t calcTransportValue(uint8_t channel, uint16_t value) { - uint32_t result = 0; - result = (uint32_t)channel << ZF_SHIFT_CHANNEL; - result &= ZF_CHANNEL; - result |= ((uint32_t)value & ZF_ZAHL_WERT_UINT); - result |= ZF_FORMAT_UINT; - return result; -} - -uint32_t calcTransportValue(uint8_t channel, int16_t value) { - uint32_t result = 0; - result = (uint32_t)channel << ZF_SHIFT_CHANNEL; - result &= ZF_CHANNEL; - result |= ((uint32_t)value & ZF_ZAHL_WERT_INT); - result |= ZF_FORMAT_INT; - return result; -} - -uint32_t calcTransportValue(uint8_t channel, char value1, char value2) { - uint32_t result = 0; - uint32_t c2 = value2<<8; - uint32_t c1 = value1; - result = channel; - result <<= ZF_SHIFT_CHANNEL; - result &= ZF_CHANNEL; - result = result | ZF_FORMAT_CHAR | c1 | c2; - return result; -} - -#if defined(__linux__) || defined(ESP8266) -uint32_t calcTransportValue(uint8_t channel, char* value, uint8_t dataType) { - uint32_t retval = 0; - char* pEnd; - switch ( dataType ) { - case ZF_FLOAT: - { - float val_f = strtof(value, &pEnd); - retval = calcTransportValue(channel, val_f); - } - break; - case ZF_INT: - { - int16_t val_i = (int16_t)strtol(value, &pEnd, 10); - retval = calcTransportValue(channel, val_i); - } - break; - case ZF_UINT: - { - uint16_t val_ui = (uint16_t)strtoul(value, &pEnd, 10); - retval = calcTransportValue(channel, val_ui); - } - break; - case ZF_CHAR: - // ToDo Wort kann ein kompletter Text sein, das in verschiedene Channels zerlegt wird - // Max Länge 20*3=60 Zeichen - break; - } - return retval; -} - -uint32_t calcTransportValue(uint8_t channel, char* value) { - uint8_t dataType = ZF_UNKNOWN; - for (size_t i=0; i= 'a' && value[i] <= 'z') || (value[i] >= 'A' && value[i] <= 'Z') ) dataType = ZF_CHAR; - } - if ( dataType == ZF_CHAR || dataType == ZF_UNKNOWN ) { - if ( value[0] >= '0' && value[0] <= '9' ) dataType = ZF_UINT; - } - if ( dataType == ZF_CHAR || dataType == ZF_UINT || dataType == ZF_UNKNOWN ) { - if ( value[0] == '-' ) dataType = ZF_INT; - } - for (size_t i=0; i 32768) && (dataType == ZF_INT)) || ((val_f > 65536) && (dataType == ZF_UINT)) ) dataType = ZF_FLOAT; - return calcTransportValue(channel, value, dataType); -} - -#endif - - -bool getValue(uint32_t data, float* zahl) { - bool retval = false; - if ( getDataType(data) == ZF_FLOAT ) { - *zahl = getValue_f(data); - retval = true; - } - if ( getDataType(data) == ZF_INT ) { - *zahl = (float)getValue_i(data); - retval = false; - } - if ( getDataType(data) == ZF_UINT ) { - *zahl = (float)getValue_ui(data); - retval = false; - } - return retval; -} - -bool getValue(uint32_t data, int16_t * zahl) { - bool retval = false; - if ( getDataType(data) == ZF_FLOAT ) { - *zahl = (int16_t)getValue_f(data); - retval = false; - } - if ( getDataType(data) == ZF_INT ) { - *zahl = getValue_i(data); - retval = true; - } - if ( getDataType(data) == ZF_UINT ) { - *zahl = (int16_t)getValue_ui(data); - retval = false; - } - return retval; -} - -bool getValue(uint32_t data, uint16_t* zahl) { - bool retval = false; - if ( getDataType(data) == ZF_FLOAT ) { - *zahl = (uint16_t)getValue_f(data); - retval = false; - } - if ( getDataType(data) == ZF_INT ) { - *zahl = (uint16_t)getValue_i(data); - retval = false; - } - if ( getDataType(data) == ZF_UINT ) { - *zahl = getValue_ui(data); - retval = true; - } - return retval; -} - -uint8_t getDataType(uint32_t data) { - uint8_t retval; - retval = ((data & ZF_FORMAT) >> ZF_SHIFT_FORMAT); - return retval; -} - -uint8_t getChannel(uint32_t data) { - uint8_t retval; - retval = (data & ZF_CHANNEL) >> ZF_SHIFT_CHANNEL; - return retval; -} - -char* unpackTransportValue(uint32_t data, char* buf) { - uint8_t dataType = getDataType(data); - switch ( dataType ) { - case ZF_FLOAT: - { - float myval; - getValue(data, &myval); - if ( myval > 500 ) { -#if defined(__linux__) || defined(ESP8266) - snprintf(buf,9,"%.1f", myval); -#else - dtostrf(myval, 4, 0, buf); -#endif - } else { - if ( myval > 9.9 ) { -#if defined(__linux__) || defined(ESP8266) - snprintf(buf,9,"%.2f", myval); -#else - dtostrf(myval, 4, 1, buf); -#endif - } else { -#if defined(__linux__) || defined(ESP8266) - snprintf(buf,9,"%.3f", myval); -#else - dtostrf(myval, 4, 2, buf); -#endif - } - } - } - break; - case ZF_INT: - { - int16_t myval; - getValue(data, &myval); - sprintf(buf,"%d",myval); - } - break; - case ZF_UINT: - { - uint16_t myval; - getValue(data, &myval); - sprintf(buf,"%u",myval); - } - break; - case ZF_CHAR: - // ToDo Wort kann ein kompletter Text sein, das in verschiedene Channels zerlegt wird - // Max Länge 20*3=60 Zeichen - break; - } - return buf; -} - -/*************************************** - * getValue_? sind nur modulintern und deshalb - * nicht in dataformat.h deklariert !!!!! - **************************************/ -float getValue_f(uint32_t data) { - float zahl; - if ( getDataType(data) == ZF_FLOAT ) { - uint32_t exponent = (data & ZF_EXPO_WERT) >> 17; - bool expo_negativ = data & ZF_EXPO_NEGATIV; - bool zahl_negativ = data & ZF_ZAHL_NEGATIV; - zahl = data & ZF_ZAHL_WERT_FLOAT; - if ( expo_negativ ) { - for (uint8_t i=exponent;i>0;i--) { - zahl /= 10.0; - } - } else { - for (uint8_t i=exponent;i>0;i--) { - zahl *= 10.0; - } - } - if ( zahl_negativ ) { - zahl *= -1.0; - } - } - return zahl; -} - -int16_t getValue_i(uint32_t data) { - int16_t zahl; - if ( getDataType(data) == ZF_INT ) { - zahl = data & ZF_ZAHL_WERT_INT; - } - return zahl; -} - -uint16_t getValue_ui(uint32_t data) { - uint16_t zahl; - if ( getDataType(data) == ZF_UINT ) { - zahl = data & ZF_ZAHL_WERT_UINT; - } - return zahl; -} - diff --git a/esp/ESPNode/defaults.h b/esp/ESPNode/defaults.h deleted file mode 100644 index 90c01de..0000000 --- a/esp/ESPNode/defaults.h +++ /dev/null @@ -1,71 +0,0 @@ -// Part 1: global defaults -#define MAGICNO 1235 -#define HOSTNAME "testnode" -// Infosize wird für den info_str benötigt. Hier werden z.B. die JSON Strings gespeichert. -// Der derzeit größte String ist die Framebufferabbildung (32*24+1 Byte)!!! -#define INFOSIZE 1000 -#define LOGGER_NUMLINES 25 -#define LOGGER_LINESIZE 250 - -// MQTT -#define MQTT -#define MQTT_SERVER "rpi1.fritz.box" -#define MQTT_NODENAME "testnode" -#define MQTT_CMD "cmnd" -#define TOPIC_PART1_SIZE 5 -#define TOPIC_PART2_SIZE 20 -#define TOPIC_PART3_SIZE 20 -#define STATINTERVAL 300000 -#define TELEINTERVAL 900000 -#define TOPIC_BUFFER_SIZE 50 -#define MQTT_CMD "cmnd" -#define TOPIC_PART1_SIZE 5 -#define TOPIC_PART2_SIZE 20 -#define TOPIC_PART3_SIZE 20 - -// Sensors and Actors -#define NOSENSOR -#define SWITCH1_DEFAULT LOW -#define SWITCH2_DEFAULT LOW -#define SWITCH3_DEFAULT LOW -#define SWITCH4_DEFAULT LOW -#define ONE_WIRE_BUS 4 -#define SENSOR_18B20_RESOLUTION 12 - - -// Part 2: individual defaults -// LEDMATRIX -#define LEDMATRIX_CLK 5 /* D1 */ -#define LEDMATRIX_CS 2 /* D4 */ -#define LEDMATRIX_DIN 0 /* D3 */ -#define LEDMATRIX_DEVICES_X 4 -#define LEDMATRIX_DEVICES_Y 3 -#define LINE_SIZE 10 -#define GRAFIK_SIZE 40 -#define TEXT_SIZE 15 -#define LED_MATRIX_ANIM_DELAY 100 - -// for rf24gw -#define RF24_HUB_SERVER "rpi1.fritz.box" -#define RF24_HUB_UDP_PORTNO 7004 -#define RF24_GW_UDP_PORTNO 7003 -#define RF24_RADIO_CE_PIN 15 -#define RF24_RADIO_CSN_PIN 16 -#define RF24_GW_VERBOSECRITICAL 0b0000000000000001 -#define RF24_GW_VERBOSESTARTUP 0b0000000000000010 -#define RF24_GW_VERBOSERF24 0b0000000010000000 -#define RF24_GW_STARTUPVERBOSELEVEL 0b0000000000000011 - -// for witty cloud -#define WITTY_RGB_BL 13 -#define WITTY_RGB_GN 12 -#define WITTY_RGB_RT 15 -#define WITTY_INT_LED 2 -#define WITTY_LDR A0 - -// for Neopixel -#define NEOPIXELPIN 2 - -// for LedPwm -#define LEDPWM_PIN 0 -#define LEDPWMINIT 10 diff --git a/esp/ESPNode/rf24_config.h b/esp/ESPNode/rf24_config.h deleted file mode 100644 index 014ef1e..0000000 --- a/esp/ESPNode/rf24_config.h +++ /dev/null @@ -1,285 +0,0 @@ -#ifndef RF24_CONFIG_H -#define RF24_CONFIG_H - -/** - * @file rf24_config.h - * @brief Definition der RF24 Parameter - * Diese Datei wird vom GW, vom Hub und von den Nodes eingebunden !!! - * Hier sind alle Parameter zum RF24-Netzwerk und die Register definiert. - * Zusätzlich sind hier die Payload Struktur und diee Udpdata Struktur definiert. - */ - -/** @defgroup rf24makros RF24 Makros - * @addtogroup rf24makros - * @brief Definition der RF24 Netzwerk Einstellungen - * @{ - */ -///Der verwendete RF24 Funkkanal -#define RF24_CHANNEL 92 -/// Die Übertragungsgeschwindigkeit -#define RF24_SPEED RF24_250KBPS -/// Der Netzwerkschlüssel Hub zum Node -#define RF24_HUB2NODE { 0xf0, 0xcc, 0xfc, 0xcc, 0xcc} -/// Der Netzwerkschlüssel Node zum Hub -#define RF24_NODE2HUB { 0x33, 0xcc, 0xfc, 0xcc, 0xcc} -/// Der Datentyp für die Node_ID. Ist aktuell auf 1...255 festgelegt. Werden mehr Nodes benötigt, kann der Datentyp hier zentral umgestellt werden. -#define NODE_DATTYPE uint8_t -/// Der Datentyp für die Ordernummer. Auch hier eine zentrale Festlegung des Datentyps, der ggf. die Umstellung vereinfacht. -#define ONR_DATTYPE uint8_t -/// @} - -/** - * @defgroup reggrp Definition der Registergruppen - * @addtogroup reggrp - * Definition der Channel Verteilung (generische Definitionen und Sonderbehandlung) - * Achtung: Bereiche müssen streng getrennt sein und dürfen sich nicht überschneiden - * Es werden folgende Bereiche unterschieden:
- * SENSOR_CHANNEL: In diesem Bereich sind die normalen Sensoren und Aktoren angesiedelt.
- * SENSOR_BATT: Ein Sensor mit Sonderbehandlung für die Batterie im Bereich der normalen Sensoren
- * REG_NOSTORE: Hier sind die Register angesiedelt deren Inhalte (im Node) einmal verarbeitet und dann vergessen werden.
- * REG_NORMAL: Normale Register, die geschrieben, gelesen und wieder überschrieben werden können.
- * REG_READONLY: Register, die nur gelesen werden können.
- * - * @{ - */ -/// Erster normaler Sensorchannel -#define SENSOR_CHANNEL_FIRST 1 -/// Letzter normaler Sensorchannel -#define SENSOR_CHANNEL_LAST 79 -/// Erstes Register, das vom Hub nicht gespeichert wird -#define REG_NOSTORE_FIRST 80 -/// Letztes Register, das vom Hub nicht gespeichert wird -#define REG_NOSTORE_LAST 89 -/// Erstes Register gilt die normale Behandlung -#define REG_NORMAL_FIRST 90 -/// Letztes Register gilt die normale Behandlung -#define REG_NORMAL_LAST 120 -/// Erstes Read only Register -#define REG_READONLY_FIRST 121 -/// Letztes Read only Register -#define REG_READONLY_LAST 127 -/// @} - -/** - * @defgroup reg Definition der Register - * @addtogroup reg - * Definition der Kontrollregister
- * Nicht jedes Register ist in jedem Node verfügbar. Dies ist abhängig von der verbauten Hardware und der eingespielten Software. - * @{ - */ -/// Sensor für den Spannungswert der Batterie auf Channel 79 -#define SENSOR_BATT 79 -/// Einmalige Korrektur der Schlafzeit in Sekunden -/// Format: int16_t; Wertebereich: -1000 ... 1000 -#define REG_SLEEPTIME_KOR 80 -/// Schreiben eines beliebigen Wertes startet den Registertransfer zum Hub. -/// Format: uint16_t; Wertebereich: beliebig -#define REG_TRANSREG 81 -/// Schreiben eines beliebigen Wertes startet die PA Messung. -/// Format: uint16_t; Wertebereich: beliebig -#define REG_TRANSPA 82 -/// Schreiben eines beliebigen Wertes in dieses Register setzt alle EEPROM Werte auf Default zurück. -/// Format: uint16_t; Wertebereich: beliebig -#define REG_DEFAULT 83 -/// EntladeSpannung Level 1
-/// Bei Überschreiten dieser Spannung wird der ATMega nicht mehr in den Schlafmodus versetzt. -/// Format: float; Wertebereich: 1...20 -#define REG_DISCHARGE_LEV1 91 -/// EntladeSpannung Level 2
-/// Bei Überschreiten dieser Spannung wird die Batterie zusätzlich über einen Widerstand entladen. -/// Format: float; Wertebereich: 1...20 -#define REG_DISCHARGE_LEV2 92 -/// EntladeSpannung Level 2
-/// Bei Überschreiten dieser Spannung wird die Batterie zusätzlich über einen Widerstand entladen. -/// Format: float; Wertebereich: 1...20 -#define REG_DISCHARGE_LEV3 93 -/// Maximal zulässige Differenzspannung bei 2 Batterien. -/// Wird diese Spannung überschritten, wirden die Spannungspegel durch gezieltes laden/entladen angepasst. -#define REG_LOAD_BALLANCER 94 -/// Kontrastpegel (nur bei Displays) -#define REG_CONTRAST 95 -/// Helligkeitspegel (nur bei Displays) -#define REG_BRIGHTNES 96 -/// Spannungskorrekturfaktor -/// U = Umess * factor + offset -/// Format: float; Wertebereich: 0.1 ... 10; Default: 1 -#define REG_VOLT_FAC 110 -/// Spannungsoffset -/// U = Umess * factor + offset -/// Format: float; Wertebereich: -10 ... 10; Default: 0 -#define REG_VOLT_OFF 111 -/// Low Voltage Level -/// Bei unterschreiten dieser Spannung geht der Node in den Low Voltage Modus. Dann gilt die SLEEPTIME_LV. -/// Format: float; Wertebereich: 1 ... 5; Default: 2 -#define REG_VOLT_LV 112 -/// Schlafzeit im Low Voltgage Modus -/// Der einstellbare Bereich liegt von 10 Sekunden bis 9 Stunden (=32400 Integer Begrenzung) -/// Format: uint16_t; Wertebereich: 10 ... 32400; Default: 900 -#define REG_SLEEPTIME_LV 113 -/// Normale Schlafzeit -/// Der einstellbare Bereich liegt von 10 Sekunden bis 9 Stunden (=32400 Integer Begrenzung) -/// Format: uint16_t; Wertebereich: 10 ... 32400; Default: 300 -#define REG_SLEEPTIME 114 -/// Feinjustierung der Sekunden für den Tiefschlaf -/// Format: uint16_t; Wertebereich: 500 ... 2000; Default: 1000 -#define REG_SLEEP4MS_FAC 115 -/// Verzögerung zwischen zwei Sendungen/Sendewiederholung -/// Format: uint16_t; Wertebereich: 50 ... 1000; Default: 500 -#define REG_SENDDELAY 116 -/// Maximale Anzahl von Sendeversuchen für normale Sendungen -/// Format: uint16_t; Wertebereich: 1 ... 20; Default: 10 -#define REG_MAX_SENDCOUNT 117 -/// Maximale Anzahl von Sendeversuchen für stopp Sendungen -/// Format: uint16_t; Wertebereich: 1 ... 20; Default: 3 -#define REG_MAX_STOPCOUNT 118 -/// Anzahl der Loops ohne Sendungen -/// Format: uint16_t; Wertebereich: 0 ... 20; Default: 0 -#define REG_EMPTYLOOPS 119 -/// Sendefeldstärke -/// Legt die Felstärke fest mit der dieser Node sendet. 1 = Min(-18dbm), 2 = Low(-12dbm), 3 = High(-6dbm), 4 = Max(0dbm) -/// Format: uint16_t; Wertebereich: 0 ... 3; Default: 3 -#define REG_PALEVEL 120 -/// Empfangsfeldstärke -/// Legt die Felstärke fest mit der dieser Node vom Hub empfangen wurde. -/// 0 = Min(-18dbm), 1 = Low(-12dbm), 2 = High(-6dbm), 3 = Max(0dbm) -/// Format: uint16_t; Wertebereich: 0 ... 3; -/// Diese Information wird nicht zum Node übertragen -#define REG_RECLEVEL 121 -/// Softwarestand -/// Wird im Format XYZZ übertragen: X=Release, Y=Subrelease, ZZ=Änderungszähler -/// Format: uint16_t; Wertebereich: 0 ... 20; Default: 0 -#define REG_SW 125 -/// @} - -/** - * @defgroup msgflg Definition der Messageflags - * @addtogroup msgflg - * Definition der Messageflags => Payload Message Flags - * @{ - */ - -/// Leeres Messageflag -#define PAYLOAD_FLAG_EMPTY 0b00000000 -/// Flag zeigt an das diese Nachricht die letzte (Teil-)Nachricht war -#define PAYLOAD_FLAG_LASTMESSAGE 0b00000001 -/// Flag zeigt an das die Spannung im Node kritisch ist -#define PAYLOAD_FLAG_LOWVOLTAGE 0b00000010 -///@} - - -/** - * @defgroup msgtyp Definition der Messagetypen - * @addtogroup msgtyp - * Nachrichten werden in abhängigkeit von ihrem Nachrichtentyp im Hub unterschiedlich behandelt. - * Sonderfall Ping zur Feldstärkenmessung: - * Ein Ping geht immer vom Node aus. Durch die unterschiedlichen Sendeleistungen kann die Qualität der Funkverbindung beurteilt werden. - * - * @{ -*/ - -/// Nachricht ist ein Init -/// Ursprung: Node; Empfänger: Hub -#define PAYLOAD_TYPE_INIT 1 - -/// Nachricht ist ein Messwert aus einem ESPNode -/// Ursprung: ESPNode; Empfänger: Hub -/// Diese Nachricht wird nicht vom Hub beantwortet -#define PAYLOAD_TYPE_ESP 41 - -/// Nachricht ist ein Heatbeat -/// Ursprung: Node; Empfänger: Hub -#define PAYLOAD_TYPE_HB 51 - -/// Nachricht ist eine Quittung für einen Heatbeat, -/// Alle 6 data Felder sind leer (0) -/// Ursprung: Hub; Empfänger: Node -#define PAYLOAD_TYPE_HB_RESP 52 - -/// Daten Nachricht, erfolgt als Antwort auf einen Heartbeat wenn der Hub dem Node etwas mitteilen möchte. -/// Ursprung: Hub; Empfänger: Node -#define PAYLOAD_TYPE_DAT 61 - -/// Antwort auf Daten Nachricht -/// verarbeitete Daten werden unverändert zurückgesand -/// Ursprung: Node; Empfänger: Hub -#define PAYLOAD_TYPE_DATRESP 62 - -// Antwort auf Datenantwort(PAYLOAD_TYPE_DATRES) / Stoppnachricht -// Alle Datenfelder sind leer -// Ursprung: Hub; Empfänger: Node -#define PAYLOAD_TYPE_DATSTOP 63 - -/// Nachricht ist ein Ping. -/// Sendeleistung ist Minimal (-18 dBm) -#define PAYLOAD_TYPE_PING_POW_MIN 101 -/// Nachricht ist ein Ping. -/// Sendeleistung ist Low (-12 dBm) -#define PAYLOAD_TYPE_PING_POW_LOW 102 -/// Nachricht ist ein Ping. -/// Sendeleistung ist High (-6 dBm) -#define PAYLOAD_TYPE_PING_POW_HIGH 103 -/// Nachricht ist ein Ping. -/// Sendeleistung ist Max ( 0 dBm) -#define PAYLOAD_TYPE_PING_POW_MAX 104 -/// Nachricht ist ein Ping. -/// Ende des Tests Sendeleistung ist Max ( 0 dBm) -#define PAYLOAD_TYPE_PING_END 105 -/// @} - -/** - * @typedef payload_t Die Datenstructur zur Übertragung der Daten zwischen Gateway und Node - * In der aktuellen Struktur können bis zu 6 Transprortwerte (Vereinigeung von Channel und Wert) transportiert werden. - * Der nrf24l01 kann einen Payload von 32byte transportieren. dieser Datentyp ist genau 32bylte lang. - */ -typedef struct { -/// Die Node_ID ist der eindeutige Identifizierer für einen Node. -/// Aktuell können hier die Nodes 1..255 genutzt werden (8 Bit Begrenzung) -/// Damit der Datentyp einfach gewechselt werden kann ist er nur indirekt festgelegt. - NODE_DATTYPE node_id; -/// Die MSG_ID ist der eindeutige Identifizierer einer Nachricht. -/// Muss einen Nachricht wiederholt werden, wird sie hochgezählt. - uint8_t msg_id; -/// Art der Nachricht, Definition siehe Nachrichtentyp. - uint8_t msg_type; -/// Nachrichtenflag, Definition siehe Nachrichtenflags. - uint8_t msg_flags; -/// Ordernummern werden im Hub verwaltet und dort nach jeder Order hochgezählt. -/// Auf eine Anfrage vom Hub wird immer mit der selben Ordernummer geantwortet. -/// Nachrichten, die ihren Ursprung im Node haben ( z.B. Heatbeatmessages ) -/// erhalten die Ordernummer "0", Ordernummern größer 250 diesen zur Messung des PA Levels. - ONR_DATTYPE orderno; -/// Die heartbeatno wird bei jedem neuen Heartbeat hochgezählt -/// Da es sich um eine 8 Bit Zahl handelt wird der gültige Bereich für normale Heartbeats von 1...200 festgelegt -/// Der Bereich 201...255 gilt für besondere Nachrichten (z.B. Initialisierung ) - uint8_t heartbeatno; -/// noch nicht genutzt - uint8_t reserved1; -/// noch nicht genutzt - uint8_t reserved2; -/// Datenpaket 1 (32Bit) - uint32_t data1; -/// Datenpaket 2 (32Bit) - uint32_t data2; -/// Datenpaket 3 (32Bit) - uint32_t data3; -/// Datenpaket 4 (32Bit) - uint32_t data4; -/// Datenpaket 5 (32Bit) - uint32_t data5; -/// Datenpaket 6 (32Bit) - uint32_t data6; -} payload_t; - -/** - * @typedef udpdata_t Die Datenstructur zur Übertragung der Daten zwischen Gateway und Hub - * Im Prinzig ebtspricht diese Struktur der payload_t Struktur erweitert um ein Feld zur Aufnahme der Gateway_id. - * - */ -typedef struct { -/// Die eindeutige Gateway ID - uint16_t gw_no; // the number of the sending gateway -/// Die Payloadstruktur wie unter payload_t definiert. - payload_t payload; // the payload to send forward -} udpdata_t; - -#endif diff --git a/esp/ESPNode/version.h b/esp/ESPNode/version.h deleted file mode 120000 index ea58c60..0000000 --- a/esp/ESPNode/version.h +++ /dev/null @@ -1 +0,0 @@ -../../version.h \ No newline at end of file diff --git a/linux/Makefile b/linux/Makefile index 36d60d0..44ae92f 100644 --- a/linux/Makefile +++ b/linux/Makefile @@ -8,7 +8,7 @@ # # Description: # ------------ -# use make all and make install to install the rf24hub +# use make all and make install to install the sensorhub # use make installDB to install a new and empty database (existing database will be deleted) # PREFIX=/usr/local @@ -27,6 +27,13 @@ debug: rf24hubd_debug simu: clean4simulator simulator endif +ifeq "$(shell uname -m)" "aarch64" +ARCH=aarch64 +MARCH=arm +CCFLAGS=-Ofast -std=c++0x -pthread +all: rf24hubd rf24gwd +debug: rf24hubd_debug +endif ifeq "$(shell uname -m)" "x86_64" ARCH=x86-64 @@ -46,7 +53,7 @@ DEBUGFLAGS=-ggdb3 -O0 #simu: clean4simulator simulator # Make the rf24hub deamon in debug mode -rf24hubd_debug: cfg.o dataformat.o database.o node.o sensor.o orderbuffer.o order.o common.o rf24hubd.cpp +rf24hubd_debug: cfg.o dataformat.o database.o nodeclass.o sensorclass.o orderbuffer.o order.o common.o rf24hubd.cpp g++ ${CCFLAGS} ${DEBUGFLAGS} -Wall -I ${INCLUDEDIR} -I ${INCLUDEDIR1} -lrf24-bcm -lrf24 ${MYSQLLIBS} $^ -o $@ # Make the rf24hub deamon @@ -71,7 +78,7 @@ dataformattest: dataformat.o dataformattest.c g++ -Wall -I ${INCLUDEDIR} $^ -o $@ # Test of order object -ordertest: sensor.o node.o orderbuffer.o common.o dataformat.o order.o order_test.cpp +ordertest: sensorclass.o nodeclass.o orderbuffer.o common.o dataformat.o order.o order_test.cpp g++ ${CCFLAGS} -Wall -I ${INCLUDEDIR} -I ${INCLUDEDIR1} -lrf24-bcm -lrf24network ${MYSQLLIBS} $^ -o $@ # Test of orderbuffer object diff --git a/linux/common.h b/linux/common.h index 0044d74..878af03 100644 --- a/linux/common.h +++ b/linux/common.h @@ -1,4 +1,14 @@ /** + * @mainpage RF24HUB A Network of Sensors communicating over an 2.4GHZ Network. + * @image html overview.png + * Components: + *- ATMEL/Arduino based Nodes + *- Gateway based on ESP8266/ESP32 or Raspberry PI (ervery Linux System with useable GPIO Pins can be used) + *- Hub as the cental Component based on any Linux System + *- Further Details: + *- [Quick Install Guide and System Overview](README.md) + *- [Configure and Build a Arduino-Node from the Template](NODE_HOWTO.md) + *- [Configure and Build a ESP-Node from the Template](NODE_HOWTO.md) * */ diff --git a/linux/gatewayclass.cpp b/linux/gatewayclass.cpp index 581ad29..7351920 100644 --- a/linux/gatewayclass.cpp +++ b/linux/gatewayclass.cpp @@ -2,7 +2,6 @@ GatewayClass::GatewayClass(void) { p_initial = NULL; - p_contact_initial = NULL; verboseLevel = 0; buf = (char*)malloc(TSBUFFERSIZE); tsbuf = (char*)malloc(TSBUFFERSIZE); @@ -173,12 +172,12 @@ void GatewayClass::printBuffer(int out_socket, bool htmlformat) { struct tm *tm = localtime(&p_search->last_contact); strftime(date, sizeof(date), "%d.%m.%Y %H:%M", tm); size_t nl = strlen(p_search->gw_hostname); - snprintf(tb,5," "); + snprintf(tb,4,""); //if (nl < 30) sprintf(ts,"%s%s",ts,"\t"); - if (nl < 24) snprintf(tb,5,"%s","\t"); - if (nl < 18) snprintf(tb,5,"%s","\t\t"); - if (nl < 12) snprintf(tb,5,"%s","\t\t\t"); - if (nl < 6) snprintf(tb,5,"%s","\t\t\t\t"); + if (nl < 24) snprintf(tb,4,"%s","\t"); + if (nl < 18) snprintf(tb,4,"%s","\t\t"); + if (nl < 12) snprintf(tb,4,"%s","\t\t\t"); + if (nl < 6) snprintf(tb,4,"%s","\t\t\t\t"); sprintf(client_message,"GW.Name: %s%s\tGW.NO: %u\t %s Last: %s\n", p_search->gw_hostname, tb, p_search->gw_no, p_search->isActive? "aktiv ":"nicht aktiv", date ); write(out_socket , client_message , strlen(client_message)); p_search=p_search->p_next; diff --git a/linux/rf24gwd.cpp b/linux/rf24gwd.cpp index 5ad15ed..80165be 100644 --- a/linux/rf24gwd.cpp +++ b/linux/rf24gwd.cpp @@ -137,10 +137,10 @@ bool process_tn_in( char* inbuffer, int tn_socket) { tn_input_ok = true; } if ( ! tn_input_ok) { - //printf("%u \n",sizeof(tn_usage_txt)/ sizeof(int)); - for(unsigned int i=0; i