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
