Categories
General VSCP

“Post is delivered” #vscp #nodered

Snow here today, quite a lot, so I am glad to have the “post is delivered sensor” so I don’t have to walk out to the postbox more than one time. So when I get the message on my phone today I am very pleased.

Yes it should be “there is” and that is changed now. But working. Yes!

I have written about this before here and here and I will probably write about this setup again as it is useful for many other areas.

I have not looked at battery voltage and signal strength before so I decided to email all events the sensor sends to me. This is simple in node-red of course

Just added the last row with a filter on just the sensors GUID.

The full flow is at the end of this post.

Now I receive six emails when the post is delivered. And I will go through them all here

Event #1

The email is

{
  "vscpHead":32864,
  "vscpClass":10,
  "vscpType":6,
  "vscpGuid":"FF:FF:FF:FF:FF:FF:FF:FE:5C:CF:7F:07:76:03:00:00",
  "vscpObId":5,
  "vscpTimeStamp":11704000,
  "vscpDateTime":"2020-10-20T10:51:17.000Z",
  "vscpData":[168,64,214,0,0]
}

which is

a temperature measurement (class=10, Type=6). The data is a bit cryptic when we need to decode it manually. But info on how to do that is here so we can try it out.

The data coding byte is 168 which is 0xA8 in hexadecimal and 0x10101000 in binary. The three leftmost bits (0b101) is the coding and in this case we have a 32-bit floating point value in byte 1,2,3,4. Bits 0,1,2 of the data coding byte is the sensor index and it is zero here so this is from sensor 0. Bits 3,4 is the unit. And if we look in the spec. we see that the unit is degrees Celsius.

The floating point value 64,214,0,0 is on MSB form and I am on a PC so it should be be 0,0,214,64. I can use a simple C program to find the floating point value

#include <stdio.h>
#include <string.h>
#include <inttypes.h>

int main() {
    uint8_t iv[4] = {0,0,214,64};
    memcpy( (uint8_t *)&fvalue, (uint8_t *)&iv, 4 );
    printf("Memconversion: %f\n", fvalue);
    return 0;
}

This will print

Memconversion: 6.687500

which is totally wrong as the temperature is around -1.5 degrees C here right now. Maybe the post bin is a very nice place to be in or maybe there is some self heating going on. Room for investigation.

Event #2

The email is

{
  "vscpHead":32864,
  "vscpClass":1040,
  "vscpType":6,   "vscpGuid":"FF:FF:FF:FF:FF:FF:FF:FE:5C:CF:7F:07:76:03:00:00",
  "vscpObId":5,
  "vscpTimeStamp":11776000,
  "vscpDateTime":"2020-10-20T10:51:17.000Z",
  "vscpData":[0,0,0,1,54,46,54,56,56,0]
}

In the VSCP Specification we find that class=1040, type=6 is also a a temperature measurement, but here as a Level II event and on string form. In the specification we see that first byte is sensor index (0), the second is the zone (0), the third byte is the sub zone (0), and the fourth byte is the unit (1). Byte 4,5,6,7,8,9 make up the string with the value which is 6.688. The zero at the end is the string termination. Not needed but often given. So again the temperature is 6.688 degrees Celsius.

Event #3

The email is

{
  "vscpHead":32864,
  "vscpClass":10,
  "vscpType":16,
  "vscpGuid":"FF:FF:FF:FF:FF:FF:FF:FE:5C:CF:7F:07:76:03:00:00",
  "vscpObId":5,
  "vscpTimeStamp":11849000,
  "vscpDateTime":"2020-10-20T10:51:17.000Z",
  "vscpData":[137,131,11,83]
}

Class=10, type=16 is a Voltage measurement. This is the battery voltage (electric potential). Again we look at the coding byte which is 137, which is 0x89 in hexadecimal and 0b10001001 in binary. Data coding is 0b100 which tells that the data is a normalized integer. For a normalized integer the second byte is the exponent of the number. Here 131 which is 0x83 in hexadecimal. Bit 7 is set which means the decimal point for the integer in the following bytes should be shifted to the left.Bits 0-5 tells how many steps, tree in this case. The integer is 0xB53 which is 2899 in decimal. Shifting the decimal point three steps to the right gives 2.899 V. And we know the battery voltage.

Event #4

The email is

{
  "vscpHead":32864,
  "vscpClass":15,
  "vscpType":6,
  "vscpGuid":"FF:FF:FF:FF:FF:FF:FF:FE:5C:CF:7F:07:76:03:00:00",
  "vscpObId":5,
  "vscpTimeStamp":11921000,
  "vscpDateTime":"2020-10-20T10:51:17.000Z",
  "vscpData":[85,45,56,54]
}

Here class=15, type=6 which is Signal strength. Again the first byte is the coding byte and is 85 which is 0x55 in hexadecimal and 0b01010101 in binary. Data coning is 0v010 which tells the rest of the bytes is a string and if we decode that we get -86 The unit bits are 0b10 (bits 5,6) and we see in the specification that this dBm. So signal strength is -86 dBm. Pretty good for a snowy day.

Event #5

The last email is

{
  "vscpHead":32864,
  "vscpClass":20,
  "vscpType":29,
  "vscpGuid":"FF:FF:FF:FF:FF:FF:FF:FE:5C:CF:7F:07:76:03:00:00",
  "vscpObId":5,
  "vscpTimeStamp":11660000,
  "vscpDateTime":"2020-10-20T10:51:16.000Z",
  "vscpData":[0,0,0]
}

Class=20 and type=29. According to the specification this is an information event telling that something has woken up. Data is index,zone,subzone and they are all set to zero as the GUID clearly tells who woke up in this case.


You may wounder about the vscpHead=32864. What is the meaning? This is a bit field (full definitions is here) giving some info about the event. In this case it tells that this event comes from a dumb node (but 15 is set). That is a node that does not have registers, a decision matrix and the other attributes of a smart node. It also have priority set to normal priority. This is selldome used in VSCP though.

The vscpObId is a channel number that end users normally does not need to care about.

Instead of manually decoding the data, the use of VSCP works would be preferred of course. It would have done the job above automatically. Bur now you know a little more about VSCP events in general.


The promised node-red flow is here

[{"id":"8387a5b3.258038","type":"vscp-tcp-in","z":"5ffcb26.533894c","name":"Localhost","host":"eaaa0283.83ca08","username":"admin","password":"secret","filter":"","keyctx":"vscp2","x":140,"y":120,"wires":[["9fe6d87d.7e56d","bee0ea0b.013a9"]]},{"id":"9fe6d87d.7e56d","type":"vscpfilter","z":"5ffcb26.533894c","vscppriority":"","vscpclass":"20","vscptype":"29","vscpguid":"FF:FF:FF:FF:FF:FF:FF:FE:5C:CF:7F:07:76:03:00:00","name":"Filter on Woken Up from mailbox","x":420,"y":120,"wires":[["b237b908.eb9ee8","e6bf6581.256c98","cb6535fa.e7dc38"]]},{"id":"b8a49e5b.388688","type":"inject","z":"5ffcb26.533894c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"Post","payloadType":"str","x":430,"y":220,"wires":[["b237b908.eb9ee8","e6bf6581.256c98"]]},{"id":"b237b908.eb9ee8","type":"function","z":"5ffcb26.533894c","name":"Define message","func":"msg = {\n payload : 'There is post to collect in the mailbox',\n topic : 'There is post',\n to : 'akhe@grodansparadis.com',\n from: 'akhe@grodansparadis.com'\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":820,"y":120,"wires":[["ccf59966.89df9"]]},{"id":"ccf59966.89df9","type":"e-mail","z":"5ffcb26.533894c","server":"mailhost.ljusnet.se","port":"25","secure":false,"tls":false,"name":"akhe@grodansparadis.com","dname":"Ljusnet","x":1000,"y":120,"wires":[]},{"id":"17d730fb.949a3f","type":"telegram sender","z":"5ffcb26.533894c","name":"telegram","bot":"42a44e6b.b2fde","x":1000,"y":220,"wires":[[]]},{"id":"e6bf6581.256c98","type":"function","z":"5ffcb26.533894c","name":"Define message","func":"\nmsg.payload = {};\nmsg.payload.chatId = \"1105118733\";\nmsg.payload.type = \"message\";\nmsg.payload.content = \"There is post to collect in the mailbox\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":820,"y":220,"wires":[["17d730fb.949a3f"]]},{"id":"cb6535fa.e7dc38","type":"function","z":"5ffcb26.533894c","name":"Define message","func":"msg.payload = \"Post has been delivered\";\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":820,"y":300,"wires":[["6d1af59f.bb754c"]]},{"id":"6d1af59f.bb754c","type":"ui_audio","z":"5ffcb26.533894c","name":"sound","group":"b5541ba5.781d38","voice":"en-GB","always":true,"x":990,"y":300,"wires":[]},{"id":"bee0ea0b.013a9","type":"vscpfilter","z":"5ffcb26.533894c","vscppriority":"","vscpclass":"","vscptype":"","vscpguid":"FF:FF:FF:FF:FF:FF:FF:FE:5C:CF:7F:07:76:03:00:00","name":"Filter on Woken Up from mailbox","x":440,"y":380,"wires":[["3bbfc1f1.3d2f36"]]},{"id":"3bbfc1f1.3d2f36","type":"e-mail","z":"5ffcb26.533894c","server":"mailhost.ljusnet.se","port":"25","secure":false,"tls":false,"name":"akhe@grodansparadis.com","dname":"Ljusnet","x":800,"y":380,"wires":[]},{"id":"eaaa0283.83ca08","type":"vscp-tcp-config-host","name":"Localhost","host":"localhost","port":"9598","timeout":"10000","interface":"","keepalive":""},{"id":"42a44e6b.b2fde","type":"telegram bot","botname":"pi11_bot","usernames":"brattberg_pi11_bot","chatids":"1234","baseapiurl":"","updatemode":"polling","pollinterval":"300","usesocks":false,"sockshost":"","socksport":"6667","socksusername":"anonymous","sockspassword":"","bothost":"","localbotport":"8443","publicbotport":"8443","privatekey":"","certificate":"","useselfsignedcertificate":false,"sslterminated":false,"verboselogging":false},{"id":"b5541ba5.781d38","type":"ui_group","name":"Temperatures","tab":"b0073866.5d3d68","order":1,"disp":true,"width":"6","collapse":false},{"id":"b0073866.5d3d68","type":"ui_tab","name":"Home","icon":"dashboard","order":2,"disabled":false,"hidden":false}]

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.