Facebook
From Ivory Dove, 5 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 209
  1. def
  2. {
  3. /*AUTOR: Paweł Kąkol; prawa majątkowe: Solwena Sp. z o.o. aktualizacja 2017-12-29-09:30
  4.  
  5. DZIALANIE: algorytm obsługuje wyłączenie obecności wirtualnego pomieszczenia RPV0, na podstawie danych o ostatnich wystąpieniach PRS0 i DOS0; jeżeli czas od wyłączenia ostatniego czujnika ruchu PRS0 w pomieszczeniu jest większy niż T2 oraz czas od ostatniego naruszenia jakichkolwiek (w pomieszczeniu) drzwi DOS0 jest większy niż T1 -> wysyła ramkę OBEC0; algorytm cyklicznie sprawdza wszystkie RPV, których OBEC=1; czasy T1 i T2 są atrybutami RPV0; algorytm działa jeżeli w pokoju jest przynajmniej 1 kontaktron drzwiowy lub przynajmniej 1 czujnik ruchu; przed sprawdzaniem warunków T1 i T2, algorytm sprawdza czy w pomieszczeniu nie ma permanentnej obecności (CZLOWEW=1).
  6.  
  7. MOZLIWOSCI ROZWOJU:
  8.  
  9. REWIZJA: 2018-01-03-PK - przerobienie na identifier VIRRPV0 ze względu na błędy w IZE
  10. 2018-02-23-PK - przerobienie na docelowe FullIdentifier RPV0, wprowadzenie algorytmu uwzględniającego nowe założenia oraz protest
  11. 2018-03-14-PK - przerobienie algorytmu na nową wersję związaną z obliczaniem czasu obecności po stronie IZE
  12. 2018-04-11-PK - przerobienie algorytmu na nową wersję search() - która zawsze zwraca wynik jako tablicę - usunięcie ręcznego tworzenia tablic i dodawanie wykonania funkcji first()
  13. 2018-06-13-PK - przerobienie alogrytmu, tak, żeby działał w pomieszczeniu bez czujnika ruchu; przerobienie alogrytmu, tak, żeby działał w pomieszczeniu bez kontaktronu drzwiowego; dorobienie blokady wyłączania obecności, jeżeli wewnątrz pokoju jest permanentna obecność (CZLOWEW=1); usunięcie starej wersji (z bugiem) podpisywania kolekcji drzwi pomieszczenia do dwóch tablic, na wykorzystanie funkcji fnBCB2B2ZwrocenieDrzwiPasujacychDoPokoju.
  14.  
  15. DO ZROBIENIA:
  16. */
  17.   global gsAplikacjaID,
  18.   /*zmienne funkcji fnBCB2B2ZwrocenieDrzwiPasujacychDoPokoju*/
  19.   sObiekt: null,
  20.   sPietro: null,
  21.   sPokoj: null,
  22.   /*zmienne funkcji fnBCB2B2PorownanieCzasow*/
  23.   fnCzasPorownywany: null,
  24.   fnCzasReferencyjny: null,
  25.   fnPrzesuniecieCzasowe: null,
  26.   fnRodzajPorownania: '4',  
  27.   /*zmienne lokalne typu string*/
  28.   sObiektPietro: null,
  29.   sObiektPietroStrefa: null,
  30.   sPokojMnemonic: null,
  31.   sFullIdentifier: null,
  32.   sIdentifierPath: null,
  33.   sTemp: null,
  34.   sDebug: null,
  35.   sDebug2: null,
  36.   /*zmienne lokalne typu int*/
  37.   intLiczbaCzujnikow: null,
  38.   intLiczbaKontaktronow: null,
  39.   intElementyTablicy: null,
  40.   intIter: null,
  41.   intWarunekT1: null,
  42.   intWarunekT2: parseInt('0'),
  43.   intTemp: null,
  44.   /*zmienne lokalne typu kolekcja*/
  45.   colWirtualnychPomieszczen: null,
  46.   colWirtualnychPomieszczenAtrybuty: null,
  47.   colWirtualnychPomieszczenOBEC1: null,
  48.   colWirtualnychPomieszczenT1: null,
  49.   colWirtualnychPomieszczenT2: null,
  50.   colWirtualnychPomieszczenCZLOWEW1: null,
  51.   colWitrtualnychPomieszczenPRS0DT1: null,
  52.   colCzujnikowDrzwi: null,
  53.   colCzujnikowDrzwiSTAN0: null,
  54.   colCzujnikowRuchu: null,
  55.   colCzujnikowRuchuSTAN0: null,
  56.   colCzujnikowRuchuTemp: null,
  57.   colTemp: null,
  58.   colTemp2: null,
  59.   colZmiennaWywolujaca: null,
  60.   colDebug: [],
  61.   /*zmienne lokalne typu datatime*/
  62.   dtmCzasInit: datetime('2000','01','01','00','00','00');
  63.   dtmRPV0: null,
  64.   dtmDOS0STAN: null,
  65.   dtmPRS0STAN0: null,
  66.   global gcolWykluczenieWylaczaniaOBECNOSCI,
  67.   intWykluczenie: null,
  68.   itemWL: null,
  69.   arrTablica: [],
  70.   tymczasowa: null,
  71. }
  72. {
  73.   /*PRS0DTSTAN1*/
  74.   /*wyszukaj w bazie wszystkie wirtualne pomieszczenia*/
  75.   set(colWirtualnychPomieszczen, search(Device,[{'Mnemonic','==','RPV0'}]));
  76.   /*wyszukaj w bazie dla wszystkich witrualnych pomieszczen ich atrybuty*/
  77.   set(colWirtualnychPomieszczenAtrybuty, search(colWirtualnychPomieszczen,[{'LastValue','==','true'}],150));
  78.   /*wyodrębienie z kolekcji atrybutów OBEC==1*/
  79.   set(colWirtualnychPomieszczenOBEC1, search(colWirtualnychPomieszczenAtrybuty,null,[{'Name','==','OBEC'},{'Value','==','1'}]));
  80.   /*początek algorytmu*/
  81.   set(intTemp, count(colWirtualnychPomieszczenOBEC1));
  82.   /*sprawdź czy istnieje choć jedno pomieszczenie z atrybutem OBEC=1*/
  83.   if(intTemp > 0)
  84.   {
  85.     /*zapytanie do bazy o wszystkie czujniki ruchu*/
  86.     set(colCzujnikowRuchu, search(Device,[{'Mnemonic','==','PRS0'}]));
  87.     /*zapytanie do bazy o atrybuty STAN (wszystkich czujników ruchu), ale tylko posiadający wartość 0*/
  88.     set(colCzujnikowRuchuSTAN0, search(colCzujnikowRuchu,[{'Name','==','STAN'},{'Value','==','0'}]));
  89.     /*zapytanie do bazy o atrybuty T1 i T2 do wirtualnego pomieszczenia*/
  90.     set(colWirtualnychPomieszczenT1, search(colWirtualnychPomieszczenAtrybuty,null,[{'Name','==','T1'}]));
  91.     set(colWirtualnychPomieszczenT2, search(colWirtualnychPomieszczenAtrybuty,null,[{'Name','==','T2'}]));
  92.     set(colWirtualnychPomieszczenCZLOWEW1, search(colWirtualnychPomieszczenAtrybuty,null,[{'Name','==','CZLOWEW'},{'Value','==','1'}]));
  93.     /*wykonaj dla wszystkich wirtualnych pomieszczeń, które posiadają atrybut OBEC=1*/
  94.     foreach(item in colWirtualnychPomieszczenOBEC1)
  95.     {
  96.       /*sprawdzanie czy w pokoju jest permanentna obecność RPV0*/
  97.       set(colTemp, search(colWirtualnychPomieszczenCZLOWEW1,null,[{'ItemId','==',item.ItemId}]));
  98.       set(intTemp, count(colTemp));
  99.       /*jeżeli nie ma*/
  100.       if(intTemp == 0)
  101.       {
  102.         set(intWarunekT1, parseInt('0'));
  103.         set(intWarunekT2, parseInt('0'));
  104.         /*wyciągnięcie potrzebnych informacji odnośnie lokalizacji obrabianego RPV0*/
  105.         set(colTemp, search(colWirtualnychPomieszczen,null,[{'Id','==',item.ItemId}]));
  106.         set(colTemp, first(colTemp));
  107.        
  108.         set(tymczasowa, new(item.ItemId));
  109.         add(arrTablica, tymczasowa);
  110.        
  111.         set(sFullIdentifier, colTemp.FullIdentifier);
  112.        
  113.         set(intWykluczenie, 0);
  114.         foreach(itemWL in gcolWykluczenieWylaczaniaOBECNOSCI){
  115.           if(itemWL == sFullIdentifier){
  116.             set(intWykluczenie, 1);
  117.           }
  118.         }  
  119.        
  120.         if(intWykluczenie == 0){
  121.             set(sObiektPietro, substring(sFullIdentifier,0,4));
  122.             set(sObiektPietroStrefa, stringFormat("{0}00",[sObiektPietro]));
  123.             set(sPokoj, substring(sFullIdentifier,6,3));
  124.             /*wyszukiwanie wszystkich czujników ruchu PRS0 w pomieszczeniu*/
  125.             set(sIdentifierPath, stringFormat("{0}{1}PRS0",[sObiektPietroStrefa,sPokoj]));
  126.             set(colCzujnikowRuchuTemp, search(colCzujnikowRuchu,null,[{'IdentifierPath','==',sIdentifierPath}]));
  127.             set(intLiczbaCzujnikow, count(colCzujnikowRuchuTemp));
  128.             /*jeżeli w pomieszczeniu jest chociaż jeden czujnik ruchu PRS0*/
  129.             if(intLiczbaCzujnikow > 0)
  130.             {
  131.               /*skasuj zmienną najświeższego czasu wystąpienia STAN=0 w PRS0 oraz wyzeruj liczbę czujników deaktywnych*/
  132.               set(intIter, parseInt('0'));
  133.               set(dtmPRS0STAN0, dtmCzasInit);
  134.               /*sprawdź całą kolekcję czujników ruchu PRS0 w poszukiwaniu najświeższego TimeStamp'a oraz w celu sprawdzenia czy wszystkie czujniki PRS0 są wyłączone*/
  135.               foreach(czujnikRuchu in colCzujnikowRuchuTemp)
  136.               {
  137.                 set(colTemp, search(colCzujnikowRuchuSTAN0,null,[{'ItemId','==',czujnikRuchu.Id}]));
  138.                 set(intTemp, count(colTemp));
  139.                 if(intTemp == 1)
  140.                 {
  141.                   set(colTemp, first(colTemp));
  142.                   /*jeżeli, obrabiany czujnik ruchu PRS0 przyjął STAN=0 później niż poprzedni (w obrębie pokoju), to przyjmij jego TimeStamp*/
  143.                   if(dtmPRS0STAN0 < colTemp.TimeStamp)
  144.                   {
  145.                     set(dtmPRS0STAN0, colTemp.TimeStamp);
  146.                   }
  147.                   /*zwiększ liczbę czujników posiadających STAN=0 (w obrębie pokoju)*/
  148.                   intIter++;
  149.                 }
  150.               }
  151.               /*jeżeli wszystkie czujniki ruchu PRS0 (w obrębie pokoju) są nieaktywne - sprawdzaj warunki*/
  152.               if(intIter == intLiczbaCzujnikow)
  153.               {
  154.                 /*sprawdzenie czasu T2 dla obrabianego RPV0*/
  155.                 set(colTemp, search(colWirtualnychPomieszczenT2,null,[{'ItemId','==',item.ItemId}]));
  156.                 set(colTemp, first(colTemp));
  157.                 set(fnPrzesuniecieCzasowe, colTemp.Value);        
  158.                 set(fnCzasPorownywany, dtmPRS0STAN0);
  159.                 set(sTemp, fnBCB2B2PorownanieCzasow(fnCzasPorownywany,fnPrzesuniecieCzasowe,fnRodzajPorownania));
  160.                 set(intWarunekT2, parseInt(sTemp));
  161.               }
  162.             }
  163.             /*wykonaj jeżeli ostatnie wyłączenie czujnika ruchu PRS0 nastąpiło dawniej niż wynosi czas T2 lub jeżeli nie ma żadnego czujnika ruchu*/
  164.             if(intWarunekT2 == 1 || intLiczbaCzujnikow == 0)
  165.             {
  166.               set(dtmDOS0STAN, dtmCzasInit);
  167.               set(sObiekt, substring(sFullIdentifier,0,2));
  168.               set(sPietro, substring(sFullIdentifier,2,2));
  169.               set(colCzujnikowDrzwi, fnBCB2B2ZwrocenieDrzwiPasujacychDoPokoju(sObiekt,sPietro,sPokoj));
  170.               set(intLiczbaKontaktronow, count(colCzujnikowDrzwi));
  171.               if(intLiczbaKontaktronow > 0)
  172.               {
  173.                 set(colCzujnikowDrzwiSTAN0, search(colCzujnikowDrzwi,[{'Name','==','STAN'},{'Value','==','0'}]));
  174.                 set(intTemp, count(colCzujnikowDrzwiSTAN0));
  175.                 if(intTemp > 0)
  176.                 {
  177.                   foreach(wskDrzwi in colCzujnikowDrzwiSTAN0)
  178.                   {
  179.                     if(dtmDOS0STAN < wskDrzwi.TimeStamp)
  180.                     {
  181.                       set(dtmDOS0STAN, wskDrzwi.TimeStamp);
  182.                     }
  183.                   }
  184.                 }
  185.               }
  186.               /*sprawdzenie czasu T1 dla obrabianego RPV0*/
  187.               set(colTemp, search(colWirtualnychPomieszczenT1,null,[{'ItemId','==',item.ItemId}]));
  188.               set(colTemp, first(colTemp));
  189.               set(fnPrzesuniecieCzasowe, colTemp.Value);
  190.               set(fnCzasPorownywany, dtmDOS0STAN);
  191.               set(sTemp, fnBCB2B2PorownanieCzasow(fnCzasPorownywany,fnPrzesuniecieCzasowe,fnRodzajPorownania));
  192.               set(intWarunekT1, parseInt(sTemp));
  193.               /*sprawdzenie czy ostatnia zmiana stanu drzwi w obrabianym pokoju nastąpiła dawniej niż wynosi czas T1*/
  194.             }
  195.             /*wykonaj jeżeli w pokoju jest albo przynajmniej jeden czujnik ruchu albo przynajmniej jeden kontaktron drzwiowy, dla pomieszczeń bez kontaktronów i czujników ruchu jest harmonogram*/
  196.             if(intLiczbaKontaktronow + intLiczbaCzujnikow > 0)
  197.             {
  198.               /*jeżeli w pokoju nie ma czujników ruhu, ale są kontaktrony drzwiowe, oraz spełniono warunek od drzwi T1*/
  199.               if(intWarunekT1 == 1 && intLiczbaKontaktronow > 0 && intLiczbaCzujnikow == 0)
  200.               {
  201.                 frame(^,M,BCB0,sFullIdentifier,gsAplikacjaID,OBEC=0,In);
  202.               }
  203.               /*jeżeli w pokoju nie ma kontaktronó drzwiowych, ale są czujniki ruhu, oraz spełniono warunek od czujnika ruchu T2*/
  204.               if(intWarunekT2 == 1 && intLiczbaCzujnikow > 0 && intLiczbaKontaktronow == 0)
  205.               {
  206.                 frame(^,M,BCB0,sFullIdentifier,gsAplikacjaID,OBEC=0,In);
  207.               }
  208.               /*jeżeli czujnik ruchu był aktywny dawniej niż T2 oraz czujnik drzwi dawniej niż T1*/
  209.               if(intWarunekT1 == 1 && intWarunekT2 == 1 && intLiczbaKontaktronow > 0 && intLiczbaCzujnikow > 0)
  210.               {
  211.                 frame(^,M,BCB0,sFullIdentifier,gsAplikacjaID,OBEC=0,In);
  212.               }
  213.             }
  214.           }
  215.        }
  216.     }
  217.     return(arrTablica);
  218.   }
  219. }