Skip to content
Åke Hedman edited this page Aug 20, 2021 · 27 revisions

Raspberry Pi node pi4

This is a Raspberry Pi 2B (1GB) version 1.1 running Raspberry Pi OS (Debian Buster) with the latest VSCP daemon installed and among other things have a Frankfurt RS-232 module that connects to a CAN bus that is run to our kitchen on the upper floor of our house. Here there are some nodes that control a refrigerator and a fridge.

The Frankfurt RS-232 module is connected to the VSCP daemon with the level I/CANAL CAN4VSCP driver. The configuration file vscpd.json for the VSCP daemon looks like this

{
  "runasuser": "vscp",
  "debug": 18446744073709551615,
  "guid": "25:00:00:00:00:00:00:00:00:00:00:00:06:00:00:00",
  "servername": "The VSCP daemon",
  "classtypedb": "/var/lib/vscp/vscpd/vscp_events.sqlite3",
  "maindb": "/var/lib/vscp/vscpd/vscp.sqlite3",
  "discoverydb": "/var/lib/vscp/vscpd/vscp.sqlite3",
  "vscpkey": "/etc/vscp/vscp.key",
  "logging": {
    "file-enable-log": true,
    "file-log-level": "debug",
    "file-pattern": "[vscp: %c] [%^%l%$] %v",
    "file-path": "/var/log/vscp/vscpd.log",
    "file-max-size": 5242880,
    "file-max-files": 7,
    "console-enable-log": true,
    "console-log-level": "debug",
    "console-pattern": "[vscp: %c] [%^%l%$] %v"
  },
  "mqtt": {
    "bind": "",
    "host": "192.168.1.7",
    "port": 1883,
    "mqtt-options": {
      "tcp-nodelay": true,
      "protocol-version": 311,
      "receive-maximum": 20,
      "send-maximum": 20,
      "ssl-ctx-with-defaults": 0,
      "tls-ocsp-required": 0,
      "tls-use-os-certs": 0
    },
    "user": "vscp",
    "password": "secret",
    "clientid": "the-vscp-daemon-pi4",
    "publish-format": "json",
    "subscribe-format": "auto",
    "qos": 1,
    "bcleansession": false,
    "bretain": false,
    "keepalive": 60,
    "bjsonmeasurementblock": true,
    "topic-daemon-base": "vscp-daemon/{{guid}}/",
    "topic-drivers": "drivers",
    "topic-discovery": "discovery",
    "reconnect": {
      "delay": 2,
      "delay-max": 10,
      "exponential-backoff": false
    },
    "tls": {
      "cafile": "",
      "capath": "",
      "certfile": "",
      "keyfile": "",
      "pwkeyfile": "",
      "no-hostname-checking": true,
      "cert-reqs": 0,
      "version": "",
      "ciphers": "",
      "psk": "",
      "psk-identity": ""
    },
    "will": {
      "topic": "vscp-daemon/{{srvguid}}/will",
      "qos": 1,
      "retain": true,
      "payload": "VSCP Daemon is down"
    },
    "subscribe": [
      {
        "topic": "vscp/pi4",
        "qos": 0,
        "v5-options": 0,
        "format": "auto"
      }
    ],
    "bescape-pub-topics": true,
    "user-escapes": {
      "escape1": "value1",
      "escape2": "value2"
    },
    "publish": [
      {
        "topic": "vscp/{{guid}}",
        "qos": 0,
        "retain": false,
        "format": "json"
      }
    ],
    "v5": {
      "user-properties": {
        "prop1": "value",
        "prop2": "value"
      }
    }
  },
  "drivers": {
    "level1": [
      {
        "enable": true,
        "name": "can4vscp",
        "config": "/dev/vscp_serial0",
        "flags": 2147483648,
        "translation": 2,
        "path": "/var/lib/vscp/drivers/level1/vscpl1drv-can4vscp.so.1.1.1",
        "guid": "25:00:00:00:00:00:00:00:00:00:00:00:06:01:00:00",
        "mqtt": {
          "bind": "",
          "host": "192.168.1.7",
          "port": 1883,
          "mqtt-options": {
            "tcp-nodelay": true,
            "protocol-version": 311,
            "receive-maximum": 20,
            "send-maximum": 20,
            "ssl-ctx-with-defaults": 0,
            "tls-ocsp-required": 0,
            "tls-use-os-certs": 0
          },
          "user": "vscp",
          "password": "secret",
          "clientid": "vscp-level1-can4vscp-driver",
          "publish-format": "json",
          "subscribe-format": "auto",
          "qos": 1,
          "bcleansession": false,
          "bretain": false,
          "keepalive": 60,
          "bjsonmeasurementblock": true,
          "reconnect": {
            "delay": 2,
            "delay-max": 10,
            "exponential-backoff": false
          },
          "tls": {
            "cafile": "",
            "capath": "",
            "certfile": "",
            "keyfile": "",
            "pwkeyfile": "",
            "no-hostname-checking": true,
            "cert-reqs": 0,
            "version": "",
            "ciphers": "",
            "psk": "",
            "psk-identity": ""
          },
          "will": {
            "topic": "vscp-daemon/{{srvguid}}/drivers/{{ifguid}}/will",
            "qos": 1,
            "retain": true,
            "payload": "vscpl2drv-energy-p1 driver down"
          },
          "subscribe": [
            {
              "topic": "vscp/{{guid}}/can4vscp",
              "qos": 0,
              "v5-options": 0,
              "format": "auto"
            }
	  ],
          "user-escapes": {
            "host": "pi4",
            "drv": "can4vscp"
          },
          "publish": [
            {
              "topic": "vscp/{{guid}}/{{class}}/{{type}}/{{nickname}}/{{data[0]}}",
              "qos": 0,
              "retain": false,
              "format": "json"
            }
          ],
          "v5": {
            "user-properties": {
              "prop1": "value",
              "prop2": "value"
            }
          }
        }
      }
    ],
    "level2": [
    ]
  }
}

The file is pretty standard. Full debugging is used. The GUID is set to

25:00:00:00:00:00:00:00:00:00:00:00:06:00:00:00

connection is made to a local in-house Linux server. Publishing is done in JSON format. Subscription accept all formats (json, string, xml, binary). Server events are published on topic

vscp-daemon/{{guid}}/

which will translate to

vscp-daemon/25:00:00:00:00:00:00:00:00:00:00:00:06:00:00:00/

driver info will be published to

vscp-daemon/25:00:00:00:00:00:00:00:00:00:00:00:06:00:00:00/drivers

discovery information will be published to

vscp-daemon/25:00:00:00:00:00:00:00:00:00:00:00:06:00:00:00/discovery

last will is published at

vscp-daemon/25:00:00:00:00:00:00:00:00:00:00:00:06:00:00:00/will

Server events (like server heartbeast and capability events) are published on topic

vscp-daemon/25:00:00:00:00:00:00:00:00:00:00:00:06:00:00:00

The entry

"bjsonmeasurementblock": true

will add a the measurement block to json coded events if the event is a measurement.

All pretty standard.

There is only one driver enabled. The can4vscp level I driver. It uses the udev device /dev/vscp_serial0 which is a serial USB adapter that connects to the Frankfurt CAN4VSCP module and thru it the CAN bus.

"translation": 2

is set for the driver. This will translate received Level I measurement events to Level II measurement events to (CLASS2.MEASUREMENT_STR )[https://grodansparadis.github.io/vscp-doc-spec/#/./class2.measurement_str]. Translation settings are described here.

Published events are on json form and published on the topic

vscp/{{guid}}/{{class}}/{{type}}/{{nickname}}/{{data[0]}}

which will be escaped with real values on publish time as below.

  • {{guid}} will be replaced by the events GUID.
  • {{class}} will be replaced by the events class code. It is possible to use the symbolic name instead.
  • {{type}} will be replaced by the events type code. It is possible to use the symbolic name instead.
  • {{nickname}} will be replaced with the remote nodes id (nickname).
  • {{data[0]}} will be replaced with data byte zero which for a level II measurement is the sensor index for the sensor the measurement comes from.

A full list of topic escapes are here.

VSCP nodes on Pi4

The following events are published to the MQTT demo servers demo.vscp.org and test.mosquitto.org (see VSCP-Demo-server). Events are publish to a topic that is built in the following way

vscp/guid/class/type/nodeid/data byte 0

For measurements data byte 0 will be the same as the sensorindex for the sensor originating the measurement value. For example the fridge temperature will be published on topic

vscp/25:00:00:00:00:00:00:00:00:00:00:00:06:01:00:01/1040/6/1

So subscribing to this topic on the demo server will get you live fridge temperature values. The kitch3en temperature on the other hand is on the sensor with index=4 so subscribing to topic

vscp/25:00:00:00:00:00:00:00:00:00:00:00:06:01:00:01/1040/6/4

will get you the live temperatures in our kitchen.

GUID Description
25:00:00:00:00:00:00:00:00:00:00:00:06:00:00:00 This is the Raspberry Pi itself. Heartbeats on similar use this GUID.
25:00:00:00:00:00:00:00:00:00:00:00:06:01:00:00 GUID for Level I CAN4VSCP driver.
25:00:00:00:00:00:00:00:00:00:00:00:06:01:00:01 GUID for node Kelvin NTC10K module inside fridge with nickname=1.

There is three temperature sensors.
Sensorindex=0 for the on board temperature sensor.
Sensorindex=1 for the fridge temperature sensor.
Sensorindex=2 for the compressor temperature sensor.
Sensorindex=4 for kitchen temperature sensor.
25:00:00:00:00:00:00:00:00:00:00:00:06:01:00:02 GUID for node with nickname=2. Paris relay module controlling relays for workshop lights.
25:00:00:00:00:00:00:00:00:00:00:00:06:01:00:03 GUID for node with nickname=3. Paris relay module controlling relay in the fridge.
25:00:00:00:00:00:00:00:00:00:00:00:06:01:00:04 GUID for node with nickname=4. Beijing I/O module in refrigerator. Controls compressor and light on refrigerator.
25:00:00:00:00:00:00:00:00:00:00:00:06:01:00:05 GUID for node with nickname=5, Kelvin NTC10K in refrigerator.
There is three temperature sensors.
Sensorindex=0 for on board sensor.
Sensorindex=1 for upper cabin.
Sensorindex=2 for lower cabin.
FF:FF:FF:FF:FF:FF:FF:FE:B8:27:EB:0A:11:62:00:00 Heartbeat from Pi4
FF:FF:FF:FF:FF:FF:FF:FE:B8:27:EB:0A:11:62:00:01 CPU temperature of Pi4
FF:FF:FF:FF:FF:FF:FF:FE:B8:27:EB:0A:11:62:00:02 GPU Temperature of Pi4
FF:FF:FF:FF:FF:FF:FF:F7:D4:81:CA:E1:4A:AA:00:00 Readings from a Silicon Labs Bluetooth Sensorpuck. RSSI, Humidity, Temperature, Ambient light, UV index Battery voltage in our server room.
Note that this GUID is fully transparently based on the Bluetooth id of the Sensorpuck.
Software is here https://github.com/grodansparadis/vscp-python-sensorpuck
Clone this wiki locally