Go library (rscp) and command line utility (e3dc) to communicate with a E3DC system implementing the RSCP (Remote Storage Control Protocol).
Please be gentle with me, this is my first real go project and it's bigger than I thought ;)
There is still a lot to improve to be a good reusable library, but most works for my specific usecase using it as a command line utility.
Contributions are very welcome, see also the check TODO or search in the code for TODO:
comments.
All arguments can also be set as E3DC_
prefixed environment variable or in a config file like:
host 127.0.0.1
user myuser
password mypassword
key mykey
See cmd/example for a small example with different requests and responses.
Request sent, is always last argument or can be piped through stdin
as json string.
See the examples below for more information.
*Note: top element has always to be an array*
*Note: these examples assume you have the default .config
file setup or exported the environment variables.*
*Note: all example use the default output format, check the help ./e3dc -help
for other formats.*
-
Short tag only notation just request some information
./e3dc '[["EMS_REQ_START_MANUAL_CHARGE",0]]' | jq
Output:
{ "EMS_START_MANUAL_CHARGE": true }
-
Short tag only notation just request some information
./e3dc '["INFO_REQ_MAC_ADDRESS", "INFO_REQ_UTC_TIME"]' | jq
Output:
{ "INFO_MAC_ADDRESS": "00:00:00:00:00:00", "INFO_UTC_TIME": "1970-01-01T00:00:00.000000Z" }
-
Tuple notation of tag's to request information
./e3dc '[["INFO_REQ_MAC_ADDRESS"], ["INFO_REQ_UTC_TIME"]]' | jq
Output:
{ "INFO_MAC_ADDRESS": "00:00:00:00:00:00", "INFO_UTC_TIME": "1970-01-01T00:00:00.000000Z" }
-
Tuple notation of tag's and values to send information (data type is inferred by the tag)
./e3dc '[["EMS_REQ_START_MANUAL_CHARGE", 3000]]' | jq
Output:
{ "EMS_START_MANUAL_CHARGE": true }
-
Tuple notation of tag's and values to send information (with explicit data type)
Note: data type of the tag can be overriden by the user
./e3dc '[["INFO_REQ_MAC_ADDRESS","None",""], ["INFO_REQ_UTC_TIME"]]' | jq
Output:
{ "INFO_MAC_ADDRESS": "00:00:00:00:00:00", "INFO_UTC_TIME": "1970-01-01T00:00:00.000000Z" }
- more testing
- more documentation
- check the generic data type logic (i.e. pointer vs value in interface), this should do a pro ;)
-
cmd/e3dc
- read config file (security)
- read from environment variables (security)
- streamline logging
- optional experimental mode which accepts any custom message (including tag, datatype and value)
- implement optional (by flag) pair output (same as the tuple input without datatype)
-
rscp
- cleanup API
- probably expose
Message
as interface and make the struct internal (would allow to move the complete cmd/e3dc specific json stuff out)
- probably expose
- streamline logging
- client: improve implementation to make it stable for keeping stable and connected when used in a service
- move
cmd/e3dc
specific json marshalling out ofrscp
to command line utilitycmd/e3dc
- move
cmd/e3dc
specific json unmarshaling out ofrscp
to command line utilitycmd/e3dc
- cleanup API