From d71efeca1899084f78fd7b4b7402b4c31b0271f8 Mon Sep 17 00:00:00 2001 From: Tom Clark <> Date: Thu, 12 Sep 2019 17:24:43 +0100 Subject: [PATCH] DOC Added JSON and JSONSchema introduction, resources and XML intro --- docs/source/images/digital_twin_hierarchy.svg | 1 + docs/source/images/placeholder.png | Bin 21128 -> 0 bytes docs/source/images/schema_form_example.png | Bin 0 -> 15355 bytes docs/source/index.rst | 36 ++++-- docs/source/schema.rst | 40 +++--- docs/source/schema_introducing_json.rst | 118 ++++++++++++++++++ 6 files changed, 162 insertions(+), 33 deletions(-) create mode 100644 docs/source/images/digital_twin_hierarchy.svg delete mode 100644 docs/source/images/placeholder.png create mode 100644 docs/source/images/schema_form_example.png create mode 100644 docs/source/schema_introducing_json.rst diff --git a/docs/source/images/digital_twin_hierarchy.svg b/docs/source/images/digital_twin_hierarchy.svg new file mode 100644 index 0000000..e6c68e7 --- /dev/null +++ b/docs/source/images/digital_twin_hierarchy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/source/images/placeholder.png b/docs/source/images/placeholder.png deleted file mode 100644 index 2f4cfb32818d6ab5a3052e197179f37a8bbfe72d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21128 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 VkRsnUV^ob~GB$wezrN-Y{T~b+l}G>p diff --git a/docs/source/images/schema_form_example.png b/docs/source/images/schema_form_example.png new file mode 100644 index 0000000000000000000000000000000000000000..c27816ab257e0b8ed77a57ed7a7d7197ed84d5e4 GIT binary patch literal 15355 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 and contribute via the @@ -19,9 +25,22 @@ twined `roadmap `_. +.. _digital_twins: +Digital Twins +============= + A digital twin is a virtual representation of a real life being - a physical asset like a wind turbine or car - or even a human. +.. figure:: images/digital_twin_hierarchy.png + :width: 500px + :align: center + :figclass: align-center + :alt: Hierarchy of digital twins + + A hierarchy of digital twins. Each blue circle represents a twin, coupled to its neighbours. Yellow nodes are where + schema are used to connect twins. + There are three reasons why you might want to create a digital twin: - Monitoring - Prediction @@ -34,14 +53,6 @@ Coupling digital twins is generally even more useful. You might wish to couple y of the local power grid, and a representation of a factory building to determine power demand... enabling you to optimise your factory plant for lowest energy cost whilst intelligently selling surplus power to the grid. -.. figure:: images/placeholder.png - :width: 500px - :align: center - :figclass: align-center - :alt: Just a figure placeholder for the time being - - A hierarchy of digital twins. Each circle represents a twin, coupled to its neighbours. - .. _aims: Aims @@ -50,7 +61,14 @@ Aims **twined** provides a toolkit to help create and validate "schema" - descriptions of a digital twin, what data it requires, what it does and how it works. -You'll find an in depth description in the :ref:`schema` section. +The goals of **twined** are as follows: + - Provide a clear framework for what a digital twin schema can and/or must contain + - Provide functions to validate incoming data against a known schema + - Provide tools to create schema describing what you require + - Provide a function to check that a schema itself is valid + +Using schema, we can describe how digital twins connect and interact... building them together in hierarchies and +networks. You'll find an in depth description in the :ref:`schema` section. .. _reason_for_being: diff --git a/docs/source/schema.rst b/docs/source/schema.rst index 614ea59..001d9f8 100644 --- a/docs/source/schema.rst +++ b/docs/source/schema.rst @@ -4,7 +4,11 @@ Schema ====== -This is the core of **twined**. +This is the core of **twined**, whose whole purpose is to provide and use schemas for digital twins.. + +.. _requirements: +Requirements of digital twin schema +=================================== A *schema* defines a digital twin, and has multiple roles. It: @@ -19,35 +23,23 @@ If this weren't enough, the schema: #. Must be human-readable #. Must be searchable/indexable +Fortunately for digital twin developers, many of these requirements have already been seen for data interchange formats +developed for the web. **twined** uses `JSON` and `JSONSchema` to interchange data between digital twins. If you're not +already familiar with JSONSchema (or wish to know why **twined** uses `JSON` over the seemingly more appropriate `XML` +standard), see :ref:`introducing_json_schema`. -.. _schema_json: -Using JSON Schema -================= - -Fortunately for digital twin developers, many of these - -.. tabs:: - - .. code-tab:: py - import numpy as np - import es +.. _specifying_a_framework: +Specifying a framework +====================== - def main(): - pass - - -.. _why_not_xml: -Why not XML ------------ - -In a truly `excellent three-part blog`_ +We cannot simply expect many developers to create digital twins with a `JSONSchema` then to be able to connect them all +together. **twined** makes things slightly more specific .. toctree:: :maxdepth: 0 :hidden: - turbulence_coherent_structures - turbulence_wind - turbulence_tidal + schema_introducing_json + diff --git a/docs/source/schema_introducing_json.rst b/docs/source/schema_introducing_json.rst new file mode 100644 index 0000000..84c8644 --- /dev/null +++ b/docs/source/schema_introducing_json.rst @@ -0,0 +1,118 @@ +.. _introducing_json_schema: + +======================= +Introducing JSON Schema +======================= + +``JSON`` is a data interchange format that has rapidly taken over as the defacto web-based data communication standard +in recent years. + +``JSONSchema`` is a way of specifying what a ``JSON`` document should contain. The Schema are, themselves, written in +``JSON``! + +Whilst schema can become extremely complicated in some scenarios, they can also become quite succinct. See below for the +schema (and matching ``JSON``) for an integer and a string variable. + +.. tabs:: + + .. tab:: JSON + { + "id": 1, + "name": "Tom" + } + + .. tab:: Schema + { + "type": "object", + "title": "An id number and a name", + "properties": { + "id": { + "type": "integer", + "title": "An integer number", + "default": 0 + }, + "name": { + "type": "string", + "title": "A string name", + "default": "" + } + } + } + +.. list-table:: Some useful resources for JSON Schema + :widths: auto + :header-rows: 1 + + * - https://jsonschema.net/ + - Useful web tool for inferring schema from existing json + * - https://jsoneditoronline.org + - A powerful online editor for json, allowing manipulation of large documents better than most text editors + * - https://www.json.org/ + - The JSON standard spec + * - https://json-schema.org/ + - The (draft standard) JSONSchema spec + * - https://rjsf-team.github.io/react-jsonschema-form/ + - A front end library for generating webforms directly from a schema + + +.. _human_readbility: +Human readability +================= + +Back in our :ref:`requirements` section, we noted it was important for humans to read and understand schema. + +The actual documents themselves are pretty easy to read by technical users. For non technical users, readability can be +enhanced even further by the ability to turn ``JSONSchema`` into web forms automatically. For our example above, we can +autogenerate a web form straight from the schema: + +.. figure:: images/schema_form_example.png + :width: 500px + :align: center + :figclass: align-center + :alt: Web form from an example schema + + Web form generated from the example schema above. + +Thus, we can take a schema (or a part of a schema) and use it to generate a control form for a digital twin in a web +interface without writing a separate form component - great for ease and maintainability. + + +.. _why_not_xml: +Why not XML +=========== + +In a truly excellent `three-part blog `_, writer Seva Savris takes us +through the ups and downs of ``JSON`` versus ``XML``; well worth a read if wishing to understand the respective technologies +better. + +In short, both ``JSON`` and ``XML`` are generalised data interchange specifications and can both can do what we want here. +We choose ``JSON`` because: + +#. Textual representation is *much* more concise and easy to understand (very important where non-developers like + engineers and scientists must be expected to interpret schema) + +#. `Attack vectors `_. Because entities in ``XML`` + are not necessarily primitives (unlike in ``JSON``), an ``XML`` document parser in its default state may leave a system + open to XXE injection attacks and DTD validation attacks, and therefore requires hardening. ``JSON`` documents are + similarly afflicated (just like any kind of serialized data) but default parsers, operating on the premise of only + deserializing to primitive types, are safe by default - it is only when nondefault parsering or deserialization + techniques (such as ``JSONP``) are used that the application becomes vulnerable. By utilising a default ``JSON`` parser + we can therefore significantly shrink the attack surface of the system. See + `this blog post `_ for further discussion. + +#. ``XML`` is powerful... perhaps *too* powerful. The standard can be adapted greatly, resulting in high encapsulation + and a high resilience to future unknowns. Both beneficial. However, this requires developers of twins to maintain + interfaces of very high complexity, adaptable to a much wider variety of input. To enable developers to progress, we + suggest handling changes and future unknowns through well-considered versioning, whilst keeping their API simple. + +#. ``XML`` allows baked-in validation of data and metadata. Whilst advantageous in some situations, this is not a + benefit here. We wish validation to be one-sided: validation of data accepted/generated by a digital twin should be + occur within (at) the boundaries of that twin. + +#. With ``JSON`` Schema, we can add the majority of the required validation capabilities (otherwise missing from JSON + but present in ``XML``) to ``JSON`` documents, with our schema specified where we need them. + +#. ``JSON`` is a much more compact expression than XML, significantly reducing memory and bandwidth requirements. Whilst + not a major issue for most modern PCS, sensors on the edge may have limited memory, and both memory and bandwidth at + scale are extremely expensive. Thus for extremely large networks of interconnected systems there could be significant + speed and cost savings.