2022-02-15 11:37:31 +01:00
# include "utils/JsonUtils.h"
# include "utils/SerialPrint.h"
# include "classes/ScenarioClass3.h"
# include "classes/IoTItem.h"
2022-02-02 21:40:45 +01:00
# include "WsServer.h"
2022-02-14 12:48:59 +03:00
# include "ESPConfiguration.h"
2022-02-22 20:16:33 +01:00
# include "EventsAndOrders.h"
2022-01-14 21:48:43 +01:00
2022-02-06 09:11:07 +03:00
IoTItem : : IoTItem ( String parameters ) {
2022-02-22 16:40:46 +01:00
jsonRead ( parameters , F ( " int " ) , _interval ) ;
2022-02-01 23:04:06 +03:00
_interval = _interval * 1000 ;
2022-02-22 16:40:46 +01:00
jsonRead ( parameters , F ( " subtype " ) , _subtype ) ;
jsonRead ( parameters , F ( " id " ) , _id ) ;
jsonRead ( parameters , F ( " multiply " ) , _multiply , false ) ;
jsonRead ( parameters , F ( " plus " ) , _plus , false ) ;
jsonRead ( parameters , F ( " round " ) , _round , false ) ;
2022-02-02 21:17:50 +01:00
2022-02-25 13:20:03 +03:00
String valAsStr ;
2022-02-28 01:10:14 +01:00
if ( jsonRead ( parameters , F ( " val " ) , valAsStr , false ) ) // значение переменной или датчика при инициализации если есть в конфигурации
2022-02-25 13:20:03 +03:00
if ( value . isDecimal = isDigitDotCommaStr ( valAsStr ) )
value . valD = valAsStr . toFloat ( ) ;
else
value . valS = valAsStr ;
2022-02-01 23:04:06 +03:00
String map ;
2022-02-22 16:40:46 +01:00
jsonRead ( parameters , F ( " map " ) , map , false ) ;
2022-02-01 23:04:06 +03:00
if ( map ! = " " ) {
_map1 = selectFromMarkerToMarker ( map , " , " , 0 ) . toInt ( ) ;
_map2 = selectFromMarkerToMarker ( map , " , " , 1 ) . toInt ( ) ;
_map3 = selectFromMarkerToMarker ( map , " , " , 2 ) . toInt ( ) ;
_map4 = selectFromMarkerToMarker ( map , " , " , 3 ) . toInt ( ) ;
2022-02-02 21:17:50 +01:00
}
2022-02-01 12:51:34 +03:00
}
2022-02-25 15:38:32 +03:00
// IoTItem::~IoTItem() {}
2022-01-14 21:48:43 +01:00
2022-02-06 09:11:07 +03:00
String IoTItem : : getSubtype ( ) {
2022-02-01 12:30:13 +03:00
return _subtype ;
2022-01-14 21:48:43 +01:00
}
2022-02-06 09:11:07 +03:00
String IoTItem : : getID ( ) {
2022-01-14 21:48:43 +01:00
return _id ;
} ;
2022-02-26 22:42:57 +03:00
String IoTItem : : getValue ( ) {
2022-02-28 01:10:14 +01:00
if ( value . isDecimal )
return ( String ) value . valD ;
else
return value . valS ;
2022-02-26 22:42:57 +03:00
}
2022-02-06 09:11:07 +03:00
void IoTItem : : loop ( ) {
2022-01-14 21:48:43 +01:00
currentMillis = millis ( ) ;
difference = currentMillis - prevMillis ;
if ( difference > = _interval ) {
prevMillis = millis ( ) ;
this - > doByInterval ( ) ;
}
}
2022-02-06 09:11:07 +03:00
void IoTItem : : regEvent ( String value , String consoleInfo = " " ) {
2022-02-22 20:16:33 +01:00
generateEvent ( _id , value ) ;
2022-02-02 21:17:50 +01:00
publishStatusMqtt ( _id , value ) ;
2022-02-28 01:10:14 +01:00
//отправка события другим устройствам в сети==============================
if ( jsonReadBool ( settingsFlashJson , " mqttin " ) ) {
String json = " {} " ;
jsonWriteStr_ ( json , " id " , _id ) ;
jsonWriteStr_ ( json , " val " , value ) ;
jsonWriteInt_ ( json , " int " , _interval + 5000 ) ; // 5 секунд про запас
publishEvent ( _id , json ) ;
SerialPrint ( " i " , F ( " <=MQTT " ) , " Broadcast event: " + json ) ;
}
//========================================================================
2022-02-02 21:40:45 +01:00
publishStatusWs ( _id , value ) ;
2022-02-16 00:53:52 +01:00
SerialPrint ( " i " , " Sensor " + consoleInfo , " ' " + _id + " ' data: " + value + " ' " ) ;
2022-02-01 23:04:06 +03:00
}
2022-02-06 09:11:07 +03:00
void IoTItem : : regEvent ( float value , String consoleInfo = " " ) {
2022-02-01 23:04:06 +03:00
if ( _multiply ) value = value * _multiply ;
if ( _plus ) value = value + _multiply ;
2022-02-02 21:17:50 +01:00
if ( _round ! = 0 ) {
2022-02-02 11:08:40 +03:00
if ( value > 0 ) {
value = ( int ) ( value * _round + 0.5F ) ;
value = value / _round ;
}
if ( value < 0 ) {
value = ( int ) ( value * _round - 0.5F ) ;
value = value / _round ;
}
2022-02-17 16:22:47 +03:00
2022-02-22 21:35:50 +03:00
// value = (float)value / (_round ? pow(10, (int)_round) : 1); // TODO: решить как указывать округление, количество знаков после запятой или десятые сотые ...
2022-02-01 23:04:06 +03:00
}
if ( _map1 ! = _map2 ) value = map ( value , _map1 , _map2 , _map3 , _map4 ) ;
2022-02-02 11:08:40 +03:00
// убираем лишние нули
char buf [ 20 ] ;
sprintf ( buf , " %g " , value ) ;
regEvent ( ( String ) buf , consoleInfo ) ;
2022-01-14 21:48:43 +01:00
}
2022-02-06 09:11:07 +03:00
void IoTItem : : doByInterval ( ) { }
2022-01-15 16:30:34 +01:00
2022-02-16 00:53:52 +01:00
IoTValue IoTItem : : execute ( String command , std : : vector < IoTValue > & param ) { return { } ; }
2022-02-14 12:48:59 +03:00
2022-02-14 18:33:52 +03:00
IoTGpio * IoTItem : : getGpioDriver ( ) {
return nullptr ;
2022-02-22 22:48:35 +03:00
}
void IoTItem : : setValue ( IoTValue Value ) {
value = Value ;
2022-02-28 01:10:14 +01:00
if ( value . isDecimal )
regEvent ( value . valD , " " ) ;
else
regEvent ( value . valS , " " ) ;
2022-02-25 13:20:03 +03:00
}
externalVariable : : externalVariable ( String parameters ) : IoTItem ( parameters ) {
2022-02-25 15:38:32 +03:00
prevMillis = millis ( ) ; // запоминаем текущее значение таймера для выполения doByInterval после int сек
2022-02-28 01:10:14 +01:00
iAmLocal = false ; // указываем, что это сущность прилетела из сети
2022-02-25 15:38:32 +03:00
Serial . printf ( " Call from externalVariable: parameters %s %d \n " , parameters . c_str ( ) , _interval ) ;
2022-02-25 13:20:03 +03:00
}
externalVariable : : ~ externalVariable ( ) {
Serial . printf ( " Call from ~externalVariable: Im dead \n " ) ;
}
2022-02-28 01:10:14 +01:00
void externalVariable : : doByInterval ( ) { // для данного класса doByInterval+int выполняет роль счетчика обратного отсчета до уничтожения
2022-02-25 13:20:03 +03:00
iAmDead = true ;
2022-02-26 22:42:57 +03:00
}
IoTItem * myIoTItem ;
IoTItem * findIoTItem ( String name ) { // поиск элемента модуля в существующей конфигурации
2022-02-28 01:10:14 +01:00
for ( std : : list < IoTItem * > : : iterator it = IoTItems . begin ( ) ; it ! = IoTItems . end ( ) ; + + it ) {
2022-02-26 22:42:57 +03:00
if ( ( * it ) - > getID ( ) = = name ) return * it ;
}
return nullptr ;
}
2022-02-28 00:55:43 +03:00
String getItemValue ( String name ) { // поиск плюс получение значения
IoTItem * tmp = findIoTItem ( name ) ;
if ( tmp ) return tmp - > getValue ( ) ;
else return " " ;
}
2022-02-26 22:42:57 +03:00
StaticJsonDocument < JSON_BUFFER_SIZE > docForExport ;
2022-02-28 01:10:14 +01:00
StaticJsonDocument < JSON_BUFFER_SIZE > * getLocalItemsAsJSON ( ) {
2022-02-26 22:42:57 +03:00
docForExport . clear ( ) ;
2022-02-28 01:10:14 +01:00
for ( std : : list < IoTItem * > : : iterator it = IoTItems . begin ( ) ; it ! = IoTItems . end ( ) ; + + it ) {
2022-02-26 22:42:57 +03:00
if ( ( * it ) - > iAmLocal ) docForExport [ ( * it ) - > getID ( ) ] = ( * it ) - > getValue ( ) ;
}
return & docForExport ;
2022-02-14 18:33:52 +03:00
}