Skip to content
Snippets Groups Projects
README.md 4.93 KiB
Newer Older
  • Learn to ignore specific revisions
  • Sukru Senli's avatar
    Sukru Senli committed
    # usp-js
    
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    Helper library for easy usp communication using mqtt over tcp or ws.
    
    
    - [API documentation for usp-js](https://iopsys.se/usp-js/index.html)
    - [BBF's USP reference documentation](https://usp-data-models.broadband-forum.org/tr-181-2-13-0-usp.html)
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    # Installation
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    `npm install usp-js`
    
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    # Usage
    
    
    To connect provide necessary info to the default export. (Values will differ depending on setup)
    
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    ```javascript
    
    const connect = require("usp-js").default;
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    
    const run = async () => {
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      // Connect
      const usp = await connect({
    
        host: "my.ip.here",
        username: "username",
        password: "password",
        port: 90001,
        protocol: "ws",
        fromId: "from::id",
        toId: "to::id",
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    
      // Get property
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      await usp.get("Device.WiFi.").then(console.log);
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    
      // Disconnect
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      await usp.disconnect();
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    };
    
    run();
    ```
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    
    # API
    
    - Connect
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    ```javascript
    // options are based on https://github.com/mqttjs/MQTT.js#mqttconnecturl-options
    
    // they additionaly require fromId and toId, more info: url.here
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    const usp = await connect(options);
    
      - get object - all object end with a dot
    
      ```javascript
      await usp.get("Device.Time.");
      // => {
      //   "CurrentLocalTime": "2020-12-15T12:33:19Z",
      //   "Enable": true,
      //   ...
      // }
      ```
    
      - get property
    
      ```javascript
      await usp.get("Device.Time.CurrentLocalTime"); // => "2020-12-15T12:33:19Z"
      ```
    
      - get multiple paths
    
      ```javascript
      await usp.get(["Device.WiFi.Radio.1.", "Device.WiFi.Radio.2."]);
      // => [
      // { ... },
      // { ... }
      // ]
      ```
    
      - get using pattern
    
      ```javascript
      await usp.get('Device.Ethernet.Interface.[Alias=="WAN"].CurrentBitRate'); // => 0
      ```
    
      - resolve references in get
    
      ```javascript
      await usp.get("Device.WiFi.Radio.1.").then(usp.resolve); // => { ... }
      // or if deeper resolution is needed (be careful when using level, going above 3 often causes an infinite reference loop)
      await usp
        .get("Device.WiFi.Radio.1.")
        .then((msg) => usp.resolve(msg, 3 /* level - defaults to 1 */)); // => { ... }
      ```
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    
    - Set
    
      - set object - does not need to have all attributes, but some may be required (check USP Reference)
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      ```javascript
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      await usp.set("Device.WiFi.Radio.1.", { Name: "radio-1" }); // => void
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      - set object with allowPartial and required attributes
    
      ```javascript
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      await usp.set("Device.WiFi.Radio.1.", { Name: { required: true, value: "radio-1" }, allowPartial: true }); // => void
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      - set property
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      ```javascript
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      await usp.set("Device.WiFi.Radio.1.Name", "radio-1"); // => void
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    - Operate
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      ```javascript
    
      const [ping, cleanPing] = await usp.operate("Device.IP.Diagnostics.IPPing()");
    
      const results = await ping({ Host: "iopsys.eu" });
      await cleanPing(); // clears ping subscription (optional)
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      ```
    
    - Add
    
      - add with no arguments - adds a new default object
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      ```javascript
    
      await usp.add("Device.NAT.PortMapping."); // => "Device.NAT.PortMapping.3."
    
      - add with multiple responses
    
      ```javascript
      await usp.add("Device.IP.Interface.*.IPv4Address."); // => ['Device.IP.Interface.1.IPv4Address.2.', ... ]
      ```
    
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      - add with arguments - adds a new object with provided values
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      ```javascript
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      await usp.add("Device.NAT.PortMapping.", {
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
        Description: "webserver1-set",
        ExternalPort: "80",
        Protocol: "TCP",
        Interface: "Device.IP.Interface.1",
        Enable: "true",
        InternalClient: "192.168.1.125",
        InternalPort: "5000",
      }); // => "Device.NAT.PortMapping.4."
      ```
    
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
      - add with with allowPartial and required attributes
    
      ```javascript
      await usp.add("Device.NAT.PortMapping.", {
        allowPartial: true,
        Description: {
          required: true,
          value: "webserver1-set",
        }
        ExternalPort: "80",
        Protocol: "TCP",
        Interface: "Device.IP.Interface.1",
        Enable: "true",
        InternalClient: "192.168.1.125",
        InternalPort: "5000",
      }); // => "Device.NAT.PortMapping.4."
      ```
    
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    - Delete
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    ```javascript
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    await usp.del("Device.NAT.PortMapping.4."); // => void
    
    Marin Karamihalev's avatar
    Marin Karamihalev committed
    
    
    - Get Supported DM
      
    ```javascript
    await usp.supportedDM("Device.WiFi.")
    ```
    - Get Supported Protocols
      
    ```javascript
    await usp.supportedProto("Device.WiFi.")
    ```
    
    - Get Instances
    
    ```javascript
    await usp.instances("Device.WiFi.")
    ```
    
    - Subscribe
    
    ```javascript
    const clearSub = await usp.subscribe({ id: '1234', notif: 'ObjectCreation', reference: 'Device.NAT.PortMapping.' }, console.log)
    ```
    
     - optional second argument to callback gives access to full message.
      ```javascript
      await usp.subscribe({ id: '1234', notif: 'ObjectCreation', reference: 'Device.NAT.PortMapping.' }, (_, fullMsg) => console.log(fullMsg) )
      ```
    
    - On (WIP)
    
      Id can be a string or a regexp. Messages, generally, have their id in the form COMMAND@random_string (i.e. NOTIFY@12345).
      (Note: does not add subscription to USP model, instead allows for internal monitoring of received messages)
      Optional second argument to callback gives access to full message.
    
    ```javascript
    const clear = usp.on(/NOTIFY.*/, (data, msg) => console.log({ data, msg }))
    ```