Repository for external analyzer plugins for OpenELIS Global. Currently 35 analyzers are supported across 30+ countries.
- INVENTORY.md - Complete structured inventory with protocol details
- Template - Plugin template for new analyzers
- CONTRIBUTING.md - Architecture standards and contribution guidelines
Complete blood count (CBC) and differential analysis.
| Analyzer | Manufacturer | Protocol | Transport |
|---|---|---|---|
| HoribaMicros60 | Horiba ABX | ASTM | RS232 |
| HoribaPentra60 | Horiba ABX | ASTM | RS232 |
| Mindray | Mindray | HL7 | TCP/IP |
| pocH-100i | Horiba ABX | ASTM | RS232/TCP |
| Sysmex2000i | Sysmex | FILE | Filesystem |
| Sysmex4000i | Sysmex | FILE | Filesystem |
| SysmexKX21 | Sysmex | FILE | Filesystem |
| SysmeXT | Sysmex | FILE | Filesystem |
| SysmexXN-L | Sysmex | ASTM | RS232/TCP |
| SysmexXN1000 | Sysmex | FILE | Filesystem |
| SysmexXP | Sysmex | ASTM | RS232/TCP |
| SysmexXT4000i | Sysmex | FILE | Filesystem |
PCR, viral load, and nucleic acid testing.
| Analyzer | Manufacturer | Protocol | Transport |
|---|---|---|---|
| AB7500Fast | Applied Biosystems | FILE | Filesystem |
| Cobas4800 | Roche | FILE | Filesystem |
| Cobas6800VL | Roche | HL7 | TCP/IP |
| CobasTaqMan48DBS | Roche | FILE | Filesystem |
| CobasTaqMan48VL | Roche | FILE | Filesystem |
| CobasTaqman96VL | Roche | FILE | Filesystem |
| CobasTaqMan96DBS | Roche | FILE | Filesystem |
| FluoroCyclerXT | Hain Lifescience | FILE | Filesystem |
| GeneXpertFile | Cepheid | FILE | Filesystem |
| GeneXpertHL7 | Cepheid | HL7 | HTTP/TCP |
Clinical chemistry panels (glucose, creatinine, liver enzymes, etc.)
| Analyzer | Manufacturer | Protocol | Transport |
|---|---|---|---|
| CobasC111 | Roche | FILE | Filesystem |
| CobasIntegra400 | Roche | FILE | Filesystem |
| Fully | Unknown | FILE | Filesystem |
| Mindray | Mindray | HL7 | TCP/IP |
CD4/CD3 counting for HIV monitoring.
| Analyzer | Manufacturer | Protocol | Transport |
|---|---|---|---|
| FacsCalibur | BD Biosciences | FILE | Filesystem |
| FacsCantoII | BD Biosciences | FILE | Filesystem |
| FacsPresto | BD Biosciences | FILE | Filesystem |
| weberAnalyzer | Weber | FILE | Filesystem |
Immunoassay testing (HIV, HBsAg, VDRL).
| Analyzer | Manufacturer | Protocol | Transport |
|---|---|---|---|
| AbbottArchitect | Abbott | HL7 | TCP/IP |
Coagulation testing (PT, INR, APTT, Fibrinogen).
| Analyzer | Manufacturer | Protocol | Transport |
|---|---|---|---|
| StagoSTart4 | Stago | ASTM/HL7 | RS232/TCP |
| Item | Description |
|---|---|
| GenericASTM | Database-driven ASTM plugin for dashboard-configured analyzers |
| template | Plugin development template for creating new analyzer plugins |
HL7 messages over TCP/IP with MLLP framing (0x0B start, 0x1C+0x0D end).
| Analyzer | MSH-3 Sending Application | Category |
|---|---|---|
| AbbottArchitect | ARCHITECT or ABBOTT | Immunology |
| Cobas6800VL | (Contains "Load Viral") | Molecular |
| GeneXpertHL7 | (HTTP servlet) | Molecular |
| Mindray | MINDRAY | Hematology/Chemistry |
| StagoSTart4 | STAGO | Coagulation |
Bidirectional laboratory instrument communication (ENQ/ACK/NAK framing).
| Analyzer | Transport | H-Segment Identification |
|---|---|---|
| GeneXpert | RS232/TCP | Contains "GeneXpert" |
| GenericASTM | RS232/TCP | Database pattern matching |
| HoribaMicros60 | RS232 | Contains "ABX^MICROS60" |
| HoribaPentra60 | RS232 | Contains "ABX^PENTRA60" |
| pocH-100i | RS232/TCP | Contains "pocH-100i" |
| StagoSTart4 | RS232 | Contains "START4" or "STAGO" |
| SysmexXN-L | RS232/TCP | Contains "XN-L" |
| SysmexXP | RS232/TCP | Contains "XP-100" |
CSV/TXT file exports monitored via filesystem watcher.
Molecular (7): AB7500Fast, Cobas4800, CobasTaqMan series (4), FluoroCyclerXT, GeneXpertFile
Hematology (7): Sysmex2000i, Sysmex4000i, SysmexKX21, SysmeXT, SysmexXN1000, SysmexXT4000i
Chemistry (3): CobasC111, CobasIntegra400, Fully
Flow Cytometry (4): FacsCalibur, FacsCantoII, FacsPresto, weberAnalyzer
Molecular (2): QuantStudio3
See INVENTORY.md for complete file format details.
Plugins depend on org.openelisglobal:openelisglobal:3.2.1.2 (classifier
classes), which is not on Maven Central. Install it locally first.
Run the install script (tries lightweight sources first, falls back to Maven build):
# From OpenELIS-Global-2 root (submodule):
plugins/scripts/install-oe-jar.sh
# Or from this repo's root:
./scripts/install-oe-jar.shThe script tries three sources in order:
- GitHub release download (~5s) — requires
ghCLI - Docker image extraction (~6s) — requires Docker with
itechuw/openelis-global-2image - Local Maven build (minutes) — only if running inside the OE2 submodule tree
mvn clean installFrom the repository root (recommended):
mvn clean package -pl :PluginArtifactId -am-am (also-make) ensures local dependencies like test-utilities are built.
Use :ArtifactId syntax (e.g., :CobasC111, :GeneXpert).
- Java 21 LTS
- Maven 3.8+
- OpenELIS Global 2.x
-
Copy the built JAR to the plugins directory:
cp target/*.jar /var/lib/openelis-global/plugins/ -
Restart OpenELIS:
docker compose restart oe.openelis.org
-
Verify plugin loaded:
- Navigate to: Results > Analyzer
- Plugin should appear in the dropdown menu
- Configure file import directory (if applicable)
- Analyzer exports results to configured directory
- OpenELIS monitors directory and imports automatically
- Install and configure OpenELIS Analyzer Bridge
- Connect analyzer via RS232 or TCP/IP
- Configure analyzer in OpenELIS Dashboard
- Results flow bidirectionally
- Configure network settings on analyzer
- Point analyzer to OpenELIS IP/port
- Configure analyzer in OpenELIS Dashboard
- Results received via HL7 ORU^R01 messages
Plugin tests that extend AnalyzerLineInserter require special handling because the base class attempts to access Spring beans during construction. To handle this, extend PluginTestBase from the test-utilities module:
import org.junit.Test;
import org.openelisglobal.plugin.test.PluginTestBase;
public class MyAnalyzerLineInserterTest extends PluginTestBase {
@Test
public void testParseLine_WithValidData_ReturnsRecord() {
MyAnalyzerLineInserter inserter = new MyAnalyzerLineInserter();
// Test parsing logic - SpringContext is automatically mocked
}
}In your plugin's pom.xml:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openelisglobal.plugins</groupId>
<artifactId>test-utilities</artifactId>
<version>1.0</version>
<scope>test</scope>
</dependency>
</dependencies># Run all tests
mvn test
# Run tests for a specific plugin
mvn test -pl ./analyzers/PluginName
# Run a specific test class
mvn test -pl ./analyzers/PluginName -Dtest=MyTestClassThe test-utilities module provides PluginTestBase, which automatically:
- Mocks
SpringContext.getBean()to prevent NullPointerException - Sets up and tears down mocks before/after each test
- Allows testing parsing logic without a full Spring application context
For custom service mocking, override setupMocks():
@Override
protected void setupMocks() {
MyService mockService = mock(MyService.class);
when(SpringContext.getBean(MyService.class)).thenReturn(mockService);
}-
Copy template/ as starting point:
cp -r analyzers/template/ analyzers/MyAnalyzer/
-
Update plugin descriptor XML
-
Implement analyzer identification logic
-
Add test mappings
-
Build and test
- Analyzer interface implementation
- File/message identification logic
- Test code to OpenELIS test mappings
- Build configuration (pom.xml)
- README.md documentation
See CONTRIBUTING.md for:
- Plugin architecture standards (Java 21, Maven layout, code formatting)
- Lazy initialization pattern (required for all Spring bean access)
- How to write and test new plugins
- Quality requirements and prohibited patterns
- Contribution workflow
All plugins MUST use lazy initialization for Spring beans. Static initializers that call SpringContext.getBean() are prohibited as they prevent unit testing. See CONTRIBUTING.md for the required pattern.
GenericASTM allows analyzers to be configured entirely through the OpenELIS dashboard without writing Java code. See Feature 004 (analyzer-management) for details.
Note: GenericASTM requires the 2-table analyzer model, available on develop since feat/011 merged.
- Contact Original Author: Check plugin's
contact.txtif present - Coordinate with Core Team: Ensure changes don't break existing deployments
- Backward Compatibility: Maintain compatibility with existing configurations
- Update Documentation: Update plugin's README.md
- Create plugin from template/
- Follow plugin requirements above
- Add comprehensive README.md
- Submit pull request to openelisglobal-plugins
- INVENTORY.md - Complete analyzer inventory with technical details
- Feature 011 Madagascar Analyzers - Madagascar deployment specifics
- Issues: Report bugs via GitHub Issues
- Discussions: Join GitHub Discussions
- Documentation: OpenELIS Global Wiki
Maintained By: OpenELIS Global Community
Plugin Repository: openelisglobal-plugins
Main Repository: OpenELIS-Global-2
Last Updated: 2026-02-02