From ae1c18a6e2f1c9cd0d0027ed5623276f56d367a0 Mon Sep 17 00:00:00 2001 From: Norbert Date: Sat, 2 Dec 2023 16:17:50 +0100 Subject: [PATCH] Version: 3 Subversion 0 Fix: 04 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bugfixes: Changes: - Node: Neu: ZAEHLERINTERRUPT als Konfigurationsitem für externe Zähler via Interrupt Geändert: Schlafmethode über Konfigurationsitem SLEEPTYPE einstellbar: sleep4ms() oder delay() - ESPNode: Gelöscht, wird als eigenes Projekt mit geändertem Fokus weitergeführt.. - Hub: - GW: - Gehäuse: --- avr/Node/Node.ino | 156 +- avr/Node/Node_settings.h | 60 + avr/Node/config.h | 64 +- avr/Node/dataformat.h | 257 +-- avr/Node/dataformat.ino | 304 +--- avr/Node/rf24_config.h | 295 +--- ...{create_tab.sql => create_rf24hub_tab.sql} | 5 + doc/ARDUINO_NODE_GUIDE.md | 34 - doc/AVR_GUIDE.md | 205 +++ doc/Avr_minimal_Schaltplan.png | Bin 71038 -> 28986 bytes doc/DB_GUIDE.md | 18 + doc/ESP_GUIDE.md | 4 + doc/Makefile | 10 +- doc/README.md | 11 +- doc/README_doc.md | 5 +- doc/einbindung.png | Bin 0 -> 185692 bytes doc/overview.odp | Bin 59754 -> 69265 bytes doc/quickstartquide.md | 10 +- esp/ESPNode/ESPNode.ino | 1500 ----------------- esp/ESPNode/LEDMatrix.ino | 169 -- esp/ESPNode/Node_settings.h | 216 --- esp/ESPNode/config.h | 62 - esp/ESPNode/data/console.html | 37 - esp/ESPNode/data/espnode.js | 685 -------- esp/ESPNode/data/help.html | 91 - esp/ESPNode/data/index.html | 67 - esp/ESPNode/data/settings.html | 82 - esp/ESPNode/data/style.css | 132 -- esp/ESPNode/data/sysinfo.html | 69 - esp/ESPNode/dataformat.h | 256 --- esp/ESPNode/dataformat.ino | 303 ---- esp/ESPNode/defaults.h | 71 - esp/ESPNode/rf24_config.h | 285 ---- esp/ESPNode/version.h | 1 - linux/Makefile | 13 +- linux/common.h | 10 + linux/gatewayclass.cpp | 11 +- linux/rf24gwd.cpp | 8 +- version.h | 4 +- 39 files changed, 491 insertions(+), 5019 deletions(-) mode change 100755 => 100644 avr/Node/Node_settings.h mode change 100644 => 120000 avr/Node/config.h mode change 100644 => 120000 avr/Node/dataformat.h mode change 100644 => 120000 avr/Node/dataformat.ino mode change 100644 => 120000 avr/Node/rf24_config.h rename database/{create_tab.sql => create_rf24hub_tab.sql} (96%) delete mode 100644 doc/ARDUINO_NODE_GUIDE.md create mode 100644 doc/AVR_GUIDE.md create mode 100644 doc/DB_GUIDE.md create mode 100644 doc/ESP_GUIDE.md create mode 100644 doc/einbindung.png delete mode 100755 esp/ESPNode/ESPNode.ino delete mode 100644 esp/ESPNode/LEDMatrix.ino delete mode 100755 esp/ESPNode/Node_settings.h delete mode 100644 esp/ESPNode/config.h delete mode 100644 esp/ESPNode/data/console.html delete mode 100644 esp/ESPNode/data/espnode.js delete mode 100644 esp/ESPNode/data/help.html delete mode 100644 esp/ESPNode/data/index.html delete mode 100644 esp/ESPNode/data/settings.html delete mode 100644 esp/ESPNode/data/style.css delete mode 100644 esp/ESPNode/data/sysinfo.html delete mode 100644 esp/ESPNode/dataformat.h delete mode 100644 esp/ESPNode/dataformat.ino delete mode 100644 esp/ESPNode/defaults.h delete mode 100644 esp/ESPNode/rf24_config.h delete mode 120000 esp/ESPNode/version.h 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; i5E)edNN4 zKikxqeh$XQ*P>)!Cl9=da5ymTUa}jM}^4o<1(eHLP@DlE4vsmzj3#% z_|eV5P!w+e)ous>t_SrN1ihtd;dAMq=gw65{gb+xK2*%@{$HNEDHF@|Mq6tAq4brA7Fu0dVfy>?+qZArF?D*@%J^$C zUy1KyBNG#LlXQ5vL4CU5yu?E>RcbZ!$-~4SaF=T|XNzieF_<`>`}XyNn?E@(i$zmvXSdzB zaYK~3NsD}PdfLgsAtyUqY|tj?wt^#)e3KqKg~=^n7(eb0%EU%jtf(&#I`eBqUr?y0S{9{(ZrGp>v!U(auC zVVw9j)!~fP)YPwEzs}Fk|J$CMB;zY~zjhBTZK_=0Cz3E*;@WVCs7MfkGR&{@u&U)| z#L<6l{a_&uDvhr;f~Lqu8?M+2_?u2>`y)I_Ge}8H~)o{y}NIf zNs8QKW5a!Zy7oC({qZLe;)m+KHsZ3f;^F1}Qd2`lM#d~9iS;10ETL3Be?Htuko?)_ zb|!P>klP8W8LAo@y#J`4iI{I~tlIy2{pA}~D4p=77fCL9`ucOLeqY{dLB!G=hWAcMm+cFcgDXBp4`h2uE-tp`Sa(Wc7^JEc#v|~aiNrq_t<`oaTCrk zip~X%Ql|KeUg|hp@wEKR#m-ke(&tG<7g}C09OdOaNNTRYSsgv9M8Wkl#G8jzGI{#b za#LNM*HWjob8pFFqe!!h1S_dhTWeRL{jMEnRPdq*uvz4@iYQ=v+h$fMC_nmhy!vuq zVP9U)1wpsigRl5pNJX{yw7+&(_FMV+7Kv$>=+qr}u=~7@+C+6tc)ai>qoymIbQC*p zR##UOYoOGA9Fq$#Qd}M;B=Ga|a~zgBIi7WXIYICqi@4L~+9IAy#Qx*LUS4H%98_oh z_ZOtUyXX-$WAX11kKu!tm#fFDdUAQ2V@HMB&+cFd;bA2V2-T;TmP(cKtvgZg6*yP= z?5b`~tlF^Us--*qH=T17y&@aJC+YYeyVQ;Rb1vUp`kr=Holk^|i)*vV{ghf$X_pUKXyt%Wp^Rbf# z$ya~Y+P*$nVPOWs4pLG^Mn*R`H-6106ol*7uivJYkdWwjL(XbC#I>~)$sGA2C#SKy z+xN~}`7sgCmT`COtcSI~Pv88#_mQw72`WGLBb(2I)6*#r9z4@J{4GUheZE<)eB)ok z;NYNIyg;IeHBH19=9TLko5WXmw|#p~i*x^b$E4sxO3Pn<{CNA~MNLD4{mO;j@87@o z^xSiE!glp~w9ssJkgDe9u05aDr%Rtad19U7%_k${|MlS!TA79K7vwg7wzrF|{64n# z?z3mlDmln|i@LfD(k)mB1H;3Ld`S!Cf!NaL8-G(LsPkP&6t?Vs?4lfK_m?kU&Ye5g*4|FGYu9m;Ptvlo0sn^U%a|h+ zpOLeB4fJ~U`%h$Lep>yLlwcCD`Zuqf{c-jg0>NGKs@#C(UO(CXJH*y-@yl~Ynn)$L zxuGvVfBu{wZNASUE{M0n?p~Z?v*>Dl03iCpD#{q%yS6OaE+Xnd>mW zzljGR<1$e3BSVcNV8xWs@yWk5FVFeXrPfD6=2ZUr#BTD^{28UPqvO<{rlh>9rDEna z_juLf9q=SiW_*-gpDcLvh{=EAjqkD(2M33<^Gr{VQKI@1iiLCM+b<0bYKQkKDJwHN z)>#PW@A|I~+03eo4!(K&cK7bxc1}*;zJ7gMM11iFeDmR0n(TDLg{KB?B^Ix*&y;gW zy5D(JMMA)iMK?Ti<_zIvz{bjh2MlJVnwi^Xrh85o8pzE4{@K>%zufC7x4FQ0OMxWl{rmT{avLt&TbpZJ z4~RwHuxJ|1>X%*N1=-c%x!<)(j~^4REl>Ai4_68W;B)-z>g&-{t*R6mX=K>%FB2c) zzlIa~`uaFEO;0jKMMd40S<=(f>!=JN7kBJ>u5+|}WoS=^_G+hf>eUkW@t;|js$3$m5{)r? zpC37X#4)y8^=WlS{v#4bHti2=kxEHYo=z?j(v-BX!uNFk z#JD_+k4Mp9KkXW-$bH=S;|eO3MClH$(C8L@jW<6m?Cso7#hx!qFpw{MjD5$BX77-aqO+oS9xv{RU*k{oWce^m&O7ir- z7lDAoC+^fEL2A59fgzSfrAOne>Yqde$k+B}wt*^lvROp}j1dCtFUl z-nw-Q_y@(=)!qH0%i!mjL&_-uYvb#6Vg?2V?13BCSy+-r8WQ&0QZP$b;aLL~xq9{L zuh&<7$A9n=R5UfQot*6L|4vVf&Bk$tMtAO}pqO1=rrqrRd}~i6TTFfa<*t7d-cFL@ z=HzB%>hHo1adHme1Y~7p9XWDjeR<}7M1smhaVDa%1_rABs|?$5dBbeEjV;L2{MsHV=1q^!I~O zbc~kIWY9&%#}gkubf50|P!&dd|DcFf)op4grk>2%!yFpDJo^ZzsILu9n;0Xzl8Hyz*f;Gc`W+f^ech zj7m!2*6PcbFLjN*zjV-ZS={~8oSIkezxvPekdoONH#fJ@)vKpjqw-0GE)t8UvTBAl zUo7q{rrv@t_I$up!bLs3N1u3aDJ07H zE{&!J%7z{YQm2dw+FJXYckD`z-g}46neuJHgoZ@*7x}+YDJHuL{{pbBl^W!}FDu)` ziq}Nc{k*KJtE;24U=Tqvo_OZ-MO|Ib;kp=9~v5RMb|j-X~j$>Z&xDC z?ptr2dQ0BDd$+LQP8ge#x5Ey-jrb z9FvgXxiHpZUK^FKm$S06g4^k9no7we5n;L~V*Tym!-p$tYd>t>DYJW90HaE?=e>R% zWh0;7!bDZ`$$vdmAuThLKjMql-D9IycyUW9{gk-4 zl!U}sZC=CIukix0W}X$eh#`Eo3noc*cRVHPn505PV<=O#zvUYQt# zsAe#XT=dy@J|8#r?j5UoMct&Hp&>sXA45@VYip)vvfWP?I^om8i8*O$!Sxnbbadzp zXZ;zdZ-?`-Zf$L8XlN8U^-B7!%%aT~8#(zAUmvrxv-8iMJ*0&Wd`ltx?p!UuLr;ImIcvE#ck!_smkP z7B!8B1`h{6_}TNb=U&g}ncd#feP82_rT_PeWIG^izIXSR4lYg$GHGdP%@paZHoN)x z`4QI-`BfjXYuSC(x9x)ld6M|dON3MXm-Icjd{>&caL_(2b=g-1_N|+xSl7^WgDg14Bc#o-Nd%do1@Thjw_b z6i|y;YRV8*g4?ac1_g}s@1Luop<%epMM6SDUVgfbR`lrB?b{RUQ~Cn! z?YV}LEccH{1Z)%+6o?4DBE!lqZX=BJZP1f+pNbg7QONaOFKX8DB2;`X~ zL29Z#f4)=r=pYr@>&v7BV`JmB-5v)7jb;}Y;~GW)!O#)82`U*s_8bsI)ngJ-yaX0T z9#Tm`P2FZA$`Fpe${G6o@MSG6mjUM!WeX4TtAu0&1Gm@Kd_EYVgcuqaV8z}$c9RjL z*)L>hJNA~u)myynR9Xqo85im0+9xL`M{q&ux^biI)knKY7u=KR-ALk#*GUe2zlOR- zQBhghq|E1XW~)Y`a7KQ9O!Mf4R9QB{-Me=`e*EY{y;3UFOC<2oEx?9oay#U2+$cmf z_mJS@;^VVgUz*}!utg)m@ypJR==gT+7(M}%ggoNnt|gP3D32U$X@icD2Y{C1VQ(3?BHF^vsgASB??n)G{C>y z0BfjJH(XpOz^o;%Kf@#3XCa)ZzBNkvu*r(CjEzt+;)-$~GbC(l740(FS&(U@rP-sY zsw(Vs65IIIWPkZ~MKCD{%eVS^N-8Q*4~e>aiIvf+d4+Sav9Y>2dZszoZnx%}*Sfm7 zMY4T)Nw;s`K1N2Osv&$19DHRuVDR&;ni?hZu#m<_2YFb*uVmb!E)R!p})jm5?tcNBkup>*fcfN zlw6_e!5JCoi*t*Mg@uK?2xK9q#M1_Kh%f*;(T8n(=)SZWQ75Pi-MfFk?BdT$-rnB7 z@=S`}y~}z1TFgVS?w;vq62dimd$ot_XDPUzFGG*<@bvsU^Uq8A5Lvn>0Q=h7+RBR8 zo;`caYt3AF80vv2tePHMPRdUc7-_zbyBiic@j6{P{19lGc2V6SM#aM1T;zGC{B7R7 zyN~R>TUO@p?fn5q9R0~dk%Btx&K(N#Fc{uiX>EH6}A9{v|hc%MKsCz$H2p<$2we;|kHU`G?_m_#S7Z4D@rlE+mV~)J7$X!UR z$#k)9BVYG9J3D_cdfjFh$=1Mjjg~xG<#~$bCJ~(gpVRb?cQ`EhyF2UX>NZ#iD=RCj zsWtrgp`D>^Yi@3CX?fYmsL`sx-_P&g{5(koj^?)V*x$cunXS~UWv8>Vvaa8_!5gE3 zlh4M+hEoTkba3EPwf0U2F+)ze;?h!D+b58PMn*^fx=R)s^m-NmEoEe8Udqw|ZK|uQ z0|N`z6Fwy?+t=S8sK;Fv_~F9`siU(uw*GnRIMgXn(}bPfnb%^|=QppBtoh56&EUX)FFa<(MzL$dysV0+JADl})H7ShxA(njn*jb1 z@ALX?+-$gm7o6vH#l8!(lSTQC(T-4%y49_YkY)zn{5kHfb2LtoyME-~J&sQoCYc~(!kDcwab?;dwF?TT4p3AB^e2x5ENXRn=>uwBn*&W z>ux9G<@KNZR8dP#sAG;)%1l4W1UWyWi*3nZ(4z zmX;R9di~wEhK7fA^!2?bJM#4ltmtP90Gmyg7aO%T&~zp+it2mfig}T@FMl`TnctZ?ijfy@rIL;LCxy10(~v zSDiH|o>W|B`m^uy+Ob~i58{^|uU7oB5#{CO6%-WYVF>?X=I!e%!bBw{Rf^pj%YUKf z%NKn;JuhG1-xf8cpfq?gkOq&&9TgM1lHEpRuVP~H$M(vO4-H+t6ua4JeOvMXWyLX` z>Y>$9>KpQ*x1(CrT$blNl1HEL?@SBjF>TRbGF$(2-~3eX-B-`V!DFgO|It z7Ot11`7SO`cD5GGH$qx|cGimXh8b*|0roH*D(?Mefv)SemG5?u9@IYg^m+dSyXIeA z_LC$*OyY@>H(qIHJvnK5Qz7k|aH7u9!rWX(DBi%eCr@gnY0(v2xWi8}Zd+(D6j@VW zAFi3%Fyb1ns9=$(&7YZiOF`49=Yg)tso^8nrFSJ#4)y*J&2~{c5hkAFGeUlSZWNm$&sQ%Q~ zXO))vf{=vKa$t+S&dKrHnt6T6FwU`;?71^;*Dw{a%OX{p+oL;*&z1W?~fEB^o)$)YbE+JHyU6kQ2bByT!Q`nqyvcr#@i_x?*oXJI~Vh zluluDV23A7&!)cGK!M4%<8W;}S*N+f7>w29})htJZ=yt`I;^Yv@N zW53A(EZGd#y&DyceE-=g)0AOVErDl6=E9#9nF}Yb zakL6C-J{p4t7$YQ0P|8L9{S(x7Yj|aht?lIm|0lhmX(PA=ZgvR!{7k6a(8h#>A}gT z%)^lJ{5dpd7O7}BQ0B#G&m$uvZEbCk0NiN-1mC`WtH^yZARxfX>P3Fl85Z;(4ASZPw5#XUGZZ&TK~6uf`$as4_hu1)cCd{zDZsfyg49UT&ql3m@) z1w&j4HYxzt-yR92_m?!q#l@|zuC5I!o8_+nWh*}Z(bJRD-_h1~>Um3_=FzzS`a7iJ zG3Q@Df9~D4@5tW3+}5_GGBcrwg^<%4m$)Ah7cYV~_UTi~ znCb_=)wj0oN7w_fS>jbQs;40LLPVwU>mM32Gs}pD_l1AW6;8_~dJ;fh;ONoEvi?3C zj!VPR zE9;;tDL6q-pAr?SNC$BrI-ZCuvX(LvPEAd)QjTYwS**nTK3rdmDKbHFI< zzjceLAHIE?Ou2ST*S_UYj0&o|cGd#Qfx!M_!oqMNbuV9rokw>XvR2`{cTdC|yXs^4 zL1W;Q=nE%G1I4|1^$J%H$&9O%b6);u`U%{csI9iIZ>c)p-^TwTeEM| zF;g8;;pHR=GPXBtdVDIo-#;QE!o+8s*DNJW=ctC7+WJ`feV;2QUuI{cX9O&^>28~x zerL+HKLU*4@5F?Wkr54>iy8*w|PR7vq*s)49z;DtnvglT5=)9xJ}`Q7=;!xMS|@GVSW_ zCV85XVcGadhyWem530q}r<|}{ZEcSvG}Oa55i$pDI5~Lu@L_0{hmRhG!41rrmX-!N zoFJc|!fqp(YNW2T!XDWEqm(l6Z8RN6o zArU=aF19s?@!B$+KX>{38P%M=GWYQx&9dtPhY#D-Kj2l&bj|ZQ&*3*)3H9inaPJxJ z7y*+{8)Gf$b8~ZWIlH?JkH*C(B>Yt?^YZa&|Mjc1q@<*@)Vb^35iv23iJw_zG~DTR zdYAMy1T~Z=?l1V4s5YqXQy!uEW=dDNxb@+GWdZ(>-`3Y&-P#hm_Suw^`(p3nU+_)l z*=Q2NQCeD8U#a3!Mnlwu+?<>-_YzgOH7xvoq21dH-Gv*i`FqorSBl zH4$e;-0%xCP*x6u$>^v|K?N^~mKZ zJrCUfm-cu2UOT$75Nw`^@+dQ8en@@$@XDneJ?;3NJc^&`nV5>95oGJ;IYGm3dv$qj zP^SzW!wGwGd+k>_p!4m+Tct6o8K^#)7gD#N0mKVl^%?xUD@*6ARRJ#pWs5wT%GEb8 z#~8wg!#Dzp{ku}{3C!ycAF`m_b{muPPyNPMqvUhu=xh4cYEfg#=AZ-6A6I?t?o);Z zudIHk{nE+u&aMl}`>eHor`@q*1nj!;@o`aR#~;tn+ZC>XgINfB!{s4db9N4dApoie z*#-*(l`;O|!_Zr|VpN`kSiliw-9;DiMfSfJ4m{8ePSp7H^y{oFQ{hBa_L)En2FTS|YdZFOd z_TK%rj*cj3$tRI5ASDOymz0zQxV(AuCJzIp&}{|=hR=g8@16TUUH`2lnH&`Lk zdK!YfT;LY!A4JVWb-s(5|FZKw!R#2CUxjX*D&za!NKiLRN1ENar}%nqZf@Dp;DW-* z&;5H295-0_dMpn+jL+)Q)QW-0EOk(jtd9iF%g!B@@}Q2*e|5Fs6Q5^B-{}QrQ5$hJ~8p&{{2?piyQA} z5MR86lT7z;FbUW4^-$7w5qR%=>g6si&zZ_CJ&H+JtP7=29tCTz(${UL-SDa)m6Z6g zzTK`!uXT7bkW2%1@Fip8Zx+J3dBz&tF~+`Ag{0&(&tJT7m3VSF`wD%+@4tVgoclha zghNu|`gpIKZbkuGA6`Ul8&m|)3x*@ee4MH!xH9}2sCEIXBM1H?Tl3Y77a*!F2xNY4 zf7ABs=MvYFh_}ePj5(>Oe4v}e&5#gs3B|W&U+%(tQkPIV^2}?Kjb5Juy*Pb6WpoAR z)AC19qtza_=J6RAIkDA|P@mVMram1ve4jIVb+hyxTrO?x2LYuaAyp+e{w{c~d!^1K zv}8sw%v$F|s`|eLTHJ^!i^MQ^gdl~xZwWj1NrUp<)j8URw!_NGddEBK1#%j<4PpA2 znx+x?D(4ux&gIMWyi8DPy1TlF0!jMAqN3${2SsL`XPumSiU+5r{4d;Kxy{JOS``UM z?(GfY1-9x=i--64@ndMWnwf_JOe5%+11yAB;rOGCvTvk`GHc`=e_`Zd7nF~mVUzMu zH(77`IS~ETC0#oUe*@C9{7%=_HcOHFIts0;>ka~rOzXIVqhq-8Ed?k%_}wl7`~6xA zVf1YlX6BbVM?)%4c4~jA%7NG0&=8@{m+msP$B!Q;&FV0^cySJPFBTlGT_rh(^jtL~V6^Y@wEyZz0ujq2M-r#Hh;{Mx_2rQA z5D*cG{bJT)^UgZeKfYmvX6{^1<#cc9Xk%jQ_wUgU9w_+9=NNr(MH7Lq1_}%&0vaMD zlt1&?0qW8Pd;pqgp~3M)2UoV;dZp0(C~H9)XttI zor}Jb-PF+FcKv!joW|ICutJ42Egpt_2M%<1bSxNNb$R&RMs!E;(~=Tq0{jn!vuBB3 z=WH(&>{HB5Xj;`~*P9DH=@hEeO5LdR^ z4V}TSMn^{Q834nUuyDXd8o=g7GaL=u*tN^N$uDvJes4`XIu;i z1Zjsw5UyC_G4(hsjC?MdBgoOvu>VBuj%RCE4U>*v)O*|itE-00!GVfST;UHNKR@}F zaiV*)>eJ_RyGb~~glB)Lev2oGuP#X}dpXs1v|VnOGIBaVYJPxXaG*gj1&u%InP|f8 zf1u762+If}1#CDhXlv#L{yv`cXU_oUq*m(4&%&bSc>tAIHZ>5S6L&MD76pkYQt42< zLwWZn2Qgnfuqvj>vdYjZNP3T>IPx0ng$B6zJv=6QdS33^H|t6M$sl+7@+=(ztCIKc ztD~bMj2tW)Y7iXsES;f*e{bIkBN6uVCoETN~{vQ+uRcUEw9zVWEDnKY+@6&F8$nBFlFA))KD$_;Mc7;kDlXApWx)&0IS;46cJnS+h00jVfm zww=d~8$?gR$A?|U2bObNWo24cR=CZ1zF5Q$o+KnJH;MNP7=L7fnV-BRp|tJe0gni_ zc9ss&sf0LOIC@qxIqL9)(jy3{irn5aWy{kZhldPaTuALJV7^Un3XmZtrp`BSY;CoW z`>MpCz3tpj?TguM;297@i<;RX{i1it6b+A#HYZChLxAY(>)U!g}WaB$eM$oH5iVkylg+i0 z6jgYBz&9@~Ej>teyM@ss{ZMSZ;;vF5^O}>1>bDfmNGB3FZ@8`%e(3zs@QBeFvM6mPARaz0hTAu_aD~}2tTE_ zMAusgCUp1oY%KmVDd==S^Z|4jf+&J1#LNoTw`wrQxXfoZrk`9aNh3{b%w4jDYZC}# z8|M&Sn%Bl$E#zESo=5h6eSFH^XIlHp6)~`bL4izhl}9d2QE6dQEUSM0TV{@qz4Kf| z&t_}B3x^hm8ba0cLyG&%_ea1o=RS0Zn(0B}#OY^0=hsQnc0O(EV&0fGC_KnzvDauo zGsKqELEZ7iQseoBT|e%mK7kTO*ZSTV)PdkNn(XPL=|sdWSkp+UUdNHIafE@13Dus$ z{QS;0rlf?>+r$^nee1Y;oNC)IF7=cnnil7l?}C=d7LgJ<9K@nBVVz7lH6K_1Ama7q z?mkmfQ?&US8VjvAVX!mkgl`1=>E9FapB40f>#vky^gSgvvVVO&SXYgrX;SKun~^aB zEU1^oz!f?ThocI0H&P*u>a9T95#3XwdzROBMzKl7E2YynY$Q7HD&aFMSB}LEwj=(~ z*2WvBiq1y4$~j@AykOioP|ynV~c#ug^3161Hm;=b*o}S(ycL~*(b!8f^b4f`T#F6~`7AU=ALy8n> zF}tzZ>BDtwZ6BrGxnZ&?I{F*RNmi zltNG>#$rI69_Zyz1V7Df9&-FfAUq{yB7I626E}QEL77%v!_4V~i$8L5@FZP~ik^{? z#|e|i>mvlZu|G;q&SB-`Ccr0ClanZw9v({oCsbaqV>B{bArgE0_()1fh>D8dQRGH; z=vlSMRqn*0!OB<_rxzIqXYc)vQza+rA20DMRdsW-jNmuRe-@MaYqFu20ePx3|172#1_jM;Ra5#S?&@0#sSEYX8hIsS;6jv7N;bAxrD-n+$ zdC=vjc=WGc?IxhR<$JLpGKxFDZRqA!kehpa?wE#!ptOukH<1S87BVuvz!3_KUaf@4 z1L44?unU?-U#l?$7|8BNPMjbQ0;K^N`}60|1V`@c*HBvVAL{GsK(!AaIYI)|20MbB z0Ad3%7NuSB_c7hqIQm2DYcE~@wjYmFB1ITNjGuorWeE>-c+Ly&t{e?y;hs2S_|EMX$7r$wO1L! z_tMe1045*~1f|8@-JR~Ya8pwgzyX0Xp#j1LsyLKHN5@>%4DJ{eL_i9!Pi3t&3EY}cd?V5Xy^bMazKUfxXc_1}Qe3$&{w9q$VlH(eX&7j_a}=8Y0M zqU%Y0ayK{DoI{XjC4Sk5cZ-plCX?2<@!r+F1lTc6Q`t z0m$)ejRdWQ6RXn+Cm}f#>YAHjn7w=Rrmm?e^6uSNFJHoMJ}xNuLhCTBDZ(T57vKWd z-tpn-+-x2#f>h_}S)eDd>G4{txW2XZ!_$GT$EP5shb#U|5o@ygt#p=+j?3aOb0nXj zAd!}1?^VZxSCzs2hsq3FTHC`zEL;)pr|+LcYh(pU2wt#eRkyZonwpyzfRTa_AmyT# zrX^rhJPXjUpe|B*N3X{W{7(bt%|AbgwP&DYv2V+uzt%-4Pa(uJnOJG z;!EDge_s)J+El94-Ag>$HMjo`i}H#73<}Gst9$u(@~4453Do?r4Gr0Od8yLguGl3? z>9$TzOS7{C0wQQ%zp4@dLe|)k!5V~y=jiA^)pbfXm6jl|UyX+W0j_=f_wNYO6Yzj2 zdhOi{#LSUAIePTyE8rG5o5M3ZqqM%aRI*65|J`~$i zhKFZ46I|dzHYJIN-MVFIZGGZu$-+Qoh>(yF94RjZC=m)E2~tXjr3wJ}^CzSiNpx56 zQp<*TdgZ=1rf2Q!j$T*)U=)Dnmoj=>Kmfe_H}*d+1;U2`ywuToS~kgdwyiH9)gi)A zX#E>obJhG|%h}mMJNG8(| zaN4W)>I_}DIa@(W3oybEzEF4QKA{31`BG;BW&w5!#Px7RJ6l^y8X7U1k1rxBul+~m zLD){S(hwAtlo)8wCqI$3v-ds3V^JT*!7QSP(G8>wG}P5MHkbR)^Jq6uO;1k~`S#Wp zSOL!S&KBCi-@mc;ivCGO{Q*hE^sKBnF6uq9Kw|p(oo>xCzaa6}ifkdxsFomzWF_%6 zH+LEj3(2yMt}dT}ieO|@a&&)FGV=BOl@=)oidAYN4XYZQ^Q!JAgT7f%aOf?yg1h@W zJnqxl6=wN&Y8=E^2!K2gLX?d41mdq`PbDVb^THyaX%~fCXN|huqGNXK^BzrxdV`eI zP}F@qBI8mIN3241FLdGn03?pUjXA8yf+MtbEU=R?ZJmF7StSiSz(6b^?gvErsj8ERjlQ7qSrd z(IjR!0ucI&5nYNT4!xvZtgWmxt&L*KzLJY!inU0j3Ve|^QCFwJWBBunv;wX>0}D&G zGq{H+AQx0>FSsPt@koTXH#IpTZ;D!Pkm~^p2}!c48I$N? zhX7DfO^v2}_G;dd3a)+VXXzLH{5B9x!a?$JLd^mN-$d|l*N#fIWuM=X;*hM^k@MY* z$3`YnQLqAZ6ThKw{yW#>jm^x>5#emJy8-sBq*OC?kg^h07&T2HZOoZ!Xic4Fi8$oL zoB_xmfO2ij0({kvR3e%-4rI@#hHyrHM9xl>Z|oq%@@aIHdgcWP$&-bowbE zmP^4^09pu?ER@7f04lqsz$KJr#7Q^C|2xm5d<*W*&LAX4CNiHe;^5v9-$@v2Bb@`d zV-$xF$IB2NAO-puTMtjp5Mp#v6Q5PU80y9H20ej5MCjiS*xeKjQfm$&71vJQVUe-!$3A@4Id$pZ`lIW47c>@1mxuoT z^r@_B&VtDwGfKt`ZSUG; zdMuwm(F@Ag6M$~$`XEK=?XC`ydlj2LkaH#CCh<7HlDe${2UwS}t*rP1Zy=#-xhXl`HWu0PE{Pz7Ia5 zP<|dCzh6$S9QB!?bue0A~z)|71L@vyI(G7w646yX)AxghThZUWi$vr*I z)FAjEa|d*C_%Pk>TkzP{3SBR9fR!nvxp;c={}3xND0FJA#X9CGs}L4IO* z!Q=W|frwR(NqJufVixzz!I}XX$$}7dA%+hBixIDYrC~vUk7#9Ao+_oE_FHi=H~$S4 zHQeNJ&qr?&85zhswO_t0t|k6O4v83x@$*A`j+R{-A&msVtExIN@QRX7yYYopLFI0$ zuSas2=Qa+YiTY2 zJV5E?%WdfMNUv&ZYoi5T$<|O+#f{&+a|d?V_q@MQIGl-cHN;zjmX3}ny0w|Fjg8I4 zi}cqG%T>n@hyD+FCR6~70G?Y4>o-Rt%>nlV@4j~Y^y$;YUW4)$Qu#>4Ix1itu_kt( zF)niQFceq(=eUFf#%@S3;ig6iHzDAk(mDe_N;`|SD_i*Be_l0n8w>}8n)@-8W8IvB zt+~7wGx5=T9$}ow115gg5le?$2KNk26J95hdf15go3(f%NxILTe9HdHwQB?Rd1ddh z+UQS->O_+SjfPNxjBlUM-&_o|oE8^P=&(enw7bYz&SgLzEZWR$=%n#G`hn=(Xre8D zTa-B#mzT@0|3-wXv*d=otE(^({0JJnyJI7t*_sFUa&poSZ3M|5;l#= zYp}wrA2z2zdh+QTnO}7-TfEYI91=8MGDUQ9IlF>7I`oE=Y;4AUnFRJ0P{*la?I&)$ z4#le_Uz2mmg-RUa@pAcre+qv-H#gtcqjmuTDkL?$u%9bb>jGroohV<`uP%}P?CV1k z^?w-8BXuh@3rkDhWX=27Mc@lgPN+5PaseCPcR6^#F~eeFIHHXhbS9>>NvfWIQQhFygAci+Ft4K+J!Hcmk z@2SFHcfMvL#p*l#VU$X5dkOh_NJY?qiwX<(MSKB2e%LSqnwO?UaqIKTmxp1yFDxts zbDTVJ;(p!y-reWy?d|&`$+zwkXJ2V22Tulpzn}#YFxZD{_4i-@>tD!65-3nk!n`Jv z)2L0RNx)phJ_2&Enwjv0uysiY4B?21OPPM&Nhr=-up~+rC;#Y#^n}>hbd!!gKYEdW7;`X1 zj+6NcX4Bpm6=6C>#DlX&@m6{N4v-_FWppUad~4^9Ge27T+-^?a7tj`q5`CTcqmld* z5)XKO*x^i6O7NXqg6b{4TD;{tD)IL&HM+CtN(MIG4|7Wuj zr3ds_4ALp3uVQ+}OPW2lp4D#{7FU`UA*i5WKG(1ay`<{*oSp#kKG{i0EG$>p zCS+KFkLpHT`C<=3uRtggMxSh|^KAb|gyv$>M1%iV7N8$8Cd>snxj^WsFt%|%q=579 z?mK2?W(Guw5kLu6O$_3;W$T7tSiq1ExGT=lm)crnBHcdpfNJ&@Uk`a?+4=LQ`@+~o zWaZ4_lCa-k2yH<-Hpp%N{CNn{C~6se0!40WVONH5QLDyBfWWR2teXOnfa0*!67*J1 zU@%KyKjVn4p52w+CdojSZCgg_iyXoPnrXQXw~#YiFJLSGmu-Zhe{iGaUc`#|L6QSE zmEHjI0(n7^c~@BIKU+zTnM=Bh3p=S9_7Sk(=;5F5@Uf3nNp&LxI9J5wJ0MbFC63zG-y+Lb4=rh8gij@MTsBmx`}n?I0Zk4P8FGml(A` z_-YvhWu~hzqIncVVsdaLJB)ODi#(*R}v&-r~Y(zI5#gcN%n?_v2hTLJQq9Z#x zI}-;c3ktyU;G=Y~8S?S*eVVIb0UsnnLYakVt;3Kg!4nV>&C1Q~#UO|}pS^>_1|ZIp z7T-k4~Tpii+OD!=Y*(4PH^Z}8&OO+ zS)61d%)(+Ot$+cJ_&`WyN0GD1)vL*2VYP5eks|<}L!cnxxFHddBi4MAs zGDnVtE2R@hH6B@=!OVuEBjg+%6O(e})KkvKtulLWGeLw{@!NuBHSGF9JIfDI)Zarx z+LtbkHYJUYj*=6A9xwyinQyLaZ9R&?W1Xv4kH@HlDsbhW5Q<1uNPB`X8a$6`$zbdX zrH`zP!Ib1BBCv=ySZ}NBfTipstGYos9_9)WBrop-0gBEzu5@^Q75EM7D&q;zjo0*t zQudHa&i2i76kL~(e%Z#7?WnkPK?b>TjGmo~R7#)W$j~}$SIA7*f5Mm*W5+Bkh!*(x z9_)bRQ+Yv^-}T;7Pe!%V<%{ix zm@I}bR$FV0wnTV?+J$}r`x6XOdb!7qP+=jwIA3$+wUNG-*1*&hwr@ZDnS$ueu~1k( z=(;HdvN7YJ#|Y!9X4r{74nA=QEL#~26+Hq|F28c#0x)_*)X~n;k*h{vlbDln_wYba zcPN?b)Tzt;DR7jb>LBKIMpri>F0PF(_q&af()uE8IiwBjr~PXPy+Xlih}L^}*cBQOqE$1{C+fS7#^oI9bSbLR&I~Q#U{g>n?jkMbW zW82T?UU9r~by!e#Hhiu;CkOMRds$i48@>7Lo=tTBwopS;BT;v5#_-)y z*{`f*Y8L1rbO zb~4EYNVinAXiRye3<&(L6FgwTzL9lG0bw4pjU?_LG-uhGiq$uAl{o1zn-pESdHJIw z$~Efvp)94JE)Q-l@b%<``Rsqg7eZoppZ-BR-@XllYuiyWghphtIO+E8-HWz}ugwrn zY_t%@ge2r_a0C!YWQDKsy3ZrW%SK06VO1a_BZK|{uZjfO?T_#(p;61o^rC@avPI6k z$G|Ch{oM3ILZ-8yTl$$D9aoAqQul+b5V7ZMEzfORr5XbDT;2kth#H#VZ+BM3S2XW@ z*Qz+pN>;IJTJ%vnfqGMOpqSr5h-J$liNi+J00Sv<*2AtOK`WxW2-p*(DZg@XIDmMD z#PUU@2!Opif&#v(IV%i!xKb~6IpUM1x(cf)?wol`T}B`6_((P}CQ0`-2UEA$ zVv3z5Ts-o+?lR30fjPV$W(`a9L;p5E)~P6u{$s2j%XZru-By#@NdqNI<^TM@sK`Hy zJ~Mq~r8rsR3Ijq+DB&$kG+{G6AAY-j5WY%7sAvzV$ZxT-wnhf7(aP<`p5WRy==0Z3 zN}M{?_We5=A$u7Kf#7#=N39a7g-D`$PN3~wSfQ{8>3hq3f6XjkxDY5*CDuHTRaJBc z$bcNXu(VWyaffahQPGD{UyJU7e&y#2rHqD!g@xOo2Lg(Ed#_@c41Oc!Ed@x0_+dA^D0wFpSm*%yJJz!?)?X=}(D?Idyrbi(^O*d0T)M z&CCKs+^h;Pgb3{bIkFg)J2oi5A3tuWb&u8Oc`GWulrdIQ4ET3o>IC<*upHLs0~C>= zhjmml$j5>n|GfF}go3gVp<{?nVyBs~e!yaOVhTHnr?+s-;g?x4jg4Ar4P#?A2yoY1 z92FF_%2VQ|FX~2o{&-RM@qsf%B{1y^3s2pz{XOReT^GSFON>YIVIEd1I13zH;Jg$zl#tFA2f_0ly+As9lK&OU--q7k7D|6ul~S(ySewxQR7p`8dF5r zWyV>On7^DMF<9a2Zk5}7O&|#G3O>uZYu7)w(Yrf)N32CedUf-*%#Bl&a;*+%VAjr? zn>f3;*2c`tJl3$;oq_@9GkZE!Q=kVd(i;2Com+Cp7jj597hFum&bYwCAP|4VTy;jO z@9V3ta@(zP2VRj$bvp7p`uy0_W=!6sM)H1tLIWo6K(>Xi*8RCzK_a!Q_IkaWTs>OD z(?e{Mt0WF;(#zut~TK9Mk6yKGUpcR8Ky*So;&&5!HfRR#6h|bHcrOP2!!Vu2G z&u?vOJAR;ig@lt1xg_l@(bf@pRUBMJZr2Zf5Q%VU{QX{3Z({vteEZisn*;E#m*Ubz z5u#a&P5u9h`_gDC_xJCe<}xQ4HVRROt&kLv+Q~7NN-__H%p^mGtt8Yz!chq!37JD? zj@bDjNrp0Pk{mN3ng5^dto6KkelMQ2p7pH9n_aD)d++=H-q-iKKGVJYZrnXQJRIYQ z-9SUvcUF11s2;~6eF>Y#uT+Hf|f8OQR9-hZEA$NxErJ^_QDC9nS!G4kSTVPEI5tFZKeEAaAjl z27!!A?O}Hg6S;vtz(IbY@-x@~+=?hyfE$+m)_(t%H=LMRP+Fd<0V2V;1#RQR{L<;f zhqV^D2AM#cuZvR}-ukVSG!K<}PA7GZ|GHIPxiaqbrM3f77Rcjfe$RZQTO2t!aw??= zgeiUJd#B|ckEVQVzsf>ADDl^br;$kHi87jDNQWU5ZA9vLPw706M+)qn-=;lX12J4; zI|hDGQgS^13s@{k_7D)DLqC3?_P18VW$KV(073#lM_SZ4kY+6tcd!Zt2AMpeKOW5K z+VrXt)9l*X@7_Fk%Jdn&r=YS@Lc$M;8HP3+6qKo~o)jmY3qx-wZ_BrhY>N18A0 zq189+l9Y;672>3v(FjAGf(Wyy%lPtqDGSI)Ss9u9Nb94OSWtgxU;O|xs;A-y=_hCV z4=z}RWW1aE^}Z`@Vmh(@o%kH-s^nd!e)cneEVz0(9-6P$pjCWGP_B#!0{*5#D@~PE zRD3qf&fhfbwmN35+|?IAvWw|>VON_`n^bkrUQ2()#mDD67=0Ns6f|S76CU7z8yO8NChPIZN$c|N-~*u5XJ_d*59fn^POkW& zfa*S6)pk=|En#*Le0h1F?B(+Jd)@S^e%;5n#HYf{^C;*q*O>0hJvH~u%}Z+?ML}&o zA#JGmj`+5;*XoD2n9OG0rUANScwel)mjCI>sSCLNQIVb|vg`x07#ZTAE08$_yX6NW=VrU5KaKAiQ zjm+oIF)Hom;6OCs4*f9svRD8gX%P>?n~&K%ydxyb{&kOSik^|K7weK)soStFS_#@Q0CbDA_fu0j)n=Z~1?cLVy7PW# z7WD$v<-M>b(yl*nlLdv`Q>*qh9`$*l>{z^Am@=yt8Okfvi8Ae;UF%R4D9Lj zo$9Ne%gD{$_F6JgHMw}QE$+{`7A=t6V=4&KiD}P|_?p3)(_?Vt(#`^L|Ii}J+G=(g zL&1|~2iBIBJ(e`aK6 zzE$3fI{@yD+||AP&Ym}KUVPV5Grsg&pi=g?QKiL`Kl-qTv%* zV5-ycQ~0uS*NA~IrSSOrMS0{C>i+XGS@eESN$rm^A5Y5SUx9%iZc0*vU*+UXK|O?K z425!FU;qa})+HQ@sjX}g)B(_N_aG^I^$LuPnbzsodUjW?JfTf?jLzw0+;nk?XqqwB z)&1rykJ&x`_qgM3SXOXyw=xsKlbQ8c91Dwm_U!6~${^u=E&C#pKf9c`wZf(#wom*@ zTA0sw!(ft6kHJ3D)o+@*xo`fmW%;<_NZMxKqlDPFYO~Hpnddu6VqvQJNh*%96w0nm z3_&L~Uly+|W~b46xG!Xm?9AxK#*gKca+B=KDY}r{;Rjl@ul9w&5m4|{#h{kPkkp>< zU}gp)3djrq-%*UAK%lS_ZV8~v#Bbi(6++JKtl8Ks2VNyAb}8krOu5*m(YeBc0=DyN z?6yk@4ikc?_EYnBh@{tyQoAKxoLsB#oAqWY$~rBnA1vGvz$7&0boW|V+{eTY9lr;S z-=wBv-@83z{tlL~i^(SZY}1Ogjt)r4!idN6a&qAB zf!TSK?;MQXP?BK_jaH8yV-=6Ar{_;0PIl&p7S>j@`WFpcE6j^z2-)6L1dSAOgpjek zl3ETdslY1Up1um?4Z92vk*MhQ&qL{##BynaIpuT{&;HHk%wl0&`|CcgG4IygbMdoY zaDau1d#OW?QZ5eJ;LMk!?cq`6U&;1Mym$NcfM8sqS(4S7h@q>&Hz5HA>c8LRr0XyH zisz-v-8N$tx8_p4yvVa?Ohsc*k1{7&U+HDwbSlz$El*c-*S=3hl`9T{5SU1@`3~^X z_9kJ)LgR7nfE#Uob$qCT@w~3?-~2xFr8F(l#k#2K`GDw~(bj9Tug_5nBI8^SmP+$d zeEHugh01yH=ESLXzMN4QkBPNz-l@0AE=?{rPsX^xDyS-#4-$wI?TdmDHonIW;F`-cv$HZ>ZLv<8H^l_;BUyhl@V14XJh2ea*vna$5DEU7TW?#Q9(Fs9Od3wiV2AC}9|@+mf>Nbg{SXmMXofgZ zUq@Qdz}Og`A`C+Sgr+^a2VL0^uln;=IT;`)@&nN?8-B6KMN16D**=>7EeR3{4Tnf< zN^aKSv1zC)^E~+2&}^9~ zgKIO-8wP)(RYu2>*t?fd_2G6^#D>Ik!CHi;iz1-Y!IuG3dZRC4lI>w*gXA;U`Qw>J zrS5Q%LA@Z#6KYcC>Eh-lOJoiY4Mo^ekb?q12^vj@+|bZ~ReqT20`_fGIp?S-P}0bH z#w|6Cjg4pnFvfz-4n{{h0)9Y4WJ^rL5d{Sxl_&U{;ZDF$U*BG~x!KuH`$9+$F$@E> z3<=pT2*BnD7o$b)jDLRQ!#kd(TK0mdRwbs|X+-UQWDmsB_yU^vZ20bB%+@ghBaWU9aBb*&vJ)f>hM zipedo1ywIBc(qg8hGs%)znL9+)iHWyS1Hsx`0v`wcWcbU24EWZ>$qm3;}=TP{uLDc z_jzsKu(+|!O`F5@Bj0QOAZ!+Ul@#Vo+C=Evx!(9)?)9QNN^gJLu+q>_{rBHnVK;K(>t{H7rvfXJ{eG5 zwYv1SwNuD>+q-daVD^o7&!Ht|K3h$(ZcduuFBw!DM!i$D z?_o)aU{X?R>gMi2C&($3_i(Q2T-wbx{w1F}>?U{QNN(awpc4Gy`4N8trWm^yQ&(5_ zy%0nAC))xfuHKC6EwGExO@r3qqium$^!)+((wB10nvM2G5DkTd z4(oX|mHNwPgxaxj!2w!sBE{}|SmdCB!VE{=*;KjMTFIVnFZ0A$D{G5w)&A(MiC$eI!uB(Td^V{ogthNFtKR_u z>Kv*SL&tcx!mB#5ML7E-PSI;h$QdS8VRm#wwF55YCJ9E5eH!Ji3Uu1P3erx60vMTC z^(l%M|$!7 zuP?k%+75#%MKF<@TU65w&4q z))g@k44a^QUR_y|F|M@&sKBcQl`_MI$ohA;(o>)~hhObYaj}<~8Jv)dkek^SJk_!+ z2o0?1Pd*zCG^zKkix80+u0}Ks^p+QW-Gq1M&pIj<^|_|s8Mq?CV_^Yn9vblS!{0#h zo15=bRz_H0o_4-_=?V4_z=6pvk8kZKQXybO$!%_IRCI0MrMxhHbv|;fKVw5x;q;~% zpUIQ*HTxcuO-*gg`y(<2S=rc@toSf*@3Z62F^GYE^rv)B>}eUui00(6%SEV>(=IAq zYcjlJkjWf)3R_Y}8%av4wYKlUlLm=1ebaO5KMn5~7Bh59xfCBoJ8N)1MKLKsz6K;eZ5a#` zu2SdA3iaNUY0m#RGViJQ`tTScv`}#Usb3q*OeTF>?$2qOqgC>Zx90l_<)MCT5lASE z4@l6whAvt#BIhzrI9bD0^?`_%Ou>j-YJTtSOvQ&65U=~wT z0p1!FvPpJPaq*QZO9yR)P=L2YY4QLHp-(Nq=c%Zu_&)m`yD2FK%vWv%Cm9A~U_+-8 zp#Z&o(mxobUrbzFOC%DuKv2H?r?@Xb>HWc@VkWM`#9Qm((+;v->!ab$X3Mj0h2(3d z_i`SADkBOg`Ocb}nk@nS+j(3zD3UfYR|l7t{46cm)ZPCvMPu@;pwr-B%SPI^aQ+iw zeYfQ@>FgEdX>@df$E1m1I)vm|S=uBgdwU``_jN>at~>}C!MIl#pTt3%$EUT$dfXBM!BaB^~f zn||9mEG(GO#uH8ziU@8PL|b{SYjMRdqphT@tTF!OE4WjFp%zo5@0_oyoLC5ETTk}A zCqVNQ(}1lb)>vUTCOPa&s6ePR=wL#~2ta_lE2ZE=lMqiRCL~l&kmCqaL{FCqI348t z*rn2*3Fx_*Vcv2s2ILh|5JZQ~+H8R!(o=7_xt~0KyqDf8fS*XwJti;z`|Y)N7Ke+C z;-58h045DmjzceYFwmTPiDSnHs|&lvNs@yiq5^qVK+ZfSbJc`lOPU-TTON0!bfFEQ z(WE#ZATa0dD{s4p4THGtA(jOwKz`AJkaA}UPG~J~(!o~1Ihvw-2Hlk+DMAgSH?#+B zwt$F$qRGXEGCjrQL!|nq1;)lN^Hj!-u_!2>-K@1)g>>N3ANen?u$X?)wAxe5^C~fH zgg=jmQ1z>>VrhTZEd5>|cVDAY8pA`;U2PN>k9fph-^kcwcLSkh@?kgRk#+xJaz6X@ zYnuXt4dHJWut6dwr@LEGUY_egExtP&aLr;PZ88{Sly3y54!lLbipmb^=s|6i`u^q_ z$gyo?N8Cz=hp(4(lr<$!T`bof6mwb8n5^8Un`ru@XsEMR#KpzYB`{g==wtEsjz!$< zUIoy{wgwWmA*7ynO_>tc-)}DGtHcoWP(IP)aoIPxRqW-uU}c163w<9fVxI9VTLMlA zIL|;}XO-{e>iQGDT5!?X9a{rb+PCQ8zTd!&)4Sfx0*0g`k$}uNAM8J-mz!)ldaW8#DM5ASOVfru(UlWspEnN6KbmC<`&Cc> z1sbb2qJCm&#=3v>@B&kV-Ge17%T|`Bw1=NLsKCGhz*O@L1{_qUH*YRh)i_vTP1?&L z5FQS-T>UZEVnFq0&TL+CE9x5O54VQofk*`@Ul>x;4}0DAz*8+Y7n57w_DtNl!w}Pu zf<;M+G05cS;X%~}DdVj@<^|b31rS?cI%mv9euf?kb7UOY;LbcPzj?FpKMq;Up>=MP z(~DM?MCv6Vcb?Ciz*%HEu|OfvVXA?A8{{lilwQ(MR}WUhp`+CWEj;$-XTC8QM@@u~ zVo%0bwed@%YB}zX3==yDW?d)y{KuaoZ#TESxvBQ!4uU^ZV3!3d&EE0#@$&!ZSabJ8#6MWhw-+; zV|W`K(2xi3m{UJ~S1I>S)${Wxa-u<15rY4n=lrka=l`RB^iTcN(-Sw$UP$==^jX;0 zm{?eLMO2%;cRNhT5z47NM(EnOH2ZF?EnGO!TUjEYn(k-R?AS=?qM0t&nqDp0M7RwX zBX$()lKWa(r^x8!@I#)}S)0{)l4Wg&Ub8Ml&_CPq5EtW?(-3Fl9+^tzE)0d>658ne z@bjMA!iE+!JFwRfx`U9vHROtAcf`J2*=5(e z1&4~&lP9juWm5oJgka{Q(+s=a*Q(8?;yij?N^v*wDfu9w_d@52%zA^(E6l}6ccr+v z9Oe(#5Pk%T3FG-$$D2#P98z1omVdhh)f|?U#Xt`I%6k*UJ5N?DWf_syeic<>rcQXB zUR|vcPQ8KC2aza@q(_e&0p2Fs)pmL>ouRY8Yj%hp5r~Luk(epP1ob||;sDY|n}QZs z^X19C4;hIl_K3xzV_6rCjFztkZf4l9USB2HL!bq`Q@xiCH&^N1gdy=SIqZ2DR>^|& zR^eI=GQ=5KSk`{VRQ_3Ofz1TaV|@&O4{s=*6W-=vzJeITbotvJ@KrD%;5H5MnEMys z;jOkUU_TF8Cj__0!Zdtq(Elj^4p4^g0JsaZOza_52|chhK!Wx2-MhOGJ2^S+3HjuD zdi(n4QQa0)Lyp2Qrhh%)OF7t#p3=bV;dl&h_?aC~Sik!}HQC5w_W*w^=vvwX?mnVn z5VI>dHuAd}9}0z{$iGgeF73g+2z=2_3DIt8wD^wM^E|4)mSA~Zh z08ak*o7h~tHVFB>x{|Sp2_kSs*cMh+p&4e6XdN!|TRF}KfGeOH2xjL~=AZ#X+Tvd= zHpp+baGfCw0vb~xL-Xe`*{el@_sN=t?#D6c>DLb#l!r@jf>fSD#n!Bf$k@xWEdcc5uxrq)Lz3`4e!D90R92P9I zw^lCqZf($ZVvW$tK>D=l<=xFQV=8bZYl?U~uh9p)koWd-EX>SVI=p0AjL8ZLu|6P| zl@Jp>N5@HF9G%puP@5ZHy^9S+S~CxC58KW>w67(y)(GWv9B#OPV9z@TYJP zqD`EOh}8Xifcr(HFyT2SFjCBkD$9p?zmJo`Z4K!G3_N_|$GWJC2Wozhfsg?XvCs(P zKLH$xZuTv;t(?FKBIHD1*-_T!DQn{SwHHQ)hl_oeggehuvqC! z&Q>ty#muEAZtsD%DsWn*8;ZptFXi7oPd!NR$BIm zQ;EN8l$UGJWfTI31>-N;D_NSJx5~JcH$Knr;#P&@vAqKiGUI=v?I%n{Vem^954Q32 zgcot7J}VuMSyB@gj8>1lVF_hS&UU#My2Bb$<%p0(`m0wwT_xIRCBp`0sQYM)su(Q& z3Ps@R=}0q|Zm24RCg|&cfR<_uf|fy4{^(J1ACC0?G3aGH)B^EcYQm3Dd6Qc@0YfbQ zs6YP%nKS%7rH)B$wqEg-J`2*k4cwusl$BA_Y}yDM)}Xh3jdx)R2tSg1ta*l>Q?H^@ zjr$u}58bV;xRBg}$3Yd;THr|@kQU*`v{;gqhNIeVat|8uJ(`{OfElf$gtgD0=65W| zkj@i(=bHvEA+IALA;E`dM_{+(ypZ^Hd;6<5B1NUVU|n;!y0)_VWnd0ZaeD_c16n@t zLJ%6}eMRHxJ8DQXP*&llFX2o|zL9IzVH`|N03(vU#3Q4B=GSwG4(&4X=@n#z+4CBLTDhDNTu zdw0zbGp@Z{-yS?O@XA#%2s#}S6PTi^HhVQo-7f8dcDb{2d{bhKe*fK-@tn7xXykAY zM?TDdHuy=fQ08;)Mk537FZ(Xr6|a4EF@(q+BA__K4txD-uBlgU=x$kLbo=aZ}c z`*Xc4W!=9&r?2jn;rm&i657+7lOx8ZSM27VET)YgdbmpY_D)Mu0!B(4Sq83iuPuyN zKI40R?;stW3Hk95*N`wnWfzr4iDTqJ>(~`Ni`UnaYvNlJiW%(>4>A(uOZ`K{1CJk9 zmSx=+kHn8C;l;}-CR3IyMXbkV7k`z~$$OeGm(bz|o#F>6MRu&cj;*whZ!9M-#g{Jo zimJbVqEM1{{_mpHR6_s0UBtC=>AK{vs)zos2U}+J?>9VDHpu>Wz2qAdrhnho-SYpx zODlZ*_U#+TvYr3C$3U_3%P1bg>>OQLCZg(ZYkgC4qd5X6w=&OUiK?45B#laD;SvwM}9Wd0l5lp<0 zVIau3R<$L_|Erwo;bx2KW#mc9)?&(vjBjj7Ucqj3GHI7mQm9U4%=uuOnX0SP?Oog* z5(P28pUAiuxT*iX$yPd=6Q%k2()MKC>8E3gn%#j(hVH-07_6+U^4MFb$@L<6$gCzO z^1S%gd{*XGBFoq3G?>TsHD9 zGm_kzVx-?tn&oo(RuyG?4HlR1wR)cNq3jMf4TFrPVfVD+J9Gmr=7pK9;o{bNX_?8x z>Z+}b98$QkDIor6DUaj!@rNY>baHCTu2L+HrWMR2DxE*in_W2lgW1u+AzmrwRM1FS zAosPg?ozvP$uKd?!}GIKYR5k=#$IHSaeMuHxUHOu6e3FFI^0f>y?EuAb@9e^oGU4J zGOsnHZYsC3whjyo)Sv$H=~LCa+iOgJ+jDSmRLx8d2wQ$TnrYIclxbY2bouh-7t+|Q zv%iPFdn}cmK^lf#uM7=J50>#1$I%#56-BLM5;`ffIG53r^;TCQP5VuEPmhX8({o>G zruVhv062KQ((NrFc>u;(6J84_-dq#C*Q)tk~%tSf$=zX{CnVq zmu@qC`%Y7KY})kh?NVQ8+=3CV&xwEWy85+EX|G>mud>>C;TR5zMd*B;;+L+juDsrG zXXThvTfCNLgu{MiWI0uu5P!m6TZ%_ZPd`U*lC`+bYljy{S)YH6w;O8aJa|ykb!LK7 zq--0RLXR;olr4|K_{d0EvPtpS&z?Wu*0Z#wiiF9gu~@!<%aFS?YYS2QLS99=a~uss zmeWn9OdR9il5NhP8G$c$i(w3ti>oUq%hInE?m{Q(6pcFVSv{9pliXq@?bnK9o)a%^f}4H*bDkm!uXfQP!lpKVB=} zuD>RZ?)lTD;s3+DGSalRtN6|qR#u&Uj{K@Bg#;$yWgg77GZR-ULWEC${rc70YH2t- zx9;}HQnYV(j9brgFh0w)CDCcJpS}5fz~M)fPMSA=zTKah8A!X&n=er|-LLuO?c2Bi zUKr`UQMQHS=G#c^H%^KxDICjrFTSd3&~fLLk&!`NJB<;&6mVeanX@TWuhv;xTR&e( zQJ~p-=5gesJtxX4D}DcsTYji66scFkv7v^WN zIJjb>qdE5NJE5(uy?W(J1tX*Q;k<#=fp&X5o`lPv^l+zs&ei{5OQZNQqk!Czg4uKa z`{WC(Ziq`JMMf4?*T>1T@@nQN1ahnKSr&?0|1cVCe37V?FY+HiP*{&QOg0#5&cxj| z^ppo@8dkDMO;jE6dhnqBim#Mva>v`7w8E&mQq$f3TwGkwESBz{A}bCwF%YKtkvlH< z{{8#QmM_oLeY>nKMMG_`znr6^qhIv9cZY5Js*fe9rc{4^a-c5H_S)*D)k>iRY(De$ zy2i)SQn|AsLW)*aFCVbVq#pNSD#dp?T&Kc9M9ulk&CM$!WFihz^`L-xwXIj(f2`}z z(pzt*Pzjkm85}ejYJ73T%*+g1GDzRC_e&V(dW8q<9Ea|m;>qGsyl0#ktDhI9yr>*l z(mFA?!;rVIL8MqjyfooV!(z!5>n*#MAQI`5#m0Vqe%;@{Klk=tyW^mPg7uHjUlY#9 zO^lWEmlqcoclCcw(a64>{r%fFF*$`{t#uLppXIm&7tJ3`<^9NOelBHv*-XixMKH8N zkjV!lR4qN_YMlC`=b2meVyqC5!^0*MzKqEc(ZOIgc4j|zIht*H`jRvRP3$0g%BFTDlQU=p?0e3B}ebTP=v z#fnW%`m_sMLgTNogFj2G&CNqJH?J>Wg9mBcC>=vHM@RK4Ow4gC z`bT9%8h^o`!>D)uH)6K(Ui?&Eej2-3?Iz7S6SD|Oo1c;C>FM12LNYRT@7^tBT+8v{ z{d+OZ$D0@!O70qp@%Ub0DNFTF!4r=acIbqU1=we0E2|`4d}I8?G%h~OL7GdWyfkBS^+rTDOSevt3*%!hIoEdUh~lQ;oG4Q~Rph zdoDy$pHlMcv6HIvj}|Ok*~J=or%&|87M^K2t>d;YnnhBzZ|#?pt2RHtHmS(^!#(R# zq5Bd4#eHPyn(V;aOIUT^^`v7>m2&>gv1iW_78Vw#pHX*&@ZPo~?QLdp=?;tYQ(Lxd ziTU-t^rU!|A<~oHZavZ-WYbEJYb01oz>VAY=mD2ebrLgJ-^_o|f z-;c}r`TF|Otlu7g=q619`m&vryHy~UijaO8z0VFw)tWf@hQftO{`DfAl$D|4$CoZp za*SenQ`>#sw#~XyYGz?}L|^cUka_#TicnE`6dzPwUrbRgYKcmsa_QbF_tDO`#!W9{ zNIBYM>MOI5W89F+OXpkN%P>DxxR_EN%x}Gk@{mnmPw!_5tGn`{L)Y`{hPYT+S-r+Y z(aod+1eo2u?o|3E*#-TtL){-x0$?lWBLdUqSZ;=C`5 z6#d4HQ7DY%9UUD8zuzc6KW=s);s6+C`QcNX`YVi@77ib1M-a=>t+Cs?Py-Fc)A&l4|j z`Ww3kTdNrsAOU9`$CU~OxT3TsaTiE6m>6=lQ8j7wj=RCTt zzwyPMV@t!+D(LOOcLKmS3EhB;jqNC@69*~}KIhfQGU_b4elf=)s=B(Go|VvT_W^Q)`=?e2@NVG_2dj(DzB1o?>>K^qM8_kZ4$VR)@3_Uz1`@4f)} z1SxO{3s1&o$)E<3Cjfm35x0(2P18IiL5PmkrxrF)}LvMGBa zhtw4nABmVYW3!O`vV>BxE26M`Id<_M9o`;U%TWue z(M@sJ^vujj=z9uCtT5fY_n|nr6a(q08O1#1$Ebd&hj-Nk`lA8ZR8?>t9x6iV2|PmA7!1j@u(wwOIU#j21-}Kd)Z4v8acUeS2osmdA;SSx&Py-Fs`6?E%9twdlMPADPYL!8jTQvu*m6c(q@v z?>X^68B65!P{x&#^^*e)@`nx`x|nB^pdUSXZ}UDjIUi=xg5d%*&3JY9e-B&_7=4oz zEA)-ieyy#owMlCH>$V9VCAeQe|8~l3e^S~+^=bYD+;)i2)oS5cbo;A6tD=CttCKHe zoEq|f{Fqce4s0u+=S1ZMznG!^%GO8vJN2=XNjY}xn8>uGN&D*ybTV`4z^Gd` zZ{8y>U#T>^L&{0nb@q24DmCa}5|gm8rgd25!EtXF7Z)L*T~o9-^-uuYnW>R9wCbNI z4l(Uml{$bK3V_RtHhjkaM&6y3V1G+XMeL8sj>QEvPEO9|m-_ejo_oq6Dk@s>Sl|d+ zkRon%vhj-V)el}<$|@={@6CUysHnS1C(WUwqXX#ksih^q)(zAc<>D)VIBxa1u0VPT?bO5*k9w8jf_)2B|K&NrQ%>5Gf# z|MTlRA;_uDQSTo=W;DeBrWG#a0hhZS8Cbu1wUVA*G%BBvMQ73FC};G-39K!02~48f zi&@i-0xkZ+xtE|>F=znRhnLokhalL2s23#w{r;S=aqY>)KP57+E)~-dt--qY3)y6^ zta?sKjeXjKy9#ld_!$MUjFX+cCuq0@6Sz~3l*M=N-g&vo0FklJfR4oyZl=E)W8Bf4 zVd2ih;vmNtu^4L7FBR9mxN;(CSYB4vV;DtIsin28jaO!NW=1CTEe?1W9er21=J zc1*v)xnX|mX8uX; zI&-E}l!f8NO$!l}xgF4#k1R<-Z^pk!2I+6!cTV}da3I@ZBe8?WWrGi3XuN!U0s)Xw zH+iiOWka~xwQCoXw2RoWzvYeNh}-;x;h6P9o^(`o5seC8v*aqh`K<(G#DO%b?2o%#C+)cww!@oj`}urv{{k)pY!Q^ z0G%>!eaW{U39{+A?BsiJ>@KPB8HSaY8K(aV+#a^n-0JsE5hn3qAg8saRi#0*p_)ca zVwn-MDmw9>KMqgM?B&%d&@Ay~4Q8uL)6s!0bpGhkTN1YYZ2R`@3vHQdZPk2(DtfWN zB^Np!!NjhkZ)p?NUwpG2$<{C5dNx8@i&@kx07{Sl-m??#i&O3&_-c2{VPj(nTOuwA-DxYX=Luu)~>*qOwQ_p2~h5yjLysh&mf%K_b`9da*``P#H;|5dk zt4&nlmipaz#p~`}h5K81O`I0T$H&P4t0bu=oDSx*va_oP0!+L~ONVBn(%|y)g+T=q z5h|pmrSoQo^YukSw`|*%fd0k7$9L}1rAr^eJ6*;rLd;Zf_it~6&LsP z^<5pGWd(o1U0r>5YZai&0=pc+M#7F`daigoCUGmhgsFkn+zf5Uo-JpeiYbDi__2K` zDMRksM87;HL!;=y)B+#i#Oi9=h#_3PK^*HX5x zMg1ijrRUmh&$e)@e$o@1aO#&6$pk{WN>2P3nMYTbDr`|Ao zQYdr|c-Yz7H%N}WK5udXItu~$!2ApvZoj?-%FQP!C%jwrcWl05yJou1+CkPg{`%~g zmEB%+fjQqtn;K(1JSb9=wdb+V1HXhzC81zm#NusEzjQO)WlXLv`NDZZa9&-lvFR+L z3T>VOyCMZ@Y;5c$kF~9>3f6C??La+qIP)1lcnEP56E?y|RgsNjYZ&-W=2>lA;%Y@h z-+%mw&9&||9%+Ar-9o=2$1^#ZXQ(Axe&4yLk&G4`*i1!W+N9wXK-)!KJcokCgs$P| z?>||_ofa?Wzt^}r`W_j4;GI5x>eu?b{QUC0l@V&PvaQwh;7v4jKh7kP$#{?P@qM6ZIPAefRkbA~`G=an~P#KOt>~958%v?x|Q5i1&r> zCBAAvxbO>N*YA*s2j_AcE8VvRP!5yZQ9Yl}v{omqczO!+#Um#HptCMzpm1?M?Z@XQ z&p{B0g8QNQ;K75nXgpdu7KbtnDykpuI#Qc_;Q%O$kN*nFDFMjnQgfrl>;)Fn$eyFGvk1c6lfX8CA&wo7JEN69&O4A`*1nX6Xq&>+V;N z?Gkesjr@-^07;R~=HQS6`~+2v?kW~d(3+_WHFcf2uR109`P0-R2A+tThle}<*w*Gc z)ka9ysaI2|d}vrTSO@>lfzos8&f<|0<|*6|Dm1$|sjTa>qRq6c3q`r%rJRL@Ypio%rr6WBg~di|C7h z^%EdL1LgdMdR*{F6@F~xQICW$6MncTs;9f#Xt*_(Ny3K1yt(MosOo8P+u>I6FeztM z!^&_KXbNnQfD#&SQ>DCxIt+=nxxh6aHCaz+VMOY|ty?PqbH3+Y9|O7(y8M16H4P2K zxl^bQue(gMA-((Abbs22Ne=U;P~5JFga$@L@ayPwTrMx18#^th_M@e6raK#N1=JJH z2MzU^424oOLf#*XJuj+2TwHvnS7vcKZn>Yw7!Pz>Yz-Am8bLX$m)$u;(K<)Jb*pi) z=emnoCQpL+byB0F+2qvt=B6fU18u7nBIH)W-(c1P*3*2YPoy4C~CC7`T?fb7`*~D1!GtZ zj>;~F@(QBhN7^X1phkht^W#3%`6C5M0Cm@(7g$+Zem%|qh7BMW3n5m$@b(%8E)fw` z?D0C#O|UM!j+vc}jbqoYs79wFM~EI`SFr`su`v_#)f({YU{VR1f#&Q{a-;)-q8J8B48S?Yx-)a5lbHT@Bf z0W*K6Vfg}uF07lh1tLeMz!Mzq>U{WsMJf@93)t|jpiw%Cw5UxOPf| zqKG|X&~`Y4x5iip>4UI0ET=oDklc}HJ3!CGbm}dZTm;xI28!`E#Y`5vclh=AIiQsC zmsHDX;w`^_q^Ip+f#W3x3-!!ifBaLQrjv#$3}3cyIDbSHr57B=+_FZpPz({PY?CE^&yCg6llT4S4NMZ1UyI2$CB30a0gVH zz(6R8!5LmrCGxXEw4;{U{Piw5!0uXzPC@|p;JBq9KHOfmL{v=PVUkI40PspW8!AEu zOjWgBcvk04rvRnMa)WG3WYm#6#sL0=MVy1fN0iF(9~Dgdbv?*#i8;+6E@}OfLecLf zx(P%th>6DpFq!L|!Mg~JLu;4yv+1j5_gY5b_;_-ai98AgysR_;aw9+ir=iS-?x7)! zm_fn`UzRZtk-HoByaK@1H#CG8Df{FPk>^0SiRW(i7(@>j$Yr6UbcO(%X%bTQBh=g& zlPKXd5pVGManz5B&;hat=chW-u$qk_F3-RL#axP`P2_MAo$8I#;wC@|l3ZuRPb+uV2$MFvKB7ae>uklhTC_tOaZvri82H?&-p7`3UkPIj~yX}C1H>m`~HYf5Z#1|e@s04uX;;_WT7-Ks*XaN{( zpl0@=E!Fnb#AVtIT_g)D&*9fI;sw{IXbe1%9443sl!ud%A{GhtkbB?0Ue5yb?bBq> z>I6aO8!24W#=iwb>BanSxt6B*+!Jf~SQMq`?fzxWU)VX`j#;PQ=z+#L+?LM`g%KpZ z{@Jnn6PO}yVPO^0l0k=Te|+8s?`%B~QXt`~NfPi^kiclpGSx74hO~%!1a>6GNR0W& z6$HGAimIJEcP=FJN{~`;92d|&mel!6m!jDEaO+j0UBz{;9jzfO`Mz6P@@1OfpPHJQ zK&P>rYGgwy44@RB!`hEg5HbEe*aT=nxt$|tXdI!KXqedZ8*&lk2W8$ErVqJtgzBTn z9otn#g&PQrTtO=Qj8|V7|0lI~{Hr8h4BrZ{V7FkAu!%>}!J7K`Vdc`hs`er-L(A%- zkoJ1a3u`05-+zzXsk3M6NRL^^EMf!-OJ8=J5Hc+1XB$Mh)e~#-AI#0qv&-FQ;4cu| zzyEr5Yx2fD$2Z6ZZw7?qk(AV!rk?hTF8XoZ>Gk+`CdY=8%M3AMlp@n#@HMVsHvmw? z>tDd$WtYQZuLc}B_ejC4r&p)c2=1ARvhvYG9v$R*@PYeT8+9g+{`s3Uk;3}|psUWK z>3>B(3mEEqe`&yT{fg2;=_`Bx8_1=h$F zzu7^7Q&Us@m@}82zts&~0gWJT14l5h^(z<-JH)NJL#QU~J6z+iI*2<&zm|g<=@Lcs z!iz{lz{fj)g8ES~q8_Rmcd?=PB-wq=%fW z2ytcg+O^7fTAPWVim(CBK>p^xy|kDclR3}Fs?#V0#-jgu2YI&jf#8amG)7_}|GZAi z!ck8g3Zg4x`Jv{iCaXt5-NY~xok3n|GJrj@9S9cXB`zR&8$#{5FIAYL|zp<_Ojn22ss4*-uawmH1HFO0g zF^fpNnyu7Cg#4AzeNc&=a;Hw7tn%J=pnG5-sk2j8Tv8I8ufp%wQON!16H4_q(l6hW6)`garedS;F4EPMaMkUbaB%)0SD%d%7-Dc1e z5$I-j7>33depUfkP7-$b_p8UW<;j} z5~D@DhJgV#i0%`&J>udQ!0VQP)^3-eXtXdc=(>2?JuaR{x=d)vcv4h@0h(cVt)|LX zetvu%p3xY;k>@h~5`-Q5K!#IHOdWRUBQ|33_$jAc%v5TyoZRi%U`$)a{ci&AOG;j9JpSiKtL^&LuR zZIzYsAT7W{{%}Gi>;^fY{Sco6LqVP&Yb(>}>uxzEKrXZg8?-HITH5ov0UH0}agk?| zwclJszx@z2Ju{PtUN|;78Y!FZj6Iu;UcA@P&=3+x%F$V*y|`eilID)}6x0J1Dhf4B z*lo_CB1}>Zm^1qoLAa0)IJO!r?^*RP(895KhooKfN{$A!6CuMd+vU`b|6Y6q{0K@E z1JK6B&VCGF4=K#pgHlqwQ;Q`s3sImTh}wK=YPvv0MRlu^qv8M5XQ*>A=RS0yW?^9} z>}0`KQ zwL9x~ki8GP>YV(+U$+h)KKu&85hVDVhp9Yn?!r6fY}jQMgMFs2uaAfoZtyyp)=={T z!rj;s@IXuPi2tP#LiS%;Ms5Limm$XbvG$TMr|S=hFI`@VI11KA!()LfHYo2Te}o{_ zGctCF$n82V^W82Kj27M##|qu=&z?Oah64f6$se1Vo*Yu9bpBji!*P8+x1Gc2onhk* z45A-}DSbKC1zEz8pP>RHSS1VI{P3-A6*ez%KKcVGlcbA%!A( z4Wbcw8EmsO07b-dZHb&47!(wX_3{(YoLD~yE=Hj?{A_(D*ZG_Wr)BPPq4CphYuss z=D@e`m32u9+W(#&%~_@mDGHcl&zJHl7NMy1 zDzFvm2b(hP^G1l6hF~03O`4>pT93R1vPYoIY@5$L&^w%W?uccXj`}z?v%Wt=!Wt!x2aG5OsSJ85=!pc~AEPWSn2(k&! zf%S#$hc(H_qjSaX=a>S1WFS7g6JpN9g<5_2$bTW{vU?r0<|MTU?8ULV>xr@sUKk0I}*9Zjpjanqzro9m_%WD<8cd!M-W3@5dt&iVHekbZE&hSqtVn*?iHaxS$&#LB}|RPqz)YLr!WtrAv?1zPIB3N60eF_ou zL;PuqOgA$!a>zmYA}JfTgu}O2qX_%G)qR+ek#WRb2`jUR3HD$Lp^1<(>mkWaRJt$t zKa12Pwit+VyyEj$&QoS2mPBeK>Kqi=lh;jFPzjZ>^YimpJUMUzjP~Lir_3WXRl~!> zPghb*KH_>?=;_(yh+7W=oj~jZ2m`p0C|NwNYG-$MG-RKoltmcfDge}w`)wEI991C6 zlI$xnV?oi4K?LDR97&imt%|%pGtpOk=;aaQH818`#gKSxZLM-{US1-w+v;`eQ~-(D z=zHZ#jttk*ii#!c0>OxKJKyc%&){1??m0~Hu_{LwKz&iU ze0leWoC7)UD&f{hd+Vw#AxLHG~}Uy-yGMzbGdT}Ku!E*|jM3LwaMJC7tG2Nh4n&yyfc zn0`7_1`z}?ZbVf&`91j6*j?Dlu*Dq&KgQHvH*?Z(pNsN z%{1@OhF9LH+q3}z-)jtfnh!|}&Z!U-6buLsj)O(W1waW!O${S}DB&(B%s~#5VPi>% zfPhdxM?@ZgU$q}>MDV}?+vzcVIlm?oRSYu>_Dic$(QV+_k&_&9)em+^Dl02TW2v3q zM8!}RLqG_k{3I6!8C7ZUR~mXBsB;ES{*FC9C=n#?L8@brew=)SDyR*vwq?TxT}Og| ziaJD*Y6L4g3f@M#c=A|?1LkDr+kJjw!ALF6jf2Z%y#kX7{3!z`{zoq_Enx(7(tl*( zjXF)%sS%yxbSQ2ZGsuQHIxFG)J2~8a!O?cG@oRM)?&tXPuZgpbh!?*zWIl>jH-K;x zAZm@jytJHvi3gAj%EKNxER;Oy`HAyr4oLML@guAUhZ7j`D=`x=8=}$DbjA<+q1B@x z8o$t2Yw!mfBwqXgb=m!=Pqz~}5ZtaA+5Q(42?+kk$Thq%O3DO1I(Gbc85T8?DgJE4 zam7mTgDC)w*)anuxT5-$$nDVVUCUS0{dc z{qW9E4iQ}FlL2gDGVa<+rHaE4ynJ^Rzk4U9Aaa+2zG@<(W4)fUuZ(&nOs*7Ee`0GA z>*egAJ?#CjV#P#SGB35GrDHL%EL-d%w*Ev0pw4-DDV1+>hM0glR1d8JmnV)*c&OBIrm-orx@(_g ztjD_LfGrbYM7w-zd`nn7!r3UCu!Tt4!*8O=FoGPx$mnO@-7`6o{Cbzi$94HL6zh~} zTk}A)V5ATit|DS1gWz|^SdrlxI-@4rm+W%)3SDu|V!(WEtKKczeHkeZLvK z4x1}nMpeukfSZ$pgB&(e0GWH`zUW3xt22GY#>%Q1aEq*Q*u9BpJtPT>6@EYE`N#+> zpK6Luhp9nv8aBz^@$|gdo?MQF z4qp&Lj*rfBHzXY3vs;Ya!$G%X;>_YBio8X!rnEzh12^7O~Q!7qDkQr}S} zD9wL!U_2W;qTjJv$}Y!W8+X@L?b@N#_B2nm$sNd$yb6USsNrP{wIyJtpYpe7HyX}o z7@RGiSX=0BN;i8+BosBWhuNv7NO!-{`@0(nwt$S5i5ns=DO5ox;NY}r&QC{uj{=jG zHZ-VV>p|K;d*{t)peYO<4CjgSTwGI~w(w@YZ9_;&^|gZq3OB~)*`6IV88ARoxdww; zrg)N;iZL+J7Z7i)s}vjUp6GmTZ&Z5LC( zPOhEma8E;_VsL(^lxx*T%!$cyA$X(xn5(s^~2DaeoWtu5qSnIR4e-pK<3!wBx$=7!40mq(KyH(TV-MN z_f#3!%43?fjJnfiwegPtQq}rh;b1FYuD!?hWU<@4zFpuY4aLLnvDxy)%J#4lHN}ou zR`)P#tC!|%dL1kEb`5U&?Yi;sgiR7PCpyP_!-pFOdoS_{^9X)pJ(UT`lrumAYRuzT( z{ZuLU@7{klr`yp!%_-I#ad~;GWyuc8+L!C{`lo)u2%Vd*bdN142nT@BQg)t!p79pK zn9tjlP_x6zycq>81V}a_;8P>;v_edaIm&4_-onJcwXMuuxTQsop!BrF!{NaQpfb z!MTz0W@4qeMb?kc?1jsE2`OWKnCG0=gx71Cvk(_Sy!MgjWO z2Repf>xn{%v;`+We_Uc>8AnZXGj!9Hz=_+XoamG4$^bWfC>f=Cmr*QUy?Vu1-Zb>( z=4MQzR{DvoPj&H8QP*LB*)h)TK~e-3wDGlT_Z~d>fe=lji3o~jZcmVgw^~zkp!be7 zvW|}86i94ZKd$5_axP|IL^buN9u7_2XKwUJi{LMw_ni7872Regn!2X4AyImb5=oN1GdR_Njq=67fkvq0hOOWvmt0w>;xmK_R>R>Tq{(Qhp%16CPVzTMPl{*W0tAZSS#LPhPmN4H=7Do}QrT@6ZY%u&;zaIXK4qAz+67 zqJ~C7yb<$?0}>J;(b3T?O~G&1?hV%bcF&&a*63kVou^@}{DTjcRqR4{I%?v z)Jj(Y_s?k}!otE&MHQ@RU%Ytn{^Li9v&>RXHgPf$m4LnF`$qQq_uY_hMzu@+DF5r| z>Ho3-`}jBo1YXqi8Du6>XvZ5XY)Cp$Whd@*!OYdbQ- zIxadqaD#@{R-+zk9PlQjLE9PKe{GgooAKxI(b4^5N3)#~Oq0~A1Sg~SC@4$T%=JSG z5H$S*l*OMy=xdk6wy(#Okp+rO+PNt%7~Nes6V<=4{L6jb=-RmbUW!s~;bDuqC*Jmk zM^Rp#D|8_yoEY4M1QIHePLQZD&spveYZu+fA4MfqecHP+mz>^Nfnh7N{DxZr##+WUj%b zS|e!_d;jnI-Tjn}m0E-Dwe^0?k!CT=bzAS>230caEqVWb0|Lcmn}md3|NCA1Z(=2N zB;MiQSM&)E3NM6`e_v9Esf^&_{`>0NxLWqVcflz8Do`%|_qwA;oo+3w`tN1CcUSLe zRi^&$uc=Y5Uq3y;;olIKTQEK$p$k>?AOs6K{KY>4;32P#3%5m7wSBD3OL5JG1vR!gB|7YSjvD?i@@ef zLD7^szr7?kNFnDs-F|08{6api%R)?9K#dX8q*)6G?#0Cv2S>-g$;})44&WT!JL61= z$vk{hJw=s?nfa=j*mrK;X>j@?;i6FpTS{Wamv94OR3T43NCq+d~tpqKlw6Zb|jR}AdLdr)Es^$BioFR3| z%WL&VU)GUVnpdvu0T^>Y5G3T+rlF2PR@fJtHf_q|u?B(0MYjnXE60^gVIpv7%n~sL zJQtE=yG2B@YHZ0V8$CoJR8(#k7Rn&vsA*jxjB$9r!^y#6zuu>ZcgI1K}(zAG-+%i!o2l9HG=$bZ%-*HZNh?1*2)h;jfLb* zF)}v34A%TPRMZz%1JW+e-M*10&Bg5o86#ZAR%N$4af4`u1vS06LJLUVYE{nb`qBqO zgOv{z$LDHAMa9#Dj(!Mk_U%Nf0@GpsW^ya^wU3uyY+z-r)Ut20z0lBsB5m$Is{ycm zDQokRs?`O9V+kOxk2z8#VB=!#dTp}PLKE4wt58k)5ga&In zm0oQ}KGXr(&QGPKZ*g0=Jet{F|9cn&v%J2&7+LQz*!a7pq;{b1Bk2(zA0L^Ja1R1Y zIL?V$x^s#*Z-{waD#dxMwX2(QDQNfTQ zJ?zMl<&ZO9|N6-MIZU!)<%5y-H=#JIXI*nvR8d9c1Bejjc6g$04#Mf>7wX=QXq0Cn zq{EcM#oyy(WhaEBY{=${P^oIQJX zuqE3U%hx{7Ex+vxu2TYQ%K?GSx=TMbTHRYrL?}4bQVx;oYt&~re77qMip{dWTZnnv zRW~+%BFf0wv+L*%j#4)7JyT?ysidJ%4$Gw!0@qa&lWrVSpl)`OhR1i{YBd{w`*gmn4^+^MUzBJSQt^lCGP_4V|RP=rK0`}_N) z+gOt7P8k_-SXx@136luKGVy!#=+fM!gD!veqYRgHbVR_n02c(jRJb!KBrNm@g9>jSK=6C1%+2mFVu#kRZP@EXK3=8j_kA|J(NT>e<>IEu3Th(%ZM ziIWLW}L=fGT}C%BQ7RUT(RolGNoD?&>UEUScg zU`TQVmg%Xo{Zzc)oMgRi9GslH1O@#P6S?-BrIA%vXN255lCF8_(k_%6 z&`|qav(O69v^4XU;HRO?U~vW*qCc~}fM*`T12I_Tp8LNzWYd!6x?pD#*%{dHA-@Cc4wuyFD}Sx z$p1vXcs7h?7SnP@QE_7jLZ4x&^7&UVe6acdppQF1CVagA(ha6}*;Vab-#wYlIs?_T zyO4+Kg*7GmBTXZFJtXoVKCLn&Pmf|1hlhtZ4%tCvyZhk5@XO`pFZIh&u4y&0OfKPU z+i?xj<;WaXq?i|b2QxVo_*EWIdk&apeoEfHv~Bg5F9u!ge8~U)8XtfD?Abd9K_@pB zPE;r?T?rnwix->wb}~UKP*zp7f}wrt)Tzh9*MbDhk)E4CehRcp04ir(4=~0bBDlYC=kbUFNRX<8jVh4J3Y7ewY8Gp{jV5I*B086d)T_4Q2; z*>}GFW1ecyXE!LNB%j;u)}}2kckoyA!*|lZIajtV2fpj$)uE06smxnPqveB@&M0QF z6P@v?v@263uZC_<*&05>jHc0v388SmtgI}iakN`WSN5dT)GrCN);RNa8KW&`+fPsY zi?7R>nzavc@$;8le(^9k_=JngYXK037KfpqbCjG53g*=XYemQYGWe=-U=RLBmS_f4gp7|hzT3&C;;IZ5_9y4I3Osfyo+I1 zu;#hyt=-7P^f**lzGHqT{(jfxfy>U_2ijU&vDic;mf3E(J3ckliwaFXLBnP4R|#p7 z*!31IrrF!13V!|WLn!bA?Exw%P; zg!-UXGc)+3hnX~{Ux$>lEv<}-=YhALtVzq+GkvtIIhs-`Gc$q<*J*2Yu_3JQdJTTZ+3&q2%*z?gxEfbbODW4o*`C=Za(k$-$?U1&q~+wtO1Bg9 zn*Gi>X*a99a_&yx(+~96e%Z^dzatQ@YabFC+LUF=462NEh5mHc$0sH|y^7g;iwjdd&9rS%wCxXDMqT>$yE|~RxdM5Q7WR=&W@74&3h%lvn zb2)EoD~#-9WNfS_R4^POynu9!fO~6>3Ba6T27Q&mTZ>(+L*~YV0;RFv5%gAk(Td zi6y$u>wo?h+V11yBUCTCsjXUM!))Y_LsDb8IN3BJ?l8I&KlvOkHS4Fe0qg@eZDzBA z9M6O@ZPJ?a2u{EDgm5efK;fSc{0{vIaeqb@7tG;3NqT?Z)0UK$R-z}kEnyPekWtu} z9xTI~S@Z!kuFe69jdM{m7_;+l6VU3WH_rBPH)Y{4ZZ#@j-o6D{FJLrId<0NpqE}>O z0=}8wj!0%u|3T1x3Z{cz%Mw5xY=r z2}n8xL=D%!|DnX*y?Z@zG)z%P$2X#*A2%U;Y@+)#B3|{GISiauLZIaH(X2aq9HZz-`)e=p%Rr|TQNo9cK?D669+b)ZT zfq};?Ed{_{Xq%mmcc9-NoNBc`xbWwDD?)B-aSHKdf&&~S3}x8I;j6t}U2j3p-toKr zT0^2@Zu0{=z|S$BmXAv=#<#dj7X{{{5U38$cx?2bA;iA%jdS+bx8xHM za`N-fYiU8zzt)I|F&s%wcyuFNycTB7M#`T9*Iy%*rv-2O!Kl^%n z+w}W11>Wa0e4)-LYPKB;!g0z>sJsEGLoS!_(FQ-$AN=+hN413>A+q4$rO7Md+_SE^ zy6Q}bP(rZ{M(c{~V{?hcR#PI|jiuZJqdnQtx8as23oCua;$s;d+XBzGTEXB*Q-n`J z!-9hjXaZGcmzdaNq&$i_L_x;U+!tpH7t0YA^g`PL+dr=T^S8^_uwRptJ^N&)SNTfM zaDYwfkX?|sLsO%mzOm70!pw|(iXe;g;EVNB>j59nQ5j+FvAEA!F5s~07~JVGd`vTG>YTxf1t>AUvp_ z@kvR=5V}8oItk(SyNx+cP!UlHp9aB(42+-OCJOXoxie=_nO1oqByJxvybJ4DXTDzz zR3EC?wY6vVwQ1y7TnbJQDD1=W8XG6;O*=u27XSDzcH%>5x_f(Z_~($G9viaEJDm1( z*tM9F{f~X31SKUdZeLVXl=lwF`o4-XP?3ycbs>q$0u6fGjgOK*_40W3?6wc`gMLZA z@(eOBqC`&|ixV7dNYlv{zqxty=KQC@4vQv4trR=QAPQp#_Wi{#4 zd7bvD+tk?Dwd&(kS|?k4c$j5mu^2()Dtue%d@ zAW>G(xF|@5om5t)r-1E$BO()&EB6H#l>j{Ar^2F|n#~?)TO_u=FcBw{pwun-JSK)3 zMS+s6n#9%pR}BG1zKjoT1f_fdB?`(`v^-Iza5M(8^@Tz=DSVvI0c32V)6*Y9$h;zQ zO>8wGyXE@G5uz(o(0)}sT?~0Hyu3x^R>1QRIO1@b?BkVE_va04w)}r+d-J%S)As-S zlYI@tL`asAE!md}S(BY%tjS(vFC|-L4Hc5TQWPNy?UE1`sSuJjR6;71(0)IUn(z0z zet+Kg<9B;Ju6c~Ps6Oxac^>C+ytZ=|2>=QPppOLweob0AjcWDhpZnotmfw2+>CMkn zT__zq7&C#USFG^tJ&Bb8g6iY5f;^08uG+=dQmySG$5>dDOlbaB&ZgnA$UkiQe1FLW zw)FP(Gw(BZkQC6kMGFol0aMg$`#5m2hg>;zN(BI@>gb(2I>0+VO7?)HD5+Y?0#$xP?W4EfmpLBxAz=DWlSrZNh%xs+GO-nfh4%hc3#_4@UfP~P%{ z{esAJOGLY@y~ef_MoBbe@d2`UoAJkx zW}Jh)`-^=jT#xe-=B{`m**`)M&OGu0Gh?=CTD`Hn=XckdP|GOH(-Y+W@= zvG7rS?T*S!wxIvOr<_@qVc`jNp7SC&jOFL&6_Awr9tkJHOH~-#I<~xyTN~1Jc$Qkf z&&3PGvUF)@CnqOaQKJ{N%%@fug87b4>D-Z1ZyjECgls^XGNua{23|-{iL+=G_;F(b zTRfe7-T=vOHaC|y8CAM+sLPu5>$CB?%j6FtFQ_keHr4)1NBeD%%twI0mHaqS0c3zO zy+y)40IUhW(C}~B;Y)a2t9}g5Ujy2waMiImY(t3D)UyL0uc@MCj7dmncu%>J+z_ zE@S78{7~NNZ{LbXBzN5`xpr{m4qY;JM`GcPn_7t zfe73fWeNEi99uGY@Ze)$I}F|jpRDZKzyI^!o}Z}=70UfVF4@40Uw;i4;Djt`Lqw&e z=gzTX>(FyCJWg@c_npjgV||-r>@;I@c2hJTUXovs5ur!RIcMIyUtfQ+PEgl6LT89g zThUZSb18yx*{%$g3@>h4Gli|oO4)|rY#sgt z>t7f?+h$9vwkrb{F2GaC8xag|DKzT5)S)Oq+l8e~=a5yv*EH)e^xK}j1}vQ>>gw+H z@dZODiFgeoL7~qg@`vM$y32tn;@t+_=G_2CBiGOXF)77>!^m=>R=<8nft8F3D%TA> z8^RF30IN-5LQ+y&jx;D*9f1kKVJ&u(hSs&HdAUw$!DNc=UWNlKZQdavXCTiz6f+%b z(;iC|<)}#eY1^s)QUyA|>x+VqAh^kBWZ>?1=gv9K2T=sS`tW%t;L)R%1DQQ8MI|-` zuGt-QWU->5a!18dPGYxHzkdAqYsiq3jJt?1cB~77``EH^^ZvhEFa@1BpMN~;Pgl3N zhf@rrRu24-n>%IIs_gD1)|#NTg9rb(7;Cq0pXB-&8Fk_XZ93OhMMa-R6vSj#`Z&X^ z6e*Z|7pN|{GJdo9Y4KfBlz2>sUYo8$9S?%Lb$)bdj;}?c#-_&)6m7NUtdQaI$QhEM z6{@PL^YTUoG;}e4lKt0uHDidt(}sV44&6NHT5F#R*Yk1?|2~`_J9l1d;uHb?z}=T~ zFvtPv{NxeQ5(!wQ+c9q9$XOOV(j)xtT_GMyi`}cA!Q{ka-HfF?&S%bc>RrggkE&cW z@A}+6EOLF*mZ3W-gjcU$_X-U?%c)M7g%oNE8~jt7)lCh8)%W@as7DkPnT0Ers=?$M zY%J~ldndT7_n6))V~Dn@%>`&@IEGb(Jyv$)>C<*Or~2MB%dUTVEek%Y!Vr-0bih<* ze~uKMhB@`dyVbdrq{O#xuP6cxPv$I!n&SV%?ngO))kQIq6cAvC;pU%MmFt$`&W{>x zt5~+<*T+wv^lKG6P!4xe4PHQE)bsN0(+HxxNbPy2og1o4O_j&GtM453kJVwuiDlH=zx2wJ6C9>b zYymHpM@B7Z?@^nI6~3XL+IvpS-JgD{{;Tr9hOGS}PxZ=}HE0+! zLo$!(-kh)5HvIh0%&ix8pwroiT5W(!+_%(FXO^kq50fohD|B6gN$XI1Z*)=g38wJG zzh2K<6Mj(7bzbX1$9}$cjvuDGZPm3w)N-DvVbS{)#{Q}2=w$U-E1anXTSn%68Acv(Smj+p^4f)8VjOhtls2rs$Bv^HwYrAK zEWZ`<LU4@4CGpEZ#z(iHk^=`Coc8VGUR-ofgcvdV0|NrK z=ti)U=#w$C?G8GBNsbI;=HDPbrAc(#N#y~s48M{dn@1;bcI1wsqViEu`IwUv%|;%M zxx;D4Zx_5nyFnPBy>)C)pQVh%9P0wawJ&8um?LIXqaAreFzc;4F=^WR++G>~+z)}* z$E)6cujf`oQIk*R?|D^sp;xe`;X&<@Znu7A6qqTw%cD0rzpVjJ8UoHS$tdN*RO%R} zOk~0b!1$1_JNb(9%*y{VV7kyvwk3s}&$`n*Dlo8`K*7 zq^crEufxa%hP$7vG`m_UlY%edZd*PV?hL&A{H@Qh$rDbEI*isGY?JG$0K|ke5Lvaj-2Z<-aoaslDtL zV57gI;bFr0YpC|S6-BWXw5XN~lK`%)NP2G6xbZR=3LVw$L`8qXr=DY?SFXzQ>na#4 z_#lVvvGeES(aEV&c@G_05}YWrQI1WO9a~{TSYA-m%agPbY~YQJOp7A0qXV?EyykMzB85X)yfqN~a3ZDHNA%rw5* zb#m|Wx4%kk_rCF~QmXu%w8A|X-g?I+59h_d{$AhDyy~s6mm^5pLYU=Ue*0%`0?&JT z-RA&NxJ%EWU}>$QasY|X66@0LoOZ-IwNh1W98hxDh>oP-Zn3f$s$e=jAtjkbzC+*8 zI$Kdkh6K&%CohAE@b1rdYgevZDPtM~0ZU7riF2@&k+TC=HDRRj0tJQB!H#nVYhGgH zq5J?n+eVEVeI97pd0tz_@a-;58;pIrYuBU#V{6#&3rn)kgdfAct(|?mOv69<8TnB$ z^ow1(JZN-(|Gs_0E0CFkDM%!QRIJ*Q z`!9ZWfAl{$sRjn>xh?lqnJ%1Br1vRdo}1sYO-b3TKfz>=^K@^PHP(<3(jO2jJ&;n3Q*Iv>%7C~ zm519bqED#E-x?8i*6IWw;|Ru*oQUC^9n(Q}usJ zQ_74x^`bcN>x=GOpOWKG`~2RyN(L1HYdEO8V^IY5=+8*ZiTjUs#u%MN(w^7+%DP<$ ztn^}{dNy;@w|9Z|EEWAD9j_iPJ@WT|Dd)8M@RWum8Ln`c-7VuokVkL$mw$gbo%i_v z26eUie=XJXT~DVk*b`E@e+~doVY-v9iW7l{3}$Uh#K&>uVagHYlftaMXG?5;m}g7UcK5QDCpG1i(S82hSgw7wRkxw{>4u?vX7rRv-(6S=Rh(;Hm5vnkIY;p=_;X( z5UZ|a9aVgusP_;~`i%AO@5?}64#gRJ1_qwwEbG7KrPrwBDC+q>U>I&eu? zQwrer?)TzxW|1043C6JbJDAH)J%8M0fl2>13A3omnvR$aaB}1QwjG^tm{rGhrzV(Z@J5N=y~+ z;7(jz>^VbV(iFlLGKgXXh0ABzB%;7ln_9ay+FlZcC${F?l1@k4cI(nbX?4?MEnrsG z7@-H@*Szu14YMYna&ei$01hkk5rW|2-MgvneiZD4JmaagYTy2yPl^dsV_r~-&Qy2o z)5_;-K4;8U(Xxj38kyF8YoFn|F8ec4N%#i4a2?%mX&!@GLER_T2WuSCgXM;$xyf0PliL)X1$K++0a8}!w5 zZnKUC4C=Xu?F&s*5fiW;r>{PfhJPKTKtq{o_ktdufj7Xfv~At#;SzC=m5a zdn#{3e}C4OR`5oi@cQbAm|dtInCYMNii-k16QLrb=>529OJ;OU(?+&M+10Pg0%F2p zF%dlxzaPEm@DbW%e{#{-zjsD#^<2Rs_XzUo)u*4y$8X7|{cAt}uJNrpIT?Wu6#n`p zg8J^i{7@tywrP6G=jzpEtZKM|b`Sg+_xa+{qQOIpgg{1XlkYBYACbJ%i>%lVY}e|{ zD5!4HP%_S=Ba28Wet}}P!PF;yjNAc>-n7I`!R^;C!vXNkol?4`vh*?&~t{rJYgl*zp-wCf8HRh6|nqrG-(m?h@vwRiYrI zbXnlS*CKJ?SJ^RHbYFZr2aw4#CGQkeqOrfyv6=>r5mJ9vqY$ch76(}??&+Xg4|LVZ; zUJ0-X$7KupCxfIrwzAdg)$0Q=*|pC9mMiZz9lL5>!v;dx1X)A=cdccsFRg)^qP8CQ z^XsQz;vu!9=JY-GZ?T#qCkN&{1#zG~sZg*t8sIPSR0KPoB+tq%&aoPX3{iQ5uN%HsH~!#nOupS!3= z+PswheDtEPj@Z6w^(_>&4NUFfe1$7CJo>h*B%L0XWx~>>OWoH^L3u_S2TjqOnIBM^ zqq~{N7+P-AR%CIj||)2q>ht1&vX3 z)U$R4dLniJ4fk>7%eC*KsT_P0UcY&R&}j;ibq+`H%28?O8IKTOj^T3?Z6J^h?1#pT z^A4{~r8PwM%o)k!`C!AKhLoBv^>XALX{8}YXOG^6bPElp2#*QJXxyyXU)X~%_4DLb zcqu^$pgNs7cdl{0Bc#x~{jJ2rwK*%M70UUIQ)3enqQR&kaTL5Yp={6)uV891-SpA~ zJ&zo$kaF;2?GvX=nX({wgBoi^K<4D1yKpb^wVYgCMP^KqKt|odmN60}^)rF+|2glQ zD7R{hMRt@-0AdwlO=C5f_sDX=jk$uvE?n52%Qh}CJJ^B|@L_icx!!_L*T4B|r!Xi8 z^rt`gU{N*>r;8BG(q*rxdP;OL}Z~GM-tRZP-Aer>j^;#A2vZlJ`+a;<8~bX zbBr_YrlAq_WeG70|MN!e0b*OV9YS6(T3IF-RNp5~o%%yvy+y#K(A5Z_>Dh(sT6*7B zIhLzOME=d}os@ltAb>*-4ueN|!=>_>S)?f9L{h?O#a!GAgHJ|=y69p{2^OiP^m>5L zbL6n|MbUz2f9TU~+qeG#s!M>x_Dz%B!En348YtCmaFc{EY<5`n>i2(VL4j~z@BU=v z*PqRmAT_)7`qW8}zPyb~bw6q8l>F%H(9T<}s3vX>JHvVR*3x22eawjAe=#;dKq=kH< z(Pou)7#Wbz7F>XH@paIpB!~)DnZcAPuqc@1#}iB1%J$y;9QUv{(_B1`CYJm-gQj(L z?decvD+f)s&->yp7P(i3Z;iiXdEKgCLy3B z2Fjh6VJy@18#%xbC`R#7=1w?>V9!fO2}q0!=!Ckf>yUrLYTMQ zld+8e1c7xxN*+Z=5873>r7AC@D(_ebb~L_2m7+VlJO@9z=5 zJeiP`iIU9dijdi1sOS>z7Pc{&;w4f}3viN>)6p$(JwNcLWJ#HH2eE#iwD5PwfJy zkOC*PpVoP@y{e+q z5yRs$nCUj&Eo{*5?)N%?vX7FIf>TOfCncE^&~pn@jG~j(dnIqh764ovG3_9S+N#-F z^Lj!_3+F_S3Xsu`oQ*=zq(2H@53x3pB?kn|=*y5ZQ)%^=%{b_Obj1sSz%s}1di3?Z zL0c5l935T54yLEE7)59*eqGvX))Sz9RN@-D$OkNCw>oR{WQ?O?bzi@Pu~AB+mR9^3 z6)sET`+SEgeOjIBJMz*4+8Gqw(Q!A5{bJ#tvTaToC8ef50~LcDtBId@!yH~51 zVwdmja%>&tOjrdzM}67j}(udS6yHkECWa>>d0A$VaGEx<}#@o-Meqq2z@ zICa3pP0*xCquXm!+6Ktt)GdkA+qKmY z+$~uvH~~*GjdOK&Y@U_-ZsFp%H+~J03=vz5@;z6#W&-n_ z551^I4aS93dHgh?Ny7zvJNFY=cyV~auA{Vto4_8oo->mXTl$_f-xN-MfGa!N4~9&K zFNAtYW-P}<<+i9uKS z08yBDTUqogVHKkWl7aonX=0}f43dDAt=hDCME}{ZY*2Ag5l7>33vVe|Im>5Wh?cH%$y&Q|C! zqa$+4zgNDYs#veuS%i(p>pW*>HG!;|{;Pf0wo{Z=msWG{`OZ17E2|5WrfQ`8wfp)? zlUBEH?p@ZZ`Pk7j`_!47wsl|ci*s#WpDMet=xU(W`m{wa4*zr5qt5Mu#s_ad>H4VN zA7gFn9Y1z#*Ak85@@{c`SNw6X$?iwL5+`;V$aS$f>E;R3@^^kpO=zWEKwQzQb?598 z1&uW z4s$Zko|^RZmtRAuf8%1;8hfx|Gm)@5pFSN8v?1#EWKbdPvnDw|5-e%k^mG(y$Em;y z)X|CGijanIiJ%q+O+fT?Z5Lh1`l6R2Gqhu!XWlkOMzlEj-c*wQi z;d2KK!V>*WX81Br8~5n8t`Axq@i4MvzwE2++bay{Jn>fAgJAeW#Yw#}znvE48cUB# z2kcgyu-7mAXZz>Jj(BRzv4J}(2S-&8n$DbW;T>|u%awEf&gw(s8#6a2C17 zmX<+I-oM3Cg>P5Sq&*+G{1hCV6BOZ z?-KxljXEZ7#nF-aR<|21BlEph3t;tId!y(5`=dR&+)s4{FIG?$t>=7Ky>IMa$SW8U z_N_ddc%8sH&&}rY>S`Cq!I=7>e^wj{rL<8CLN;{?#+$VusYb_uenEkN$pjKq{K{ld z;w8*7585cSy*y{yZEl9U_qfzns(|8OcR=KA(S4yS9)N+w3aHBFyERJ8y3McZpX>0! zaOOr;^A{y^(O`z7BImQ{L$ zZslYVhgs;y!+m~pK&a|jk6?M{&Pey>%E~iD1Suh7Cb(auT8pl`I5{cZCtz&R^m5j5r!jQsn+wlkW1D(R3N`R4J8|w`f$#Y7 zS}OP!nzOEe(7m4=Oz~GGKHKTnHV%9J?MKu}n6%{-Zexqm`XHADy56cna~Ts8v-)TB zGRYrBWjounPp<01xO0)afJZVl2$(u5^Dk#j5^29S*-3AYSWpJr*g~Vbj#Cn3% zxr5}!b|FmUfoY(~n0#74nJ})`a9Nu2E9;_omvAA9DC&s%U0+OAQUJtyOaqWjYIA2T zt^A33(X5~PgB=#$<3xA4A^nOur)y=_3a!3c<&82%dq4pO@h%Jvd9FIB`3=Yi&-+6zV@*ldJNct3kh|rm<-pY-8m^@ zUIq2M5MO0g)~t-U1z5Cnyed}zXBQZ_Y__oIK5SUq)$P8d{sG7$M>Z-{WDd)c0bI}y zJT?ss3aJuV4^qq~gR>^0<`xW-$)>}wVZn3ra(Ux)z$Vu-^YhcMttT$3&S33Rhz&dB zZPvhq9u>jGAJSrE>@04MMhd_2K%Nb|bYWmW9H0@jWovHt>zcEdIZ=%vPz{tSYGuQ& zUDw|T3Q}=?vhVTo%{}XGvb3CAS4gLdXV~KDh8O*l#1+KJij7#E67Kl=`1B!WPI(o@ z9ZWW8`;y9viumNs!CRii$H(8;aI_#elaq)XfVVA-f?3dC556=OB;G?*(!9Or{io!w zI=%R^ek-S;ZE@Pt5F)$al(Lh-97IayL_a@o{wmzo^yU(>0GdBWW~VWvhwdfH^###z zLk=7?><<8;P0Ej8$HE6N6G22dzIe`F056GOw&mYZeoIH=A-fHtB`^?;6g^lLW2|Y* zR-v8So9E(ZY=3mpLQNGE-calhNMC+nQj26NPX*FezIO4Vg!^!}?o*5(Fj#k&mV-i! zLmGw3gsLBCn$fgLlP!NtSa<<{<>OphF;3=*vu3@hpB4?|Ls-ZmN5>&gh3w*mfjhjO zB>5Cjp7#f58F=j_N^L3YY;@$e5LyMc+Tvro1Q_Z57o790pchw zUY0{DO^%LJSCd-+NL&^Bj0dTv@dwhcEOyo%sZ;tOut?e&igWf9BuI#cm}sa8qX}O? z0J7oljUZxC-O9U~S<+tD;$7cn-UH)>Optrh&mgjaXhO7nGw#<$JTmpLnzv~)9TRi*$Kvpt-g$#n8YXvnq=pcQnTc`zP#15zMVls?i0n2ojM`R23|fSBt+OVAQALE zV!X#$N$0<%&V+?su(5%2gXOc)nA2U5H7WRp42?s-mi_+CC62p?rs=Wyfo@$+5aIcE zj~P;#tX0JFjouPj@`J?0+0DD^O`&uIT>7(*PS�?ivF>OuTLqxX`iHb3{Gep&y9I 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 o{>c(K+?Xve8vIq8Rn^!kU+<06ydF!Np59;D^Jm ${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 0000000000000000000000000000000000000000..6a5934b3f1f10f6c7f673117ce8b10ec1fcf6739 GIT binary patch literal 185692 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 s?YD{HEakTj;FlOM+pUO*vm<-nASv{ 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 z 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%0DVn@r}larInlh*Y|m@whR%&Lx1 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 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