Build > Interoperability > Configuring
Guide to setting up forms and outbound push for interoperability
Guide to running OpenHIM and Mediators with Docker Compose
The components and reference information for interoperability used in CHT Interoperability project are:
The structure of documents in the CHT database reflects the configuration of the system, and therefore, does not map directly to a FHIR message format. To achieve interoperability, the CHT uses a middleware to convert the CHT data structure into a standardized form so the other systems can read it. Below is the standard data workflow:
graph LR cht[CHT] mediator_a([Mediator]) mediator_b([Mediator]) openhim[OpenHIM] cht -- Outbound pushfa:fa-arrow-right --- mediator_a cht -- API requestfa:fa-arrow-left --- mediator_b mediator_a -- Requestfa:fa-arrow-right --- openhim mediator_b -- Channelfa:fa-arrow-left --- openhim
CHT Interoperability uses OpenHIM as the middleware component with Mediators to do the conversion. Outbound Push is configured to make a request to the middleware when relevant documents are created or modified in the CHT. A Mediator then creates a FHIR resource which is then routed to OpenHIM. OpenHIM routes the resource to any other configured systems.
Conversely, to bring data into the CHT, OpenHIM is configured to route the updated resource to the Mediator, which then calls the relevant CHT APIs to update the document in the CHT database. This will then be replicated to users’ devices as per usual.
See more information on the CHT interoperability page.
dockerPostman or similar tool for API testing.git clone https://github.com/medic/cht-interoperability).Note
Users getting errors when running the following installation steps, see the Troubleshooting guide.
In the cht-interoperability folder, run ./startup.sh init to start up the docker containers on the first run or after calling ./startup.sh destroy. Use ./startup.sh up for subsequent runs after calling init without calling destroy.
Visit the OpenHIM Admin Console at http://localhost:9000 and login with the following credentials: email - interop@openhim.org and password - interop-password. The default User username for OpenHIM is interop@openhim.org and password is interop-password. The default Client username is interop-client and password is interop-password.
Once logged in, visit http://localhost:9000/#!/mediators and select the mediator named ‘CHT Mediator’.
Select the green + button to the right of the default channel to add the mediator.
You can test the CHT mediator by running:
curl -X GET http://localhost:5001/mediator/ -H "Authorization: Basic $(echo -n interop-client:interop-password | base64)"You should get as a response similar to this:
{
"status": "success",
"osuptime": 74012.24,
"processuptime": 56940.700039383
}If everything is successful, when visiting http://localhost:9000/#!/clients you should see this:

For testing other mediators, replace the URL (http://localhost:5001/mediator) with the appropriate values for the specific mediator you are testing. For example if using the OpenMRS mediator, you can test it by running:
curl -X GET localhost:5001/mediator/openmrs/sync -H "Authorization: Basic $(echo -n interop-client:interop-password | base64)"The following steps apply when running CHT via the Docker setup provided in the cht-interoperability repository:
admin/password.interop-client using these instructions. For the role you can select Data entry and Analytics roles. Note that you can use any username you prefer but you would have to update the config with the new username. You can do that by editing the cht-config/app_settings.json file and updating the username value in the outbound object e.g. on this line.interop-client user’s password to the database using the instructions here. Change the values mykey and my pass to openhim1 and your user’s password respectively. An example of the curl request is below:curl -X PUT -H "Content-Type: text/plain" http://admin:password@localhost:5988/api/v1/credentials/openhim1 -d 'interop-password'The following steps apply when running CHT locally in development mode and when making configuration changes locally:
interop-client using these instructions. For the role you can select Data entry and Analytics roles. Note that you can use any username you prefer but you would have to update the config with the new username. You can do that by editing the cht-config/app_settings.json file and updating the username value in the outbound object e.g. on this line.interop-client user’s password to the database using the instructions here. Change the values mykey and my pass to openhim1 and your user’s password respectively. An example of the curls request is below:curl -X PUT -H "Content-Type: text/plain" http://medic:password@localhost:5988/api/v1/credentials/openhim1 -d 'interop-password'./startup.sh up-dev to upload the changes to docker compose.cht-config directory by running cd cht-config.npm install to install the dependencies..env under /mediator folder, copy over the contents of /mediator/.env.template and update the CHT_USERNAME and CHT_PASSWORD values with the admin credentials of your CHT instance.CHT_URL value in the .env file with the new URL.cht --local to compile and upload the app settings configuration to your local CHT instance.Patient and to access a URL like https://*****.my.local-ip.co/#/contacts/patientUUID/report/interop_follow_up. This should retrieve correctly the follow up form. Only a non-admin user will be able to view this form. If you are logged in as an admin user then, check if the form interop_follow_up is listed in the form list in the app settings page.http://localhost:5984/_utils/#database/medic/settings../startup.sh down to stop the instances../startup.sh up. You do not need to run init again like you did in the initial install above../startup.sh destroy. You will have to subsequently run ./startup.sh init if you wish to start the containers.Users encountering:
Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:5000 -> 0.0.0.0:0: listen tcp 0.0.0.0:5000: bind: address already in use
when running ./startup.sh init need to update ports to available values in the /docker/docker-compose.yml file, under the ports verb.
curl request
If the mediator curl request fails, visit http://localhost:9000/#!/clients and click on the icon the red arrow points to in the image below.

npm test
Users encountering the error below when running npm test:
Preset ts-jest is invalid: The “id” argument must be of type string. Received null TypeError [ERR_INVALID_ARG_TYPE]: The “id” argument must be of type string. Received null
need to run npm i --save-dev ts-jest before running npm test.
npm install
Users encountering the error when running npm install:
npm ERR! code EACCES npm ERR! syscall unlink npm ERR! path /Users/phil/interoperability/cht-config/node_modules/.package-lock.json
need to run npm install as root user.
Guide to setting up forms and outbound push for interoperability
Guide to testing the Loss to Follow-Up (LTFU) reference workflow
Exchange patient-level data with systems based on the OpenMRS platform