2020-06-28 14:45:05 +00:00
< ? php
class EndpointsApi extends ApiController {
public function default (){
// $this->requireAuth();
$obj = $this -> input ;
//variables Definition
$command = " null " ;
//Log
$logManager = new LogManager ();
2020-07-28 09:29:36 +00:00
$logManager -> setLevel ( LOGLEVEL );
$logManager = new LogManager ( '../logs/api/' . date ( " Y-m-d " ) . '.log' );
2020-06-28 14:45:05 +00:00
//Token Checks
if ( $obj [ 'token' ] == null || ! isset ( $obj [ 'token' ])) {
$this -> response ([
'state' => 'unsuccess' ,
'errorMSG' => " Missing Value Token in JSON payload " ,
], 401 );
2020-07-14 16:24:21 +00:00
die ();
2020-06-28 14:45:05 +00:00
}
//Vstupní Checky
if ( ! DeviceManager :: registeret ( $obj [ 'token' ])) {
//Notification data setup
$notificationMng = new NotificationManager ;
$notificationData = [
'title' => 'Info' ,
'body' => 'New device Detected Found' ,
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png' ,
];
//Subdevice Registration
$deviceId = DeviceManager :: create ( $obj [ 'token' ], $obj [ 'token' ]);
foreach ( $obj [ 'values' ] as $key => $value ) {
if ( ! SubDeviceManager :: getSubDeviceByMaster ( $deviceId , $key )) {
SubDeviceManager :: create ( $deviceId , $key , UNITS [ $key ]);
}
}
//Notification for newly added Device
if ( $notificationData != []) {
$subscribers = $notificationMng :: getSubscription ();
foreach ( $subscribers as $key => $subscriber ) {
2020-07-28 07:02:46 +00:00
$logManager -> write ( " [NOTIFICATION] SENDING TO " . $subscriber [ 'id' ] . " " , LogRecordTypes :: INFO );
2020-06-28 14:45:05 +00:00
$notificationMng :: sendSimpleNotification ( SERVERKEY , $subscriber [ 'token' ], $notificationData );
}
}
2020-07-28 07:02:46 +00:00
$logManager -> write ( " [API] Registering Device " , LogRecordTypes :: INFO );
2020-06-28 14:45:05 +00:00
$this -> response ([
'state' => 'unsuccess' ,
'errorMSG' => " Device not registeret " ,
], 401 );
}
if ( ! DeviceManager :: approved ( $obj [ 'token' ])) {
$this -> response ([
'state' => 'unsuccess' ,
'errorMSG' => " Unaproved Device " ,
], 401 );
}
//Diagnostic/Log Data Save
if ( isset ( $obj [ 'settings' ])){
$data = [ 'mac' => $obj [ 'settings' ][ " network " ][ " mac " ], 'ip_address' => $obj [ 'settings' ][ " network " ][ " ip " ]];
if ( array_key_exists ( " firmware_hash " , $obj [ 'settings' ])) {
$data [ 'firmware_hash' ] = $obj [ 'settings' ][ " firmware_hash " ];
}
DeviceManager :: editByToken ( $obj [ 'token' ], $data );
$this -> response ([
'state' => 'succes' ,
'command' => $command ,
2020-07-14 17:59:18 +00:00
], 200 );
}
2020-06-28 14:45:05 +00:00
2020-07-14 17:59:18 +00:00
// Issuing command
if ( $command == " null " ){
2020-07-14 16:24:21 +00:00
$device = DeviceManager :: getDeviceByToken ( $obj [ 'token' ]);
$deviceId = $device [ 'device_id' ];
2020-07-14 17:59:18 +00:00
$deviceCommand = $device [ " command " ];
if ( $deviceCommand != '' && $deviceCommand != null && $deviceCommand != " null " )
{
$command = $deviceCommand ;
$data = [
'command' => 'null'
];
DeviceManager :: editByToken ( $obj [ 'token' ], $data );
2020-07-28 07:02:46 +00:00
$logManager -> write ( " [API] Device_ID " . $deviceId . " executing command " . $command , LogRecordTypes :: INFO );
2020-07-14 17:59:18 +00:00
}
}
$jsonAnswer = [];
$subDeviceLastReordValue = [];
$device = DeviceManager :: getDeviceByToken ( $obj [ 'token' ]);
$deviceId = $device [ 'device_id' ];
if ( isset ( $obj [ 'values' ])) {
//ZAPIS
foreach ( $obj [ 'values' ] as $key => $value ) {
if ( ! SubDeviceManager :: getSubDeviceByMaster ( $deviceId , $key )) {
SubDeviceManager :: create ( $deviceId , $key , UNITS [ $key ]);
}
$subDeviceLastReordValue [ $key ] = $value [ 'value' ];
RecordManager :: create ( $deviceId , $key , round ( $value [ 'value' ], 3 ));
2020-07-28 07:02:46 +00:00
$logManager -> write ( " [API] Device_ID " . $deviceId . " writed value " . $key . ' ' . $value [ 'value' ], LogRecordTypes :: INFO );
2020-07-04 18:07:40 +00:00
2020-07-14 17:59:18 +00:00
//notification
if ( $key == 'door' || $key == 'water' ) {
$notificationMng = new NotificationManager ;
$notificationData = [];
switch ( $key ) {
case 'door' :
$notificationData = [
'title' => 'Info' ,
'body' => 'Someone just open up ' . $device [ 'name' ],
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png' ,
];
break ;
case 'water' :
$notificationData = [
'title' => 'Alert' ,
'body' => 'Wather leak detected by ' . $device [ 'name' ],
'icon' => BASEDIR . '/app/templates/images/icon-192x192.png' ,
];
break ;
2020-07-04 18:07:40 +00:00
}
2020-07-14 17:59:18 +00:00
if ( DEBUGMOD ) $notificationData [ 'body' ] .= ' value=' . $value [ 'value' ];
if ( $notificationData != []) {
$subscribers = $notificationMng :: getSubscription ();
foreach ( $subscribers as $key => $subscriber ) {
2020-07-28 07:02:46 +00:00
$logManager -> write ( " [NOTIFICATION] SENDING TO " . $subscriber [ 'id' ] . " " , LogRecordTypes :: INFO );
2020-07-14 17:59:18 +00:00
$notificationMng :: sendSimpleNotification ( SERVERKEY , $subscriber [ 'token' ], $notificationData );
2020-07-04 18:07:40 +00:00
}
}
}
2020-07-14 17:59:18 +00:00
}
2020-07-04 18:07:40 +00:00
2020-07-14 16:24:21 +00:00
2020-07-14 17:59:18 +00:00
//upravit format na setings-> netvork etc
2020-07-04 18:07:40 +00:00
2020-07-14 17:59:18 +00:00
$subDevicesTypeList = SubDeviceManager :: getSubDeviceSTypeForMater ( $deviceId );
if ( ! in_array ( $subDevicesTypeList , [ 'on/off' , 'door' , 'water' ])) {
$jsonAnswer [ 'device' ][ 'sleepTime' ] = $device [ 'sleep_time' ];
}
} else {
if ( count ( SubDeviceManager :: getAllSubDevices ( $deviceId )) == 0 ) {
SubDeviceManager :: create ( $deviceId , 'on/off' , UNITS [ $key ]);
//RecordManager::create($deviceId, 'on/off', 0);
}
2020-06-28 14:45:05 +00:00
2020-07-14 17:59:18 +00:00
$subDevicesData = SubDeviceManager :: getAllSubDevices ( $deviceId );
2020-06-28 14:45:05 +00:00
2020-07-14 17:59:18 +00:00
foreach ( $subDevicesData as $key => $subDeviceData ) {
$subDeviceId = $subDeviceData [ 'subdevice_id' ];
$subDeviceLastReord = RecordManager :: getLastRecord ( $subDeviceId );
$subDeviceLastReordValue [ $subDeviceData [ 'type' ]] = $subDeviceLastReord [ 'value' ];
2020-06-28 14:45:05 +00:00
2020-07-14 17:59:18 +00:00
if ( $subDeviceLastReord [ 'execuded' ] == 0 ){
2020-07-28 07:02:46 +00:00
$logManager -> write ( " [API] subDevice_ID " . $subDeviceId . " executed comand with value " . json_encode ( $subDeviceLastReordValue ) . " executed " . $subDeviceLastReord [ 'execuded' ], LogRecordTypes :: INFO );
2020-07-14 17:59:18 +00:00
RecordManager :: setExecuted ( $subDeviceLastReord [ 'record_id' ]);
2020-06-28 14:45:05 +00:00
}
2020-07-14 16:24:21 +00:00
}
2020-07-14 17:59:18 +00:00
}
2020-06-28 14:45:05 +00:00
2020-07-14 17:59:18 +00:00
$hostname = " " ;
$hostname = strtolower ( $device [ 'name' ]);
$hostname = str_replace ( ' ' , '_' , $hostname );
2020-07-14 16:24:21 +00:00
2020-07-14 17:59:18 +00:00
$jsonAnswer [ 'device' ][ 'hostname' ] = $hostname ;
$jsonAnswer [ 'state' ] = 'succes' ;
$jsonAnswer [ 'values' ] = $subDeviceLastReordValue ;
$jsonAnswer [ 'command' ] = $command ;
2020-06-28 14:45:05 +00:00
2020-07-14 17:59:18 +00:00
$this -> response ( $jsonAnswer );
// this method returns response as json
}
2020-07-14 16:24:21 +00:00
}