From 2760b8be032c87acbe52d747fe7a028290056b85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20Kub=C3=AD=C4=8Dek?= Date: Thu, 10 Feb 2022 18:35:49 +0100 Subject: [PATCH] Add original source codes --- docs/api_description.md | 158 ++++++++++++++++++++++ docs/application_example.md | 253 ++++++++++++++++++++++++++++++++++++ docs/contact.md | 7 + docs/img/Eledio_logo.png | Bin 0 -> 9420 bytes docs/index.md | 9 ++ mkdocs.yml | 13 ++ 6 files changed, 440 insertions(+) create mode 100644 docs/api_description.md create mode 100644 docs/application_example.md create mode 100644 docs/contact.md create mode 100644 docs/img/Eledio_logo.png create mode 100644 docs/index.md create mode 100644 mkdocs.yml diff --git a/docs/api_description.md b/docs/api_description.md new file mode 100644 index 0000000..9832c36 --- /dev/null +++ b/docs/api_description.md @@ -0,0 +1,158 @@ +--- +summary: Documentation site of Python Eledio library +authors: + - Richard Kubicek +date: 2019-09-27 +--- +# Description of API for python-eledio library +This description allow to you easly write your own python script. + +This script you can use for control of your Eledio devices. This sript you can upload to your [__Eledio Gateway__](https://www.eledio.com/en/hardware/) and control your gateways and your [__Eledio Extendres__](https://www.eledio.com/en/hardware/) which you want control from gateway. + +This library is preinstalled in your [Eledio Gateway](https://www.eledio.com/en/hardware/). You can start programming, after unpacking. + + +## Necessary parts +Each major drive script in python for your application must be made up with some necessary parts. + +* [device description in _json_ file](#device-description-in-json-file) + +* [import of library components](#import-of-library-components) + +* [load of _json_ file](#load-of-json-file) + +### Device description in _json_ file +* this file is for hardware abstraction layer to linux +* you are able to used your own names of identifiers, eg. you can rename _Temperature_ to _OutsideTemperature_ +* every name of identifiers must consist only with English alphabet characters, without spaces and other punctuation +* if you need some reaclculation of readout values, you can use prepared values __a__ and __b__, with are parts of equation __y=a*x+b__, where __x__ is readout value from device, __y__ is value which you obtain in python script, eg. if you need temeperature in degree of fahrenheit, you can place __a=1.8__ and __b=32__ (which corresponds of equation ```T[°F] = T[°C]*1.8 + 32```) +#### Example of _json_ file, can be named as config.json +``` +{ + "devices": { + "unit-40": { + "bus": "i2c", + "address": 40, + "datacrc": 9718, + "compilermagic": 4006394777 + } + }, + "identifiers": { + "gatewayHWEvent": { + "unit": "unit-40", + "partition": "sdp", + "offset": 0, + "entrysize": 2, + "depth": 0, + "type": 1, + "prescaler": 0, + "a": 1, + "b": 0, + "datatype": "u16", + "srq": 0 + }, + "gatewayHWState": { + "unit": "unit-40", + "partition": "sdp", + "offset": 2, + "entrysize": 2, + "depth": 0, + "type": 1, + "prescaler": 0, + "a": 1, + "b": 0, + "datatype": "u16" + }, + "RE1Voltage": { + "unit": "unit-40", + "partition": "sdp", + "offset": 4, + "entrysize": 2, + "depth": 0, + "type": 1, + "prescaler": 0, + "a": 0.01, + "b": 0, + "datatype": "s16" + }, + "Temperature": { + "unit": "unit-40", + "partition": "sdp", + "offset": 6, + "entrysize": 2, + "depth": 0, + "type": 1, + "prescaler": 0, + "a": 0.01, + "b": 0, + "datatype": "s16" + }, + "gatewayHWAction": { + "unit": "unit-40", + "partition": "adp", + "offset": 0, + "entrysize": 2 + }, + "RE1": { + "unit": "unit-40", + "partition": "adp", + "offset": 2, + "entrysize": 1 + }, + "RE3": { + "unit": "unit-40", + "partition": "adp", + "offset": 3, + "entrysize": 1 + } + } +} +``` + +### Import of library components +* consist with few of import statements, which are necessary for correct function + +``` +import json # necessary for description json file; required + +from eledio import Eledio # basic functionality; required +from eledio.component.mpu.i2c import SMBus # communication interface with linux; required +from eledio.device.pcu import PcuFactory # access to variables and components of base board, e.g: relay outputs, digital inputs, ...; required +from eledio.device.mpu import MpuFactory # access to variables and components of linux board, e.g.: wifi signal rssi, status LED color, ... +from eledio.device.srq import Srq # interrupt system for quick access to variables which need intermediate handle, e.g.: RF433 receiver + +``` + +### Load of _json_ file +* this part is required before fist try of attempt to variables with names form config _json_ part +#### Basic example of device registration +``` +eledio = Eledio() +eledio.register_device_factory("i2c", PcuFactory(SMBus(0))) + +# repeat for every configuration file +with open('config.json') as f: + eledio.append_config(json.load(f)) +``` +## Readout values from the peripherals - sensors, to linux +Everytime, you want to read all of variables, e.g.: temperatures, digital input states, sensors values, ... you must to call ```eledio.load_inputs()``` + +After this calling, you can access to variables by their symbloc names in dict access. +For example: +``` +eledio.load_inputs() + +temperature = eledio["Temperature"] # this statement put value of temperature after processing of linear equation (a and b coeficients) to the variable temperature + +voltage = eledio["RE1Voltage"] # this statement put value of RMS voltage on relay 1 to variable voltage +``` + +## Put new values to the peripherals - actuators, connected to the hardware +For relay, digital outputs you are able to set states True/False. Used logic of every component is written in component description. +``` +eledio["RE1"] = True # switch on relay 1 +eledio["RE3"] = False # switch off relay 3 + +eledio.store_outputs() +``` +After setting values for all of dict ```eledio``` parts, which you want to set, you need to call command ```eledio.store_outputs()```, which send that values to real hardware. diff --git a/docs/application_example.md b/docs/application_example.md new file mode 100644 index 0000000..0d04229 --- /dev/null +++ b/docs/application_example.md @@ -0,0 +1,253 @@ +--- +summary: Application example of Python Eledio library +authors: + - Richard Kubicek +date: 2019-09-06 +--- +# Example of usages +There you can find some examples, how to use python-eledio library in your Eledio devices. + +## State LED, buzzer and watchdog control +### Configuration _json_ file +File name: _mpu-config.json_ +``` +{ + "devices": { + "mpu-dev": { + "bus": "mpu" + } + }, + "identifiers": { + "mpuWifiRssi": { + "unit": "mpu-dev", + "parameter": "wifi-rssi" + }, + "mpuInternalTemperature": { + "unit": "mpu-dev", + "parameter": "temperature" + }, + "mpuCpuPercent": { + "unit": "mpu-dev", + "parameter": "cpu-percent" + }, + "mpuLed": { + "unit": "mpu-dev", + "parameter": "led" + }, + "mpuBeeper": { + "unit": "mpu-dev", + "parameter": "beeper" + }, + "mpuWatchdog": { + "unit": "mpu-dev", + "parameter": "watchdog" + } + } +} +``` +### Usage +``` +import json + +from eledio import Eledio +from eledio.component.mpu.i2c import SMBus +from eledio.device.mpu import MpuFactory + +if __name__ == "__main__": + eledio = Eledio() + eledio.register_device_factory("mpu", MpuFactory()) + + with open('mpu-config.json') as f: + eledio.append_config(json.load(f)) + + eledio["mpuLed"] = (0x40, 0x00, 0x00) # set color of state LED in (R, G, B) format + eledio["mpuBeeper"] = (1500, 10) # after calling store_outputs() switch on beeper on frequency 1500 Hz for 1s (first parameter is frequency in Hz, second parameter is duration in hundred ms) + + ''' + Warning, next statement is dangerous, it couse restart of linux machine (watchdog). + This function is good to use when you have your development complete, and you know, that you communicate with components and devices lower then every x second. + ''' + eledio["mpuWatchdog"] = 120 # after calling store_outputs() this statement couse reset of linux every 120 seconds. If there is any communication with devicese, timeout is restarted. + + eledio.store_outputs() +``` +## WiFi RSSI, linux CPU utilization +Use [same _json_](#configuration-json-file) file as in previous example. +### Usage +``` +import json + +from eledio import Eledio +from eledio.component.mpu.i2c import SMBus +from eledio.device.mpu import MpuFactory + +if __name__ == "__main__": + eledio = Eledio() + eledio.register_device_factory("mpu", MpuFactory()) + + with open('mpu-config.json') as f: + eledio.append_config(json.load(f)) + + eledio.load_inputs() + + rssi = eledio["mpuWifiRssi"] # place to variable rssi, WiFi signal RSSI + utilization = eledio["mpuCpuPercent"] # place to variable utilitation, linux CPU utilization +``` +## SRQ/IRQ handler +If you want to used quick access to variables like received code from RF433 control, you can use SRQ handler. + +Inside SRQ handler, in this example function ```handle_srq```, you received dictionary of eledio identifiers and their new value after SRQ. +### Configuration _json_ file +File name: _map.json_ +``` +{ + "devices": { + "unit-40": { + "bus": "i2c", + "address": 40, + "datacrc": 43200, + "compilermagic": 4006394777 + } + }, + "identifiers": { + "gatewayHWEvent": { + "unit": "unit-40", + "partition": "sdp", + "offset": 0, + "entrysize": 2, + "depth": 0, + "type": 1, + "prescaler": 0, + "a": 1, + "b": 0, + "datatype": "u16", + "srq": 0 + }, + "gatewayHWState": { + "unit": "unit-40", + "partition": "sdp", + "offset": 2, + "entrysize": 2, + "depth": 0, + "type": 1, + "prescaler": 0, + "a": 1, + "b": 0, + "datatype": "u16" + }, + "rf433": { + "unit": "unit-40", + "partition": "sdp", + "offset": 4, + "entrysize": 4, + "depth": 0, + "type": 1, + "prescaler": 0, + "a": 1, + "b": 0, + "datatype": "u32", + "srq": 1 + }, + "gatewayHWAction": { + "unit": "unit-40", + "partition": "adp", + "offset": 0, + "entrysize": 2 + } + } +} +``` +### Usage +``` +import json + +from eledio import Eledio +from eledio.component.mpu.i2c import SMBus +from eledio.device.mpu import MpuFactory + +def handle_srq(identifiers): + """ + User handling of SRQ (called in context of eledio.wait_events) + :param identifiers: dictionary of eledio identifiers and their new value after SRQ + :return: + """ + print("Service requests!", identifiers) + +if __name__ == "__main__": + eledio = Eledio() + eledio.register_device_factory("i2c", PcuFactory(SMBus(0))) + eledio.register_srq(Srq(), handle_srq()) + + # repeat for every configuration file + with open('map.json') as f: + eledio.append_config(json.load(f)) + + while True: + # load state of inputs and outputs + eledio.load_inputs() + + # do something else or wait some time + eledio.wait_events(1.0) +``` +## Error handler +In runtime and while you develop your solution, there could rise some errors. You can catch them by definition of _error handler_. +### Usage +In this example _error handler_ is represented by function ```handler_error```. +``` +import json + +from eledio import Eledio +from eledio.component.mpu.i2c import SMBus +from eledio.device.pcu import PcuFactory +from eledio.device.mpu import MpuFactory +from eledio.device.srq import Srq + + +def handle_srq(identifiers): + """ + User handling of SRQ (called in context of eledio.wait_events) + :param identifiers: dictionary of eledio identifiers and their new value after SRQ + :return: + """ + print("Service requests!", identifiers) + + +def handle_error(src, ex): + """ + Handle error inside eledio library + :param src: + :param ex: + :return: + """ + print(src, ex) + + +if __name__ == "__main__": + eledio = Eledio() + eledio.register_device_factory("i2c", PcuFactory(SMBus(0))) + eledio.register_device_factory("mpu", MpuFactory()) + eledio.register_srq(Srq(), handle_srq) + eledio.error_handler = handle_error + + # repeat for every configuration file + with open('config.json') as f: + eledio.append_config(json.load(f)) + + with open('mpu-config.json') as f: + eledio.append_config(json.load(f)) + + while True: + # load state of inputs and outputs + eledio.load_inputs() + + # manipulate with inputs and outputs by identifier + # e.g. + # print(eledio["test1"]) + # eledio["test2"] = True + + # apply final value to hardware + eledio.store_outputs() + + # do something else or wait some time + eledio.wait_events(1.0) +``` diff --git a/docs/contact.md b/docs/contact.md new file mode 100644 index 0000000..7b91300 --- /dev/null +++ b/docs/contact.md @@ -0,0 +1,7 @@ +# Contact + +If you have any question please contact us on email: [eledio@eledio.com](mailto:%20eledio@eledio.com) + +WWW: [eledio.com](https://eledio.com) + +tel.: +420 **724 328 130** diff --git a/docs/img/Eledio_logo.png b/docs/img/Eledio_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..437df05e018676a7607e2ed46394462ba91f6675 GIT binary patch literal 9420 zcmaKSby!r z-DjWuV>eH3CimW%bLO0xGxyGU-zZgOc|2??Y$PNkJcTzh?~#y@s}cWGFwqgeoukVQ zhyq|KsU(SnR1=SLXM%<}M>l;ZFM}u%pBw46KtzG%^hVbeAp!byAWJc4dLb@ixG5;f zVr&4=u|Pb&zlJ-Jke(qa$Vh52`e-7g-JOhve`#(6XG>{cF zu1-f^mQ;|*qRA3g;AkR4=_{GFs=tM}vt+hOp}a?90LaKbGr!zJ&jB z&LpQjPaMK~(}mg&{jtb3Crb#B1h8A|Nj@0ij5IRsSL`Qf}^?#xJU7_9=o{XEUCIRN z(6Gj*QiJKAZ6itM)`h<92FH4zJ$Rph*(GW;do?*{=Od`O^L~ z!adq(?Bka$?Bj#~omv7EF;;3TdLEoxCO%#izF7bw?DE9XL4|GCMi4 zoS_ox{o}ulk}$W7g{+@2Qu!C6Ce(9W@}PLl|KTqS^22bP#OD^hZo~J2BP3#^S)X=xzQgAz@PjE%w89JdC7r(FpfIo1?X@(3H`8}>j@a!3UBaK4PL?rF zh+6y!2nXS~ewvtODt%Urtd$kB{OE->bid%JA(+ z#;e9|tL{8)Lw?YkZOnPk&~&k0g3$U6)ZpdAew-jak=SwS2_yR+qd z<<%P6`|UZ-(~}{{83a4>aHit~F)!mj-qJpN`=MMoJ58~;l2kb`hbOdhM!Os@;6sL{ z*KtpyJp*?1GfX&_aqh>45zetap%HR?uJd)U_LQGlZn>_U#&NcXgQG~`IhTtgD5mPG z_PK-#`ascvl1>X>`Rd!U2ZTp{1aXWFP2dvWQM;+Qd&FWd%$WS;ee#7I4bB0tVWHfg zI0_kf$#H`799d3HJo=$qz3w+%8p|K!6Dmm-&oHI##=3eszDj_qAd1h#VpBHc)#|M{ zt+y{-4qCb))C8>ovLU)4qOaF)KL^utrCy%?{di3SqJ!?MBi?t;+X;zph0$ z3;?dRE-Weu;%-!W*}nInZY;%1A?nQE)-sX_NYgLa3p2P0y#6wWO2 zS}!dxcW|w#DoH%mHr%kHN!`b1#>gm6blvALe|Ye;3h3O&%kuLh7a7m)ZWP?Ae)x@1 zwp^=ell_d39gJEj;5~L_+V}=d5z06DK~0r|;@Mg2N`mh#;awREZRYmhpF6(72q#!< z^s(3lJdmC14F%9+;)Pw5=8a3$w`s){7&|bVFL+x{-4r&>fm5M<`-FG9W#Zln#W^ff z*@$qoBdwl43TB|2N$&}SC`P8{(%0DE$w=C0Oy=A{bJeF_>qS3?A(j;~gBA?nPph}% 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 A6951J literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..f1d0cde --- /dev/null +++ b/docs/index.md @@ -0,0 +1,9 @@ +# Python Eledio library documentation + +![Eledio logo](img/Eledio_logo.png) + +Welcome to Eledio library documentation pages + +## Note + +__This library and documantation can be aplied only for devices from Eledio ecosystem__ diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..d96eef8 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,13 @@ +site_name: Python Eledio library +nav: + - Home: index.md + - API description: api_description.md + - Application example: application_example.md + - Contact: contact.md +theme: + name: readthedocs + highlightjs: true + hljs_languages: + - python +copyright: Eledio © 2019 +site_description: Documentation site of Python Eledio library