Skip to content

Repository files navigation

PeopleCounter

Background and Motivation:

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

On each of library entrances (where I currently work), there are counters at the gate that logs each entries and exits. From these logs, reports are generated on a regular basis (monthly). However, this solution does not provide a live counter that can be viewed and monitored on a near real-time basis.

The idea

Despite of having a simple requirement, I realized that none of the vendors we have can provide exactly what need. Not to mention the very high cost that comes with the partial solution they offer.

We decided to create our own solution. After checking our gate counters, we found a feature that we can use to send the current count to a server via HTTP, however is it not being utilized. We played around the newly found feature/setting and set it to send update every 10000 millisecond to emulate near real-time couting.


How it works:

Re-configurations are made to the entrances’ people counters to send update to a server every few seconds. From the server, the information is parsed, and calculations are made for the occupancy count. The information is then displayed in a browser that refreshes every few seconds as shown below:


Fig 1: Used at entrance display



Fig 2: Backend Display (More details)

Historical data are then saved on a Database and then displayed using Dash by Plotly module. Using heatmap chart on a daily and hourly basis we're be able to see the occupancy trends across several days.


Fig 3: Heatmap



Overview


Fig 4: Diagram



Initial Usage

  1. Clone this repository

    $ git clone https://github.com/RonBulaon/PeopleCounter.git
    
  2. Replace / Update the folloeing to match your environment.

    • Update the on files at public/*.html files
    • Sensor IP addresses, Schedule, Database name and Database credentials at config.conf
    • If you want teams notification update [msteams] section at config.conf
    • Update script /path/to/folder/ at checker.py and stopDashboard.py
    • Update <local_IP> and <remote_IP> IPs at forwarder.py
  3. Go to the downloaded repository's source folder and install the requirements.

    $ cd PeopleCounter
    $ pip install -r Requirements.txt
    
  4. Execute script this way:

    $ python3 checker.py
    $ python3 stopDashboard.py
    

    Note :

    • checker.py and stopDashboard.py would start/restart the all running scripts every execution.
    • The these scripts can be used with cron to regularly check or restart the scripts if needed.
    • YOu must move it to PeopleCounter directory to make it work properly.
  5. Run forwarder.py this will receive the count from sensors then forward it to port 8080 of the script above. This can be executed from same server or from remote device as gateway/forwarder. Just make sure that you have indicated the proper ports and IP addresses for remote and local.

    $ python3 forwarder.py
    
  6. From your favorite browser open the following for backend (Fig 2, Fig 3):

    • https://<domain.com>/dashboard/
    • https://<domain.com>/public/kgc_detailed.html
    • https://<domain.com>/public/lks_detailed.html

    While these on your gate display (Fig 1):

    • https://<domain.com>/public/lks.html
    • https://<domain.com>/public/kgc.html

    I placed the browser on auto run with the following configuration:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --start-fullscreen
    

    or this if you want it on a 2nd monitor:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --window-position=1925,500 --start-fullscreen
    

    I'm using Edge Chromium but this will also work with Google Chrome.


Sensors

The device we have is Brickstreamm 2300. It has a setting called Real Time Data Streaming, here's what I did:

  1. I have set all our sensors to send realtime data to the IP address of where I have forwarder.py running.
  2. The data will be sent evey 10000 millisecond in xml format, which also means forwarder.py expects an xml data.
  3. The counter counts continuously and will always send the total number of entry and exit from the day it was installed. This will be parsed to check the difference between milliseconds resulting the entry and exit counts for that time.
  4. If you are using a different device you should change how I parse the received data at forwader.py lines 56 to 78.

Other resources:

  1. Ubuntu on Azure
  2. Nginx as reverse proxy
  3. HTTPS setup through Let's Encrypt

About

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

Topics

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - RonBulaon/PeopleCounter: In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement. · GitHub
Skip to content

Repository files navigation

PeopleCounter

Background and Motivation:

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

On each of library entrances (where I currently work), there are counters at the gate that logs each entries and exits. From these logs, reports are generated on a regular basis (monthly). However, this solution does not provide a live counter that can be viewed and monitored on a near real-time basis.

The idea

Despite of having a simple requirement, I realized that none of the vendors we have can provide exactly what need. Not to mention the very high cost that comes with the partial solution they offer.

We decided to create our own solution. After checking our gate counters, we found a feature that we can use to send the current count to a server via HTTP, however is it not being utilized. We played around the newly found feature/setting and set it to send update every 10000 millisecond to emulate near real-time couting.


How it works:

Re-configurations are made to the entrances’ people counters to send update to a server every few seconds. From the server, the information is parsed, and calculations are made for the occupancy count. The information is then displayed in a browser that refreshes every few seconds as shown below:


Fig 1: Used at entrance display



Fig 2: Backend Display (More details)

Historical data are then saved on a Database and then displayed using Dash by Plotly module. Using heatmap chart on a daily and hourly basis we're be able to see the occupancy trends across several days.


Fig 3: Heatmap



Overview


Fig 4: Diagram



Initial Usage

  1. Clone this repository

    $ git clone https://github.com/RonBulaon/PeopleCounter.git
    
  2. Replace / Update the folloeing to match your environment.

    • Update the on files at public/*.html files
    • Sensor IP addresses, Schedule, Database name and Database credentials at config.conf
    • If you want teams notification update [msteams] section at config.conf
    • Update script /path/to/folder/ at checker.py and stopDashboard.py
    • Update <local_IP> and <remote_IP> IPs at forwarder.py
  3. Go to the downloaded repository's source folder and install the requirements.

    $ cd PeopleCounter
    $ pip install -r Requirements.txt
    
  4. Execute script this way:

    $ python3 checker.py
    $ python3 stopDashboard.py
    

    Note :

    • checker.py and stopDashboard.py would start/restart the all running scripts every execution.
    • The these scripts can be used with cron to regularly check or restart the scripts if needed.
    • YOu must move it to PeopleCounter directory to make it work properly.
  5. Run forwarder.py this will receive the count from sensors then forward it to port 8080 of the script above. This can be executed from same server or from remote device as gateway/forwarder. Just make sure that you have indicated the proper ports and IP addresses for remote and local.

    $ python3 forwarder.py
    
  6. From your favorite browser open the following for backend (Fig 2, Fig 3):

    • https://<domain.com>/dashboard/
    • https://<domain.com>/public/kgc_detailed.html
    • https://<domain.com>/public/lks_detailed.html

    While these on your gate display (Fig 1):

    • https://<domain.com>/public/lks.html
    • https://<domain.com>/public/kgc.html

    I placed the browser on auto run with the following configuration:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --start-fullscreen
    

    or this if you want it on a 2nd monitor:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --window-position=1925,500 --start-fullscreen
    

    I'm using Edge Chromium but this will also work with Google Chrome.


Sensors

The device we have is Brickstreamm 2300. It has a setting called Real Time Data Streaming, here's what I did:

  1. I have set all our sensors to send realtime data to the IP address of where I have forwarder.py running.
  2. The data will be sent evey 10000 millisecond in xml format, which also means forwarder.py expects an xml data.
  3. The counter counts continuously and will always send the total number of entry and exit from the day it was installed. This will be parsed to check the difference between milliseconds resulting the entry and exit counts for that time.
  4. If you are using a different device you should change how I parse the received data at forwader.py lines 56 to 78.

Other resources:

  1. Ubuntu on Azure
  2. Nginx as reverse proxy
  3. HTTPS setup through Let's Encrypt

About

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

Topics

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - RonBulaon/PeopleCounter: In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement. · GitHub
Skip to content

Repository files navigation

PeopleCounter

Background and Motivation:

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

On each of library entrances (where I currently work), there are counters at the gate that logs each entries and exits. From these logs, reports are generated on a regular basis (monthly). However, this solution does not provide a live counter that can be viewed and monitored on a near real-time basis.

The idea

Despite of having a simple requirement, I realized that none of the vendors we have can provide exactly what need. Not to mention the very high cost that comes with the partial solution they offer.

We decided to create our own solution. After checking our gate counters, we found a feature that we can use to send the current count to a server via HTTP, however is it not being utilized. We played around the newly found feature/setting and set it to send update every 10000 millisecond to emulate near real-time couting.


How it works:

Re-configurations are made to the entrances’ people counters to send update to a server every few seconds. From the server, the information is parsed, and calculations are made for the occupancy count. The information is then displayed in a browser that refreshes every few seconds as shown below:


Fig 1: Used at entrance display



Fig 2: Backend Display (More details)

Historical data are then saved on a Database and then displayed using Dash by Plotly module. Using heatmap chart on a daily and hourly basis we're be able to see the occupancy trends across several days.


Fig 3: Heatmap



Overview


Fig 4: Diagram



Initial Usage

  1. Clone this repository

    $ git clone https://github.com/RonBulaon/PeopleCounter.git
    
  2. Replace / Update the folloeing to match your environment.

    • Update the on files at public/*.html files
    • Sensor IP addresses, Schedule, Database name and Database credentials at config.conf
    • If you want teams notification update [msteams] section at config.conf
    • Update script /path/to/folder/ at checker.py and stopDashboard.py
    • Update <local_IP> and <remote_IP> IPs at forwarder.py
  3. Go to the downloaded repository's source folder and install the requirements.

    $ cd PeopleCounter
    $ pip install -r Requirements.txt
    
  4. Execute script this way:

    $ python3 checker.py
    $ python3 stopDashboard.py
    

    Note :

    • checker.py and stopDashboard.py would start/restart the all running scripts every execution.
    • The these scripts can be used with cron to regularly check or restart the scripts if needed.
    • YOu must move it to PeopleCounter directory to make it work properly.
  5. Run forwarder.py this will receive the count from sensors then forward it to port 8080 of the script above. This can be executed from same server or from remote device as gateway/forwarder. Just make sure that you have indicated the proper ports and IP addresses for remote and local.

    $ python3 forwarder.py
    
  6. From your favorite browser open the following for backend (Fig 2, Fig 3):

    • https://<domain.com>/dashboard/
    • https://<domain.com>/public/kgc_detailed.html
    • https://<domain.com>/public/lks_detailed.html

    While these on your gate display (Fig 1):

    • https://<domain.com>/public/lks.html
    • https://<domain.com>/public/kgc.html

    I placed the browser on auto run with the following configuration:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --start-fullscreen
    

    or this if you want it on a 2nd monitor:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --window-position=1925,500 --start-fullscreen
    

    I'm using Edge Chromium but this will also work with Google Chrome.


Sensors

The device we have is Brickstreamm 2300. It has a setting called Real Time Data Streaming, here's what I did:

  1. I have set all our sensors to send realtime data to the IP address of where I have forwarder.py running.
  2. The data will be sent evey 10000 millisecond in xml format, which also means forwarder.py expects an xml data.
  3. The counter counts continuously and will always send the total number of entry and exit from the day it was installed. This will be parsed to check the difference between milliseconds resulting the entry and exit counts for that time.
  4. If you are using a different device you should change how I parse the received data at forwader.py lines 56 to 78.

Other resources:

  1. Ubuntu on Azure
  2. Nginx as reverse proxy
  3. HTTPS setup through Let's Encrypt

About

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

Topics

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - RonBulaon/PeopleCounter: In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement. · GitHub
Skip to content

Repository files navigation

PeopleCounter

Background and Motivation:

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

On each of library entrances (where I currently work), there are counters at the gate that logs each entries and exits. From these logs, reports are generated on a regular basis (monthly). However, this solution does not provide a live counter that can be viewed and monitored on a near real-time basis.

The idea

Despite of having a simple requirement, I realized that none of the vendors we have can provide exactly what need. Not to mention the very high cost that comes with the partial solution they offer.

We decided to create our own solution. After checking our gate counters, we found a feature that we can use to send the current count to a server via HTTP, however is it not being utilized. We played around the newly found feature/setting and set it to send update every 10000 millisecond to emulate near real-time couting.


How it works:

Re-configurations are made to the entrances’ people counters to send update to a server every few seconds. From the server, the information is parsed, and calculations are made for the occupancy count. The information is then displayed in a browser that refreshes every few seconds as shown below:


Fig 1: Used at entrance display



Fig 2: Backend Display (More details)

Historical data are then saved on a Database and then displayed using Dash by Plotly module. Using heatmap chart on a daily and hourly basis we're be able to see the occupancy trends across several days.


Fig 3: Heatmap



Overview


Fig 4: Diagram



Initial Usage

  1. Clone this repository

    $ git clone https://github.com/RonBulaon/PeopleCounter.git
    
  2. Replace / Update the folloeing to match your environment.

    • Update the on files at public/*.html files
    • Sensor IP addresses, Schedule, Database name and Database credentials at config.conf
    • If you want teams notification update [msteams] section at config.conf
    • Update script /path/to/folder/ at checker.py and stopDashboard.py
    • Update <local_IP> and <remote_IP> IPs at forwarder.py
  3. Go to the downloaded repository's source folder and install the requirements.

    $ cd PeopleCounter
    $ pip install -r Requirements.txt
    
  4. Execute script this way:

    $ python3 checker.py
    $ python3 stopDashboard.py
    

    Note :

    • checker.py and stopDashboard.py would start/restart the all running scripts every execution.
    • The these scripts can be used with cron to regularly check or restart the scripts if needed.
    • YOu must move it to PeopleCounter directory to make it work properly.
  5. Run forwarder.py this will receive the count from sensors then forward it to port 8080 of the script above. This can be executed from same server or from remote device as gateway/forwarder. Just make sure that you have indicated the proper ports and IP addresses for remote and local.

    $ python3 forwarder.py
    
  6. From your favorite browser open the following for backend (Fig 2, Fig 3):

    • https://<domain.com>/dashboard/
    • https://<domain.com>/public/kgc_detailed.html
    • https://<domain.com>/public/lks_detailed.html

    While these on your gate display (Fig 1):

    • https://<domain.com>/public/lks.html
    • https://<domain.com>/public/kgc.html

    I placed the browser on auto run with the following configuration:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --start-fullscreen
    

    or this if you want it on a 2nd monitor:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --window-position=1925,500 --start-fullscreen
    

    I'm using Edge Chromium but this will also work with Google Chrome.


Sensors

The device we have is Brickstreamm 2300. It has a setting called Real Time Data Streaming, here's what I did:

  1. I have set all our sensors to send realtime data to the IP address of where I have forwarder.py running.
  2. The data will be sent evey 10000 millisecond in xml format, which also means forwarder.py expects an xml data.
  3. The counter counts continuously and will always send the total number of entry and exit from the day it was installed. This will be parsed to check the difference between milliseconds resulting the entry and exit counts for that time.
  4. If you are using a different device you should change how I parse the received data at forwader.py lines 56 to 78.

Other resources:

  1. Ubuntu on Azure
  2. Nginx as reverse proxy
  3. HTTPS setup through Let's Encrypt

About

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

Topics

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - RonBulaon/PeopleCounter: In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement. · GitHub
Skip to content

Repository files navigation

PeopleCounter

Background and Motivation:

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

On each of library entrances (where I currently work), there are counters at the gate that logs each entries and exits. From these logs, reports are generated on a regular basis (monthly). However, this solution does not provide a live counter that can be viewed and monitored on a near real-time basis.

The idea

Despite of having a simple requirement, I realized that none of the vendors we have can provide exactly what need. Not to mention the very high cost that comes with the partial solution they offer.

We decided to create our own solution. After checking our gate counters, we found a feature that we can use to send the current count to a server via HTTP, however is it not being utilized. We played around the newly found feature/setting and set it to send update every 10000 millisecond to emulate near real-time couting.


How it works:

Re-configurations are made to the entrances’ people counters to send update to a server every few seconds. From the server, the information is parsed, and calculations are made for the occupancy count. The information is then displayed in a browser that refreshes every few seconds as shown below:


Fig 1: Used at entrance display



Fig 2: Backend Display (More details)

Historical data are then saved on a Database and then displayed using Dash by Plotly module. Using heatmap chart on a daily and hourly basis we're be able to see the occupancy trends across several days.


Fig 3: Heatmap



Overview


Fig 4: Diagram



Initial Usage

  1. Clone this repository

    $ git clone https://github.com/RonBulaon/PeopleCounter.git
    
  2. Replace / Update the folloeing to match your environment.

    • Update the on files at public/*.html files
    • Sensor IP addresses, Schedule, Database name and Database credentials at config.conf
    • If you want teams notification update [msteams] section at config.conf
    • Update script /path/to/folder/ at checker.py and stopDashboard.py
    • Update <local_IP> and <remote_IP> IPs at forwarder.py
  3. Go to the downloaded repository's source folder and install the requirements.

    $ cd PeopleCounter
    $ pip install -r Requirements.txt
    
  4. Execute script this way:

    $ python3 checker.py
    $ python3 stopDashboard.py
    

    Note :

    • checker.py and stopDashboard.py would start/restart the all running scripts every execution.
    • The these scripts can be used with cron to regularly check or restart the scripts if needed.
    • YOu must move it to PeopleCounter directory to make it work properly.
  5. Run forwarder.py this will receive the count from sensors then forward it to port 8080 of the script above. This can be executed from same server or from remote device as gateway/forwarder. Just make sure that you have indicated the proper ports and IP addresses for remote and local.

    $ python3 forwarder.py
    
  6. From your favorite browser open the following for backend (Fig 2, Fig 3):

    • https://<domain.com>/dashboard/
    • https://<domain.com>/public/kgc_detailed.html
    • https://<domain.com>/public/lks_detailed.html

    While these on your gate display (Fig 1):

    • https://<domain.com>/public/lks.html
    • https://<domain.com>/public/kgc.html

    I placed the browser on auto run with the following configuration:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --start-fullscreen
    

    or this if you want it on a 2nd monitor:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --window-position=1925,500 --start-fullscreen
    

    I'm using Edge Chromium but this will also work with Google Chrome.


Sensors

The device we have is Brickstreamm 2300. It has a setting called Real Time Data Streaming, here's what I did:

  1. I have set all our sensors to send realtime data to the IP address of where I have forwarder.py running.
  2. The data will be sent evey 10000 millisecond in xml format, which also means forwarder.py expects an xml data.
  3. The counter counts continuously and will always send the total number of entry and exit from the day it was installed. This will be parsed to check the difference between milliseconds resulting the entry and exit counts for that time.
  4. If you are using a different device you should change how I parse the received data at forwader.py lines 56 to 78.

Other resources:

  1. Ubuntu on Azure
  2. Nginx as reverse proxy
  3. HTTPS setup through Let's Encrypt

About

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

Topics

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - RonBulaon/PeopleCounter: In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement. · GitHub
Skip to content

Repository files navigation

PeopleCounter

Background and Motivation:

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

On each of library entrances (where I currently work), there are counters at the gate that logs each entries and exits. From these logs, reports are generated on a regular basis (monthly). However, this solution does not provide a live counter that can be viewed and monitored on a near real-time basis.

The idea

Despite of having a simple requirement, I realized that none of the vendors we have can provide exactly what need. Not to mention the very high cost that comes with the partial solution they offer.

We decided to create our own solution. After checking our gate counters, we found a feature that we can use to send the current count to a server via HTTP, however is it not being utilized. We played around the newly found feature/setting and set it to send update every 10000 millisecond to emulate near real-time couting.


How it works:

Re-configurations are made to the entrances’ people counters to send update to a server every few seconds. From the server, the information is parsed, and calculations are made for the occupancy count. The information is then displayed in a browser that refreshes every few seconds as shown below:


Fig 1: Used at entrance display



Fig 2: Backend Display (More details)

Historical data are then saved on a Database and then displayed using Dash by Plotly module. Using heatmap chart on a daily and hourly basis we're be able to see the occupancy trends across several days.


Fig 3: Heatmap



Overview


Fig 4: Diagram



Initial Usage

  1. Clone this repository

    $ git clone https://github.com/RonBulaon/PeopleCounter.git
    
  2. Replace / Update the folloeing to match your environment.

    • Update the on files at public/*.html files
    • Sensor IP addresses, Schedule, Database name and Database credentials at config.conf
    • If you want teams notification update [msteams] section at config.conf
    • Update script /path/to/folder/ at checker.py and stopDashboard.py
    • Update <local_IP> and <remote_IP> IPs at forwarder.py
  3. Go to the downloaded repository's source folder and install the requirements.

    $ cd PeopleCounter
    $ pip install -r Requirements.txt
    
  4. Execute script this way:

    $ python3 checker.py
    $ python3 stopDashboard.py
    

    Note :

    • checker.py and stopDashboard.py would start/restart the all running scripts every execution.
    • The these scripts can be used with cron to regularly check or restart the scripts if needed.
    • YOu must move it to PeopleCounter directory to make it work properly.
  5. Run forwarder.py this will receive the count from sensors then forward it to port 8080 of the script above. This can be executed from same server or from remote device as gateway/forwarder. Just make sure that you have indicated the proper ports and IP addresses for remote and local.

    $ python3 forwarder.py
    
  6. From your favorite browser open the following for backend (Fig 2, Fig 3):

    • https://<domain.com>/dashboard/
    • https://<domain.com>/public/kgc_detailed.html
    • https://<domain.com>/public/lks_detailed.html

    While these on your gate display (Fig 1):

    • https://<domain.com>/public/lks.html
    • https://<domain.com>/public/kgc.html

    I placed the browser on auto run with the following configuration:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --start-fullscreen
    

    or this if you want it on a 2nd monitor:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --window-position=1925,500 --start-fullscreen
    

    I'm using Edge Chromium but this will also work with Google Chrome.


Sensors

The device we have is Brickstreamm 2300. It has a setting called Real Time Data Streaming, here's what I did:

  1. I have set all our sensors to send realtime data to the IP address of where I have forwarder.py running.
  2. The data will be sent evey 10000 millisecond in xml format, which also means forwarder.py expects an xml data.
  3. The counter counts continuously and will always send the total number of entry and exit from the day it was installed. This will be parsed to check the difference between milliseconds resulting the entry and exit counts for that time.
  4. If you are using a different device you should change how I parse the received data at forwader.py lines 56 to 78.

Other resources:

  1. Ubuntu on Azure
  2. Nginx as reverse proxy
  3. HTTPS setup through Let's Encrypt

About

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

Topics

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - RonBulaon/PeopleCounter: In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement. · GitHub
Skip to content

Repository files navigation

PeopleCounter

Background and Motivation:

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

On each of library entrances (where I currently work), there are counters at the gate that logs each entries and exits. From these logs, reports are generated on a regular basis (monthly). However, this solution does not provide a live counter that can be viewed and monitored on a near real-time basis.

The idea

Despite of having a simple requirement, I realized that none of the vendors we have can provide exactly what need. Not to mention the very high cost that comes with the partial solution they offer.

We decided to create our own solution. After checking our gate counters, we found a feature that we can use to send the current count to a server via HTTP, however is it not being utilized. We played around the newly found feature/setting and set it to send update every 10000 millisecond to emulate near real-time couting.


How it works:

Re-configurations are made to the entrances’ people counters to send update to a server every few seconds. From the server, the information is parsed, and calculations are made for the occupancy count. The information is then displayed in a browser that refreshes every few seconds as shown below:


Fig 1: Used at entrance display



Fig 2: Backend Display (More details)

Historical data are then saved on a Database and then displayed using Dash by Plotly module. Using heatmap chart on a daily and hourly basis we're be able to see the occupancy trends across several days.


Fig 3: Heatmap



Overview


Fig 4: Diagram



Initial Usage

  1. Clone this repository

    $ git clone https://github.com/RonBulaon/PeopleCounter.git
    
  2. Replace / Update the folloeing to match your environment.

    • Update the on files at public/*.html files
    • Sensor IP addresses, Schedule, Database name and Database credentials at config.conf
    • If you want teams notification update [msteams] section at config.conf
    • Update script /path/to/folder/ at checker.py and stopDashboard.py
    • Update <local_IP> and <remote_IP> IPs at forwarder.py
  3. Go to the downloaded repository's source folder and install the requirements.

    $ cd PeopleCounter
    $ pip install -r Requirements.txt
    
  4. Execute script this way:

    $ python3 checker.py
    $ python3 stopDashboard.py
    

    Note :

    • checker.py and stopDashboard.py would start/restart the all running scripts every execution.
    • The these scripts can be used with cron to regularly check or restart the scripts if needed.
    • YOu must move it to PeopleCounter directory to make it work properly.
  5. Run forwarder.py this will receive the count from sensors then forward it to port 8080 of the script above. This can be executed from same server or from remote device as gateway/forwarder. Just make sure that you have indicated the proper ports and IP addresses for remote and local.

    $ python3 forwarder.py
    
  6. From your favorite browser open the following for backend (Fig 2, Fig 3):

    • https://<domain.com>/dashboard/
    • https://<domain.com>/public/kgc_detailed.html
    • https://<domain.com>/public/lks_detailed.html

    While these on your gate display (Fig 1):

    • https://<domain.com>/public/lks.html
    • https://<domain.com>/public/kgc.html

    I placed the browser on auto run with the following configuration:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --start-fullscreen
    

    or this if you want it on a 2nd monitor:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --window-position=1925,500 --start-fullscreen
    

    I'm using Edge Chromium but this will also work with Google Chrome.


Sensors

The device we have is Brickstreamm 2300. It has a setting called Real Time Data Streaming, here's what I did:

  1. I have set all our sensors to send realtime data to the IP address of where I have forwarder.py running.
  2. The data will be sent evey 10000 millisecond in xml format, which also means forwarder.py expects an xml data.
  3. The counter counts continuously and will always send the total number of entry and exit from the day it was installed. This will be parsed to check the difference between milliseconds resulting the entry and exit counts for that time.
  4. If you are using a different device you should change how I parse the received data at forwader.py lines 56 to 78.

Other resources:

  1. Ubuntu on Azure
  2. Nginx as reverse proxy
  3. HTTPS setup through Let's Encrypt

About

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

Topics

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - RonBulaon/PeopleCounter: In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement. · GitHub
Skip to content

Repository files navigation

PeopleCounter

Background and Motivation:

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

On each of library entrances (where I currently work), there are counters at the gate that logs each entries and exits. From these logs, reports are generated on a regular basis (monthly). However, this solution does not provide a live counter that can be viewed and monitored on a near real-time basis.

The idea

Despite of having a simple requirement, I realized that none of the vendors we have can provide exactly what need. Not to mention the very high cost that comes with the partial solution they offer.

We decided to create our own solution. After checking our gate counters, we found a feature that we can use to send the current count to a server via HTTP, however is it not being utilized. We played around the newly found feature/setting and set it to send update every 10000 millisecond to emulate near real-time couting.


How it works:

Re-configurations are made to the entrances’ people counters to send update to a server every few seconds. From the server, the information is parsed, and calculations are made for the occupancy count. The information is then displayed in a browser that refreshes every few seconds as shown below:


Fig 1: Used at entrance display



Fig 2: Backend Display (More details)

Historical data are then saved on a Database and then displayed using Dash by Plotly module. Using heatmap chart on a daily and hourly basis we're be able to see the occupancy trends across several days.


Fig 3: Heatmap



Overview


Fig 4: Diagram



Initial Usage

  1. Clone this repository

    $ git clone https://github.com/RonBulaon/PeopleCounter.git
    
  2. Replace / Update the folloeing to match your environment.

    • Update the on files at public/*.html files
    • Sensor IP addresses, Schedule, Database name and Database credentials at config.conf
    • If you want teams notification update [msteams] section at config.conf
    • Update script /path/to/folder/ at checker.py and stopDashboard.py
    • Update <local_IP> and <remote_IP> IPs at forwarder.py
  3. Go to the downloaded repository's source folder and install the requirements.

    $ cd PeopleCounter
    $ pip install -r Requirements.txt
    
  4. Execute script this way:

    $ python3 checker.py
    $ python3 stopDashboard.py
    

    Note :

    • checker.py and stopDashboard.py would start/restart the all running scripts every execution.
    • The these scripts can be used with cron to regularly check or restart the scripts if needed.
    • YOu must move it to PeopleCounter directory to make it work properly.
  5. Run forwarder.py this will receive the count from sensors then forward it to port 8080 of the script above. This can be executed from same server or from remote device as gateway/forwarder. Just make sure that you have indicated the proper ports and IP addresses for remote and local.

    $ python3 forwarder.py
    
  6. From your favorite browser open the following for backend (Fig 2, Fig 3):

    • https://<domain.com>/dashboard/
    • https://<domain.com>/public/kgc_detailed.html
    • https://<domain.com>/public/lks_detailed.html

    While these on your gate display (Fig 1):

    • https://<domain.com>/public/lks.html
    • https://<domain.com>/public/kgc.html

    I placed the browser on auto run with the following configuration:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --start-fullscreen
    

    or this if you want it on a 2nd monitor:

    "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://<domain.com>/public/lks.html --window-position=1925,500 --start-fullscreen
    

    I'm using Edge Chromium but this will also work with Google Chrome.


Sensors

The device we have is Brickstreamm 2300. It has a setting called Real Time Data Streaming, here's what I did:

  1. I have set all our sensors to send realtime data to the IP address of where I have forwarder.py running.
  2. The data will be sent evey 10000 millisecond in xml format, which also means forwarder.py expects an xml data.
  3. The counter counts continuously and will always send the total number of entry and exit from the day it was installed. This will be parsed to check the difference between milliseconds resulting the entry and exit counts for that time.
  4. If you are using a different device you should change how I parse the received data at forwader.py lines 56 to 78.

Other resources:

  1. Ubuntu on Azure
  2. Nginx as reverse proxy
  3. HTTPS setup through Let's Encrypt

About

In response to social distancing measures during COVID-19 pandemic, it has been imposed to limit the number of people in almost every location and educational institutions are not exempted to it. Hence the idea of counting the actual number of people inside the building became a requirement.

Topics

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages