function alert_Levels(ARRAYdateRL,IDcentralina,DTcatena,conn,FileName) fileID = fopen(FileName,'a'); fmt = '%s \r'; text = 'alert_Levels function started'; fprintf(fileID,fmt,text); fclose(fileID); alarm1h = 0; alarm24h = 0; alert1h = 0; alert24h = 0; alarm = 0; alert = 0; if strcmp(IDcentralina,'ID0102') && strcmp(DTcatena,'LOC0102') == 1 || strcmp(IDcentralina,'ID0153') && strcmp(DTcatena,'DT0050') == 1 % Pluviometri A27 Cave Est e Fadalto DataScarico = ARRAYdateRL(1)-1.1; % Scarico di dati di pioggia NodeType = 'Rain Link'; comando = ['select EventDate, EventTime, Z, calcerr from ElabDataView where EventDate = ''' ... datestr(DataScarico,'yyyy-mm-dd') ''' and EventTime >= ''' datestr(DataScarico,'HH:MM:SS') ''' and UnitName = ''' ... IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' ']; curs = exec(conn,comando); curs = fetch(curs); DATnodoRLd = curs.Data; % Scarico di dati di pioggia comando = ['select EventDate, EventTime, Z, calcerr from ElabDataView where EventDate > ''' ... datestr(DataScarico,'yyyy-mm-dd') ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... DTcatena ''' and NodeType = ''' NodeType ''' ']; curs = exec(conn,comando); curs = fetch(curs); DATnodoRL = curs.Data; [~,c1] = size(DATnodoRL); [~,c2] = size(DATnodoRLd); if c1 == c2 DATnodoRL = [DATnodoRLd; DATnodoRL]; elseif c1 < c2 % solo giorno di riferimento DATnodoRL = DATnodoRLd; end % Modifico il formato di data e ora in DATini. [rD,cD] = size(DATnodoRL); if rD ~=1 && cD ~=1 T = [cell2mat(DATnodoRL(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoRL(:,2))]; T = datenum(T); % Converto da Cell Array a Matrice. ARRAYdateRL = T; end RainCum = cell2mat(DATnodoRL(:,3)); ErrRainLink = cell2mat(DATnodoRL(:,4)); [numDate,~] = size(ARRAYdateRL); % 24H d = 1; p = 1; diffDate = 0; n = 1; period = 1; % calcolo giornaliero ContSUP = []; Pioggia24h = zeros(numDate,1); for dd = 1:numDate while diffDate < period d = d+1; if d > numDate % Se d supera le date disponibili, esco dal ciclo while break end diffDate = ARRAYdateRL(d) - ARRAYdateRL(p); end if d >numDate break end ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza p = p+1; % passo alla data di partenza successiva d = p; % resetto il conto di d n = n+1; diffDate = 0; end check = isempty(ContSUP); if check == 0 [nDate,~] = size(ContSUP); for dd = 1:nDate Pioggia24h(ContSUP(dd,1),1) = RainCum(ContSUP(dd,1))-RainCum(ContINF(dd,1)); end end % 1H d = 1; p = 1; diffDate = 0; n = 1; period = 1/24; % calcolo orario ContSUP = []; Pioggia1h = zeros(numDate,1); for dd = 1:numDate while diffDate < period d = d+1; if d > numDate % Se d supera le date disponibili, esco dal ciclo while break end diffDate = ARRAYdateRL(d) - ARRAYdateRL(p); end if d >numDate break end ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza p = p+1; % passo alla data di partenza successiva d = p; % resetto il conto di d n = n+1; diffDate = 0; end check = isempty(ContSUP); if check == 0 [nDate,~] = size(ContSUP); for dd = 1:nDate Pioggia1h(ContSUP(dd,1),1) = RainCum(ContSUP(dd,1))-RainCum(ContINF(dd,1)); end end % Allerta indexALE1h = zeros(1,2); indexALE24h = zeros(1,2); indexALA1h = zeros(1,2); indexALA24h = zeros(1,2); c1h_ALE = 1; c24h_ALE = 1; c1h_ALA = 1; c24h_ALA = 1; % ---SOGLIE--- if strcmp(IDcentralina,'ID0102') && strcmp(DTcatena,'LOC0102') == 1 soglia1h_ALE = 25; % mm soglia24h_ALE = 90; % mm soglia1h_ALA = 40; % mm soglia24h_ALA = 120; % mm Search_ALE = 1; Search_ALA = 1; elseif strcmp(IDcentralina,'ID0153') && strcmp(DTcatena,'DT0050') soglia1h_ALE = 20; % mm soglia24h_ALE = 80; % mm soglia1h_ALA = 30; % mm soglia24h_ALA = 110; % mm Search_ALE = 1; Search_ALA = 1; end for n = 1:numDate %% ALLARMI if Search_ALA == 1 if Pioggia1h(n,1) > soglia1h_ALA % mm if ErrRainLink(n,1) == 0 || ErrRainLink(n,1) == 0.5 % Il nodo non è in errore alarm1h = 1; alarm = 1; indexALA1h(c1h_ALA,1) = n; % Data indexALA1h(c1h_ALA,2) = Pioggia1h(n,1); % valore c1h_ALA = c1h_ALA+1; end end if Pioggia24h(n,1) > soglia24h_ALA % mm if ErrRainLink(n,1) == 0 || ErrRainLink(n,1) == 0.5 % Il nodo non è in errore alarm24h = 1; alarm = 1; indexALA24h(c24h_ALA,1) = n; % Data indexALA24h(c24h_ALA,2) = Pioggia24h(n,1); % valore c24h_ALA = c24h_ALA+1; end end end %% ALLERTE if Search_ALE == 1 % Oraria if Search_ALA == 1 if Pioggia1h(n,1) > soglia1h_ALE && Pioggia1h(n,1) <= soglia1h_ALA % mm continua = 1; else continua = 0; end else if Pioggia1h(n,1) > soglia1h_ALE % mm continua = 1; else continua = 0; end end if continua == 1 if ErrRainLink(n,1) == 0 || ErrRainLink(n,1) == 0.5 % Il nodo non è in errore alert1h = 1; alert = 1; indexALE1h(c1h_ALE,1) = n; % Data indexALE1h(c1h_ALE,2) = Pioggia1h(n,1); % valore c1h_ALE = c1h_ALE+1; end end % Giornaliera if Search_ALA == 1 if Pioggia24h(n,1) > soglia24h_ALE && Pioggia24h(n,1) <= soglia24h_ALA % mm continua = 1; else continua = 0; end else if Pioggia24h(n,1) > soglia24h_ALE % mm continua = 1; else continua = 0; end end if continua == 1 if ErrRainLink(n,1) == 0 || ErrRainLink(n,1) == 0.5 % Il nodo non è in errore alert24h = 1; alert = 1; indexALE24h(c24h_ALE,1) = n; % Data indexALE24h(c24h_ALE,2) = Pioggia24h(n,1); % valore c24h_ALE = c24h_ALE+1; end end end end end if alarm == 1 || alert == 1 %% Controllo la data if strcmp(IDcentralina,'ID0102') == 1 && strcmp(DTcatena,'LOC0102') == 1 || ... strcmp(IDcentralina,'ID0153') == 1 && strcmp(DTcatena,'DT0050') == 1 % Pluviometri A27 Cave Est e Fadalto if alarm1h == 1 && alert1h == 1 date1h_ALA = ARRAYdateRL(indexALA1h(:,1)); date1h_ALE = ARRAYdateRL(indexALE1h(:,1)); elseif alarm1h == 1 date1h_ALE = 0; date1h_ALA = ARRAYdateRL(indexALA1h(:,1)); elseif alert1h == 1 date1h_ALE = ARRAYdateRL(indexALE1h(:,1)); date1h_ALA = 0; else date1h_ALA = 0; date1h_ALE = 0; end if alarm24h == 1 && alert24h == 1 date24h_ALA = ARRAYdateRL(indexALA24h(:,1)); date24h_ALE = ARRAYdateRL(indexALE24h(:,1)); elseif alarm24h == 1 date24h_ALA = ARRAYdateRL(indexALA24h(:,1)); date24h_ALE = 0; elseif alert24h == 1 date24h_ALA = 0; date24h_ALE = ARRAYdateRL(indexALE24h(:,1)); else date24h_ALA = 0; date24h_ALE = 0; end end DataALE = max(date1h_ALE(end),date24h_ALE(end)); DataALA = max(date1h_ALA(end),date24h_ALA(end)); FileNameALA = ['' IDcentralina '-' DTcatena '-Alarm.txt']; if isfile(FileNameALA) == 1 A = importdata(FileNameALA); [rA,~] = size(A); if rA == 0 DataRif_ALE = 0; DataRif_ALA = 0; elseif rA == 1 DataRif_ALE = A(1,1); DataRif_ALA = 0; else DataRif_ALE = A(1,1); DataRif_ALA = A(2,1); end else DataRif_ALE = 0; DataRif_ALA = 0; end if alert == 1 || alarm == 1 if alert == 1 && alarm == 1 DATA = max(DataALA,DataALE); DataWrite_ALA = DataALA; DataWrite_ALE = DataALE; elseif alert == 1 DATA = DataALE; DataWrite_ALE = DataALE; DataWrite_ALA = DataRif_ALA; elseif alarm == 1 DATA = DataALA; DataWrite_ALE = DataRif_ALE; DataWrite_ALA = DataALA; end % Allerta if alert == 1 if date1h_ALE(end) > DataRif_ALE+1 mail1h_ALE = 1; else mail1h_ALE = 0; end if date24h_ALE(end) > DataRif_ALE+1 mail24h_ALE = 1; else mail24h_ALE = 0; end else mail1h_ALE = 0; mail24h_ALE = 0; end % Allarme if alarm == 1 if date1h_ALA(end) > DataRif_ALA+1 mail1h_ALA = 1; else mail1h_ALA = 0; end if date24h_ALA(end) > DataRif_ALA+1 mail24h_ALA = 1; else mail24h_ALA = 0; end else mail1h_ALA = 0; mail24h_ALA = 0; end else DataWrite_ALE = DataRif_ALE; DataWrite_ALA = DataRif_ALA; fileID = fopen(FileNameALA,'a'); outdat = fopen(FileNameALA,'wt+'); fmt = '%.10f \r'; fprintf(fileID,fmt,DataWrite_ALE); fmt = '%.10f \r'; fprintf(fileID,fmt,DataWrite_ALA); fclose(fileID); end if mail24h_ALA == 1 || mail24h_ALE == 1 || mail1h_ALA == 1 || mail1h_ALE == 1 allarme = 0; allerta = 0; AL = 1; DATAinsert = cell(1,9); if strcmp(IDcentralina,'ID0102') && strcmp(DTcatena,'LOC0102') % Pluviometro A27 sms = 1; NodeNum = 2; elseif strcmp(IDcentralina,'ID0153') && strcmp(DTcatena,'DT0050') == 1 NodeNum = 1; sms = 1; end %% ALLARMI for ii = 1:c1h_ALA-1 % numero di allarmi orari if mail1h_ALA == 1 && ARRAYdateRL(indexALA1h(ii,1)) > DataRif_ALA+1 Level = 3; sms = 1; desc = 'Soglia oraria'; Data = datestr(ARRAYdateRL(indexALA1h(ii,1),1),'yyyy-mm-dd HH:MM:SS'); Valore = Pioggia1h(indexALA1h(ii,1)); DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali DATAinsert{AL,2} = IDcentralina; DATAinsert{AL,3} = DTcatena; DATAinsert{AL,4} = NodeNum; DATAinsert{AL,5} = Data; DATAinsert{AL,6} = Valore; DATAinsert{AL,7} = Level; DATAinsert{AL,8} = sms; DATAinsert{AL,9} = desc; allarme = 1; AL = AL+1; end end for ii = 1:c24h_ALA-1 % numero di allarmi giornalieri if mail24h_ALA == 1 && ARRAYdateRL(indexALA24h(ii,1)) > DataRif_ALA+1 Level = 4; sms = 1; desc = 'Soglia giornaliera'; Data = datestr(ARRAYdateRL(indexALA24h(ii,1),1),'yyyy-mm-dd HH:MM:SS'); Valore = Pioggia24h(indexALA24h(ii,1)); DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali DATAinsert{AL,2} = IDcentralina; DATAinsert{AL,3} = DTcatena; DATAinsert{AL,4} = NodeNum; DATAinsert{AL,5} = Data; DATAinsert{AL,6} = Valore; DATAinsert{AL,7} = Level; DATAinsert{AL,8} = sms; DATAinsert{AL,9} = desc; allarme = 1; AL = AL+1; end end %% Allerte for ii = 1:c1h_ALE-1 % numero di allerte orarie if mail1h_ALE == 1 && ARRAYdateRL(indexALE1h(ii,1)) > DataRif_ALE+1 Level = 1; desc = 'Soglia oraria'; Data = datestr(ARRAYdateRL(indexALE1h(ii,1),1),'yyyy-mm-dd HH:MM:SS'); Valore = Pioggia1h(indexALE1h(ii,1)); DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali DATAinsert{AL,2} = IDcentralina; DATAinsert{AL,3} = DTcatena; DATAinsert{AL,4} = NodeNum; DATAinsert{AL,5} = Data; DATAinsert{AL,6} = Valore; DATAinsert{AL,7} = Level; DATAinsert{AL,8} = sms; DATAinsert{AL,9} = desc; allerta = 1; AL = AL+1; end end for ii = 1:c24h_ALE-1 % numero di alerte giornaliere if mail24h_ALE == 1 && ARRAYdateRL(indexALE24h(ii,1)) > DataRif_ALE+1 Level = 2; desc = 'Soglia giornaliera'; Data = datestr(ARRAYdateRL(indexALE24h(ii,1),1),'yyyy-mm-dd HH:MM:SS'); Valore = Pioggia24h(indexALE24h(ii,1)); DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali DATAinsert{AL,2} = IDcentralina; DATAinsert{AL,3} = DTcatena; DATAinsert{AL,4} = NodeNum; DATAinsert{AL,5} = Data; DATAinsert{AL,6} = Valore; DATAinsert{AL,7} = Level; DATAinsert{AL,8} = sms; DATAinsert{AL,9} = desc; allerta = 1; AL = AL+1; end end if allarme == 1 || allerta == 1 AL = AL-1; % Numero totale di allarmi for a = 1:AL % Cerco se il dato è già presente Data = DATAinsert{a,5}; nNodo = num2str(DATAinsert{a,4}); % Numero nodo type = num2str(DATAinsert{a,1}); % tipologia level = num2str(DATAinsert{a,7}); % livello allarme value = num2str(DATAinsert{a,6}); % Valore desc = DATAinsert{a,9}; % Descrizione comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... IDcentralina ''' and tool_name = ''' DTcatena ''' and node_num = ''' ... nNodo ''' and date_time = ''' Data ''' and type_id = ''' type ... ''' and alarm_level = ''' level ''' and registered_value = ''' value ... ''' and description like ''' desc ''' order by date_time']; curs = exec(conn,comando); curs = fetch(curs); idDate = curs.Data; [~,cI] = size(idDate); if cI == 1 idElabData = 0; % 0 indica che il dato non è presente su DB else idElabData = cell2mat(idDate(:,1)); end tablename = 'alarms'; colnames = {'type_id','unit_name','tool_name','node_num','date_time',... 'registered_value','alarm_level','send_sms','description'}; data = [DATAinsert(a,1),DATAinsert(a,2),DATAinsert(a,3),DATAinsert(a,4),... DATAinsert(a,5),DATAinsert(a,6),DATAinsert(a,7),DATAinsert(a,8),DATAinsert(a,9)]; if idElabData == 0 % Scrivo fastinsert(conn,tablename,colnames,data); end end end fileID = fopen(FileNameALA,'a'); outdat = fopen(FileNameALA,'wt+'); fmt = '%.10f \r'; fprintf(fileID,fmt,DataWrite_ALE); fmt = '%.10f \r'; fprintf(fileID,fmt,DataWrite_ALA); fclose(fileID); end end text = ('alert_Levels function worked correctly'); fileID = fopen(FileName,'a'); fmt = '%s \r'; fprintf(fileID,fmt,text); fclose(fileID); end