Skip to content
Snippets Groups Projects
Commit ff890dbc authored by Ahmed Osman's avatar Ahmed Osman
Browse files

update readme.md

parent 61acf9d8
Branches
Tags
No related merge requests found
Pipeline #313792 passed
The latest version of the demo consists mainly of three communication partners: demo2_dzwald.py, demo2_forestmanager.py (which represents the Dienstleister) and demo2_forestmanager_waldbesitzer.py (which as the name implies represents the forest owner).
demo2_dzwald.py uses the S3IBServer Component from broker_api.py to expose an underlying AAS through the AAS-Interface.
Interaction becomes possible using the S3IBAsyncClient Component and its get-, setValue and invokeOperation methods. Specific elements of the AAS are addressed through a path which has the following form:
/aas/submodels/<submodel_id_base64_encoded>/submodel/submodelELements/<id_short_path_encoded>
for example:
`
submodel_id = "https://www.company.com/holzliste/1"
submodel_id_encoded = base64.urlsafe_b64encode(submodel_id.encode()).decode()
id_short_path_encoded = quote("Preismatrix[0].Preis")
preis: model.Property = provider.getValue(
f"/aas/submodels/{submodel_id_encoded}/submodel/submodelElements/{id_short_path_encoded}"
)
`
Note: Both the S3IBServer and S3IAsyncClient are actually AMQP Clients that exchange messages through the S3I-Broker.
S3IBServer is instantiated with:
`server = broker_api.S3IBServer(access_token, provider, dzwald_id, loop, "https://www.company.com/security", False)`
Set the last boolean to True to enable authorization. This requires a running opa server. The .exe within /demo2/opa can be used. Simply open cmd and run `opa run --server policy.rego`. "https://www.company.com/security" corresponds here to the id of the security Submodel, which the S3IServer uses to update the opa server's data regularily (used to make permission grant decisions in accordance with the policy). Check /demo2/model/security.py for more information.
Events can be subscribed to and awaited using S3IBAsyncClient's awaitEvent method. This will block until the event has been triggered (and the event message received).
For example:
`
# listen on event "Auftragsstatus_Updated"
events_submodel_id = "https://www.company.com/submodels/events"
events_submodel_id_encoded = base64.urlsafe_b64encode(events_submodel_id.encode()).decode()
event: model.BasicEventElement = await client.getValue(dzwald_id, dzwald_endpoint,
f"/aas/submodels/{events_submodel_id_encoded} \
/submodel/submodelElements/Auftragsstatus_Updated")
auftragsstatus_updated = await client.awaitEvent(event.message_topic)
`
To await specific messages, S3IBAsyncClient's awaitMessage method can be used. This takes the message's attributes as parameter. In the following, demo2_forestmanager.py awaits a UserMessage with text "Authorized" that signals that access has been granted before proceeding with rest of the code.
`await client.awaitMessage({"text": "Authorized"})`
demo2_forestmanager_waldbesitzer.py updates the security submodel, then notifies demo2_forestmanager.py using the
S3IBAsyncClient's sendUserMessage Method:
`await client.sendUserMessage(forstify_hmi_id, "s3ibs://" + forstify_hmi_id, "Authorized", "Authorized")`
(foristify_hmi_id here is a naming mistake)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment