Skip to content

This codec is used to encode the data to send to Watteco sensors. And to decode the received data.

License

Notifications You must be signed in to change notification settings

Watteco/Codec-Report-Standard-Python

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

54 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Codec-Python

ENGLISH


Pre-requesite:

Need Python 3.6 or Upper

  • install dicctoxml:

    • go to dicttoxml-1.7.4/
    • command to execute: py setup.py install
  • install construct:

    • go to construct-2.8.12/
    • command to execute: py setup.py install
  • Could also be installed with pip:

    • pip install dicttoxml==1.7.4
    • pip install construct==2.8.12

Run the decoding:

  • Go to srcWatteco/
  • To decode a frame in xmll: echo 11... | py Main.py -of xmlp
  • To decode a frame in json: echo 11... | py Main.py -of json

Run the encoding:

  • Go to srcWatteco/
  • To encode a json in frame: echo {"EndPoint": 0, ...} | py Main.py -m e

Examples:

  1. decode NodePowerDescriptor in json:

echo 110a005000064107010536d80e4e01a059022ee0000001 | py Main.py -of json

Json output
{"version": "WATTECO_Frame_Codec_v_1.0", "TimeStamp": "2018-05-14 09:35:36.186645"}
{
 "FrameCtrl": {
  "EndPoint": 0,
  "Report": "Standard"
 },
 "CommandID": "ReportAttributes",
 "ClusterID": "Configuration",
 "AttributeID": "NodePowerDescriptor",
 "AttributeType": "ByteString",
 "Data": {
  "CurrentPowerMode": "PeriodicallyON",
  "AvailablePowerSourceBitField": 5,
  "ConstantVoltage": 14040,
  "DisposableBatteryVoltage": 3662,
  "CurrentPowerSource": "Constant"
 }
}
  1. decode Temperature in xmlp:

echo 110a04020000290A25 | py Main.py -of xmlp

XML output
<?xml version="1.0" ?>
<WATTECO_Frame_Codec_v_1.0>
        <FrameCtrl type="dict">
                <EndPoint type="int">0</EndPoint>
                <Report type="str">Standard</Report>
        </FrameCtrl>
        <CommandID type="str">ReportAttributes</CommandID>
        <ClusterID type="str">Temperature</ClusterID>
        <AttributeID type="str">MeasuredValue</AttributeID>
        <AttributeType type="str">Int16</AttributeType>
        <Data type="int">2597</Data>
</WATTECO_Frame_Codec_v_1.0>

Example Frames:

  1. report Alarm with Long cause Binary Input Count:

118a000f0402230000000aa0d00000000a0000000001

Json output
{
 "EndPoint": 0,
 "Report": "Standard",
 "CommandID": "ReportAttributesAlarm",
 "ClusterID": "BinaryInput",
 "AttributeID": "Count",
 "AttributeType": "UInt32",
 "Data": 10,
 "Cause": [
  {
   "ReportParameters": {
    "New": "Yes",
    "Reserved": 0,
    "CauseRequest": "Long",
    "SecuredIfAlarm": "No",
    "Secured": "No",
    "NoHeaderPort": "No",
    "Batch": "No"
   },
   "SlotDescriptors": [
    {
     "CriteriaSlotDescriptor": {
      "Alarm": "Yes",
      "OnExceed": "Yes",
      "OnFall": "No",
      "Mode": "Threshold",
      "CriterionIndex": 0
     },
     "Value": 10,
     "Gap": 0,
     "Occurence": {
      "ExtendedOccurences": "No",
      "Occurences": 1
     }
    }
   ]
  }
 ]
}
  1. report woth Long cause Node descriptor:

110a005000064107010536d80e4e01a059022ee0000001

Json output
{
 "EndPoint": 0,
 "Report": "Standard",
 "CommandID": "ReportAttributes",
 "ClusterID": "Configuration",
 "AttributeID": "NodePowerDescriptor",
 "AttributeType": "ByteString",
 "Data": {
  "CurrentPowerMode": "PeriodicallyON",
  "AvailablePowerSourceBitField": 5,
  "ConstantVoltage": 14040,
  "DisposableBatteryVoltage": 3662,
  "CurrentPowerSource": "Constant"
 },
 "Cause": [
  {
   "ReportParameters": {
    "New": "Yes",
    "Reserved": 0,
    "CauseRequest": "Long",
    "SecuredIfAlarm": "No",
    "Secured": "No",
    "NoHeaderPort": "No",
    "Batch": "No"
   },
   "SlotDescriptors": [
    {
     "CriteriaSlotDescriptor": {
      "Alarm": "No",
      "OnExceed": "Yes",
      "OnFall": "No",
      "Mode": "ThresholdWithActions",
      "CriterionIndex": 1
     },
     "FieldIndex": 2,
     "Value": 12000,
     "Gap": 0,
     "Occurence": {
      "ExtendedOccurences": "No",
      "Occurences": 1
     }
    }
   ]
  }
 ]
}
  1. read reporting configuration:

1108000f000055

Json output
{
 "EndPoint": 0,
 "Report": "Standard",
 "CommandID": "ReadReportingConfiguration",
 "ClusterID": "BinaryInput",
 "ReportParameters": {
  "New": "No",
  "Reserved": 0,
  "CauseRequest": "No",
  "SecuredIfAlarm": "No",
  "Secured": "No",
  "NoHeaderPort": "No",
  "Batch": "No"
 },
 "AttributeID": "PresentValue"
}

→ To use in encoding:

{"EndPoint": 0, "Report": "Standard", "CommandID": "ReadReportingConfiguration", "ClusterID": "BinaryInput", "ReportParameters": {"New": "No", "Reserved": 0, "CauseRequest": "No", "SecuredIfAlarm": "No", "Secured": "No", "NoHeaderPort": "No", "Batch": "No"}, "AttributeID": "PresentValue"}
  1. Read attribut req:

1100000f0055

Json output
{
 "EndPoint": 0,
 "Report": "Standard",
 "CommandID": "ReadAttribute",
 "ClusterID": "BinaryInput",
 "AttributeID": "PresentValue"
}

→ To use in encoding:

{"EndPoint": 0, "Report": "Standard", "CommandID": "ReadAttribute", "ClusterID": "BinaryInput", "AttributeID": "PresentValue"}
  1. Configure reporting:

5106000f000402238001800a01020304

Json output
{
 "EndPoint": 2,
 "Report": "Standard",
 "CommandID": "ConfigureReporting",
 "ClusterID": "BinaryInput",
 "ReportParameters": {
  "New": "No",
  "Reserved": 0,
  "CauseRequest": "No",
  "SecuredIfAlarm": "No",
  "Secured": "No",
  "NoHeaderPort": "No",
  "Batch": "No"
 },
 "AttributeID": "Count",
 "AttributeType": "UInt32",
 "MinReport": {
  "Unit": "Minutes",
  "Value": 1
 },
 "MaxReport": {
  "Unit": "Minutes",
  "Value": 10
 },
 "Data": 16909060
}

→To use in encoding:

{"EndPoint": 2, "Report": "Standard", "CommandID": "ConfigureReporting", "ClusterID": "BinaryInput", "ReportParameters": {"New": "No", "Reserved": 0, "CauseRequest": "No", "SecuredIfAlarm": "No", "Secured": "No", "NoHeaderPort": "No", "Batch": "No"}, "AttributeID": "Count", "AttributeType": "UInt32", "MinReport": {"Unit": "Minutes", "Value": 1}, "MaxReport": {"Unit": "Minutes", "Value": 10}, "Data": 16909060}
  1. Configure Binary Input reporting cause long + alarme:

1106000fA004022300008001D00000000a0000000001

Json output
{
 "EndPoint": 0,
 "Report": "Standard",
 "CommandID": "ConfigureReporting",
 "ClusterID": "BinaryInput",
 "ReportParameters": {
  "New": "Yes",
  "Reserved": 0,
  "CauseRequest": "Long",
  "SecuredIfAlarm": "No",
  "Secured": "No",
  "NoHeaderPort": "No",
  "Batch": "No"
 },
 "AttributeID": "Count",
 "AttributeType": "UInt32",
 "MinReport": {
  "Unit": "Seconds",
  "Value": 0
 },
 "MaxReport": {
  "Unit": "Minutes",
  "Value": 1
 },
 "Cause": [
  {
   "CriteriaSlotDescriptor": {
    "Alarm": "Yes",
    "OnExceed": "Yes",
    "OnFall": "No",
    "Mode": "Threshold",
    "CriterionIndex": 0
   },
   "Value": 10,
   "Gap": 0,
   "Occurence": {
    "ExtendedOccurences": "No",
    "Occurences": 1
   }
  }
 ],
 "Data": null
}

→ To use in encoding:

{"EndPoint": 0, "Report": "Standard", "CommandID": "ConfigureReporting", "ClusterID": "BinaryInput", "ReportParameters": {"New": "Yes", "Reserved": 0, "CauseRequest": "Long", "SecuredIfAlarm": "No", "Secured": "No", "NoHeaderPort": "No", "Batch": "No"}, "AttributeID": "Count", "AttributeType": "UInt32", "MinReport": {"Unit": "Seconds", "Value": 0}, "MaxReport": {"Unit": "Minutes", "Value": 1}, "Cause": [{"CriteriaSlotDescriptor": {"Alarm": "Yes", "OnExceed": "Yes", "OnFall": "No", "Mode": "Threshold", "CriterionIndex": 0}, "Value": 10, "Gap": 0, "Occurence": {"ExtendedOccurences": "No", "Occurences": 1}}], "Data": null}
  1. Conf rep cause long + node descriptor + action:

11060050A0000641000580011838022ee00000010600000001000259022ee0000001020003

Json output
{
 "EndPoint": 0,
 "Report": "Standard",
 "CommandID": "ConfigureReporting",
 "ClusterID": "Configuration",
 "ReportParameters": {
  "New": "Yes",
  "Reserved": 0,
  "CauseRequest": "Long",
  "SecuredIfAlarm": "No",
  "Secured": "No",
  "NoHeaderPort": "No",
  "Batch": "No"
 },
 "AttributeID": "NodePowerDescriptor",
 "AttributeType": "ByteString",
 "MinReport": {
  "Unit": "Seconds",
  "Value": 5
 },
 "MaxReport": {
  "Unit": "Minutes",
  "Value": 1
 },
 "Size": 24,
 "Cause": [
  {
   "CriteriaSlotDescriptor": {
    "Alarm": "No",
    "OnExceed": "No",
    "OnFall": "Yes",
    "Mode": "ThresholdWithActions",
    "CriterionIndex": 0
   },
   "FieldIndex": 2,
   "Value": 12000,
   "Gap": 0,
   "Occurence": {
    "ExtendedOccurences": "No",
    "Occurences": 1
   },
   "Actions": {
    "ActDesc": {
     "SendingOfreport": "Yes",
     "Size": 6
    },
    "Action": [
     0,
     0,
     0,
     1,
     0,
     2
    ]
   }
  },
  {
   "CriteriaSlotDescriptor": {
    "Alarm": "No",
    "OnExceed": "Yes",
    "OnFall": "No",
    "Mode": "ThresholdWithActions",
    "CriterionIndex": 1
   },
   "FieldIndex": 2,
   "Value": 12000,
   "Gap": 0,
   "Occurence": {
    "ExtendedOccurences": "No",
    "Occurences": 1
   },
   "Actions": {
    "ActDesc": {
     "SendingOfreport": "Yes",
     "Size": 2
    },
    "Action": [
     0,
     3
    ]
   }
  }
 ],
 "Data": null
}

→ To use in encoding:

{"EndPoint": 0, "Report": "Standard", "CommandID": "ConfigureReporting", "ClusterID": "Configuration", "ReportParameters": {"New": "Yes", "Reserved": 0, "CauseRequest": "Long", "SecuredIfAlarm": "No", "Secured": "No", "NoHeaderPort": "No", "Batch": "No"}, "AttributeID": "NodePowerDescriptor", "AttributeType": "ByteString", "MinReport": {"Unit": "Seconds", "Value": 5}, "MaxReport": {"Unit": "Minutes", "Value": 1}, "Size": 24, "Cause": [{"CriteriaSlotDescriptor": {"Alarm": "No", "OnExceed": "No", "OnFall": "Yes", "Mode": "ThresholdWithActions", "CriterionIndex": 0}, "FieldIndex": 2, "Value": 12000, "Gap": 0, "Occurence": {"ExtendedOccurences": "No", "Occurences": 1}, "Actions": {"ActDesc": {"SendingOfreport": "Yes", "Size": 6}, "Action": [0, 0, 0, 1, 0, 2]}}, {"CriteriaSlotDescriptor": {"Alarm": "No", "OnExceed": "Yes", "OnFall": "No", "Mode": "ThresholdWithActions", "CriterionIndex": 1}, "FieldIndex": 2, "Value": 12000, "Gap": 0, "Occurence": {"ExtendedOccurences": "No", "Occurences": 1}, "Actions": {"ActDesc": {"SendingOfreport": "Yes", "Size": 2}, "Action": [0, 3]}}], "Data": null}
  1. Conf rep cause long + node descriptor:

11060050A0000641000580011830022ee000000151022ee0000001

Json output
{
 "EndPoint": 0,
 "Report": "Standard",
 "CommandID": "ConfigureReporting",
 "ClusterID": "Configuration",
 "ReportParameters": {
  "New": "Yes",
  "Reserved": 0,
  "CauseRequest": "Long",
  "SecuredIfAlarm": "No",
  "Secured": "No",
  "NoHeaderPort": "No",
  "Batch": "No"
 },
 "AttributeID": "NodePowerDescriptor",
 "AttributeType": "ByteString",
 "MinReport": {
  "Unit": "Seconds",
  "Value": 5
 },
 "MaxReport": {
  "Unit": "Minutes",
  "Value": 1
 },
 "Size": 24,
 "Cause": [
  {
   "CriteriaSlotDescriptor": {
    "Alarm": "No",
    "OnExceed": "No",
    "OnFall": "Yes",
    "Mode": "Threshold",
    "CriterionIndex": 0
   },
   "FieldIndex": 2,
   "Value": 12000,
   "Gap": 0,
   "Occurence": {
    "ExtendedOccurences": "No",
    "Occurences": 1
   }
  },
  {
   "CriteriaSlotDescriptor": {
    "Alarm": "No",
    "OnExceed": "Yes",
    "OnFall": "No",
    "Mode": "Threshold",
    "CriterionIndex": 1
   },
   "FieldIndex": 2,
   "Value": 12000,
   "Gap": 0,
   "Occurence": {
    "ExtendedOccurences": "No",
    "Occurences": 1
   }
  }
 ],
 "Data": null
}

→ To use in encoding:

{"EndPoint": 0, "Report": "Standard", "CommandID": "ConfigureReporting", "ClusterID": "Configuration", "ReportParameters": {"New": "Yes", "Reserved": 0, "CauseRequest": "Long", "SecuredIfAlarm": "No", "Secured": "No", "NoHeaderPort": "No", "Batch": "No"}, "AttributeID": "NodePowerDescriptor", "AttributeType": "ByteString", "MinReport": {"Unit": "Seconds", "Value": 5}, "MaxReport": {"Unit": "Minutes", "Value": 1}, "Size": 24, "Cause": [{"CriteriaSlotDescriptor": {"Alarm": "No", "OnExceed": "No", "OnFall": "Yes", "Mode": "Threshold", "CriterionIndex": 0}, "FieldIndex": 2, "Value": 12000, "Gap": 0, "Occurence": {"ExtendedOccurences": "No", "Occurences": 1}}, {"CriteriaSlotDescriptor": {"Alarm": "No", "OnExceed": "Yes", "OnFall": "No", "Mode": "Threshold", "CriterionIndex": 1}, "FieldIndex": 2, "Value": 12000, "Gap": 0, "Occurence": {"ExtendedOccurences": "No", "Occurences": 1}}], "Data": null}
  1. Conf Node descriptor Disposable Battery voltage:

1106005000000641000aa76005000400c800

Json output
{
 "EndPoint": 0,
 "Report": "Standard",
 "CommandID": "ConfigureReporting",
 "ClusterID": "Configuration",
 "ReportParameters": {
  "New": "No",
  "Reserved": 0,
  "CauseRequest": "No",
  "SecuredIfAlarm": "No",
  "Secured": "No",
  "NoHeaderPort": "No",
  "Batch": "No"
 },
 "AttributeID": "NodePowerDescriptor",
 "AttributeType": "ByteString",
 "MinReport": {
  "Unit": "Seconds",
  "Value": 10
 },
 "MaxReport": {
  "Unit": "Minutes",
  "Value": 10080
 },
 "Data": {
  "Size": 5,
  "CurrentPowerMode": "ONWhenIdle",
  "AvailablePowerSourceBitField": 4,
  "DisposableBatteryVoltage": 200,
  "CurrentPowerSource": "No"
 }
}

→ To use in encoding:

{"EndPoint": 0, "Report": "Standard", "CommandID": "ConfigureReporting", "ClusterID": "Configuration", "ReportParameters": {"New": "No", "Reserved": 0, "CauseRequest": "No", "SecuredIfAlarm": "No", "Secured": "No", "NoHeaderPort": "No", "Batch": "No"}, "AttributeID": "NodePowerDescriptor", "AttributeType": "ByteString", "MinReport": {"Unit": "Seconds", "Value": 10}, "MaxReport": {"Unit": "Minutes", "Value": 10080}, "Data": {"Size": 5, "CurrentPowerMode": 0, "AvailablePowerSourceBitField": 4, "DisposableBatteryVoltage": 200, "CurrentPowerSource": 0}}

Conf Node descriptor Disposable Battery voltage + Constant Voltage → To use in encoding:

{"EndPoint": 0, "Report": "Standard", "CommandID": "ConfigureReporting", "ClusterID": "Configuration", "ReportParameters": {"New": "No", "Reserved": 0, "CauseRequest": "No", "SecuredIfAlarm": "No", "Secured": "No", "NoHeaderPort": "No", "Batch": "No"}, "AttributeID": "NodePowerDescriptor", "AttributeType": "ByteString", "MinReport": {"Unit": "Seconds", "Value": 10}, "MaxReport": {"Unit": "Minutes", "Value": 10080}, "Data": {"Size": 7, "CurrentPowerMode": 0, "AvailablePowerSourceBitField": 5, "DisposableBatteryVoltage": 200,"ConstantVoltage": 400, "CurrentPowerSource": 0}}

Conf Node descriptor Constant Voltage → To use in encoding:

{"EndPoint": 0, "Report": "Standard", "CommandID": "ConfigureReporting", "ClusterID": "Configuration", "ReportParameters": {"New": "No", "Reserved": 0, "CauseRequest": "No", "SecuredIfAlarm": "No", "Secured": "No", "NoHeaderPort": "No", "Batch": "No"}, "AttributeID": "NodePowerDescriptor", "AttributeType": "ByteString", "MinReport": {"Unit": "Seconds", "Value": 10}, "MaxReport": {"Unit": "Minutes", "Value": 10080}, "Data": {"Size": 5, "CurrentPowerMode": 0, "AvailablePowerSourceBitField": 1, "ConstantVoltage": 200, "CurrentPowerSource": 0}}

FRANÇAIS


Prérequis:

Python 3.6 ou une version plus récente

  • installer dicctoxml:

    • aller dans dicttoxml-1.7.4/
    • executer dans un terminal: py setup.py install
  • installer construct:

    • aller dans construct-2.8.12/
    • executer dans un terminal: py setup.py install
  • Peut aussi être installé avec pip:

    • pip install dicttoxml==1.7.4
    • pip install construct==2.8.12

Lancer le décodage:

  • Aller dans srcWatteco/
  • Décoder une trame en xml: echo 11... | py Main.py -of xmlp
  • Décoder une trame en json: echo 11... | py Main.py -of json

Lancer l'encodage:

  • Aller dans srcWatteco/
  • Encoder un json en trame : echo {"EndPoint": 0, ...} | py Main.py -m e

Pour les exemples cf la version anglaise.

About

This codec is used to encode the data to send to Watteco sensors. And to decode the received data.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages