npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

locam

v1.0.3

Published

A library for local control of Kasa Smart cameras.

Downloads

10

Readme

💾 Installation

This is a Node.js module available through the npm registry.

$ npm i -S locam

🔌 Quick Start

const Camera = require('locam');

const c = new Camera({
    auth: {
        username: process.env.USERNAME, 
        password: process.env.PASSWORD
    },
    camera: {
        ip: '10.0.0.2',
        port: 10443,
        name: 'Camera_Name'
    },
    logging: true
});

// Get Camera Info
c.send(c.Status.info('get')).then(d => {
    console.log(d);
}).catch(err => {
    console.error(error);
});

// Move to Preset 2
c.send(c.Actions.preset('set', 2)).then(d => {
    console.log(d);
}).catch(err => {
    console.error(error);
});

// Enable Motion Tracking
c.send(c.Settings.motionTracking('set', true)).then(d => {
    console.log(d);
}).catch(err => {
    console.error(error);
});

// Get Night Vision Setting
c.send(c.Settings.nightVision('get')).then(d => {
    console.log(d);
}).catch(err => {
    console.error(error);
});

// --- Alternative Structure ---
// Define command once as vars and use vars in code
const nightVisionOff = c.Settings.nightVision('set', 'day');
const disableMotionTracking = c.Settings.motionTracking('set', false);

// ...
await c.send(nightVisionOff);
// ...
await c.send(disableMotionTracking);
// ...

🔮 Features

  • Provides access to the majority of functionality and settings
  • Can send additional commands that are not included in this library
  • Easy integration into other projects (custom dashboards, automations, monitoring, logging, etc)

👓 Transparency

  • Should not be considered 'production ready' or used in critical implementations
  • Subject to unpredictable changes which can break this implementation without notice
  • Some security concerns & known vulnerabilities may exist and should be reviewed prior to using the package

🛠 Setup & Getting Started

Authentication

The current authentication approach used has some security concerns which should be reviewed and acknowledged.

The current implementation relies generating a token based on the username & password used for the Kasa Smart app.

It is imperative to store the values somewhere secure but accessible by your code (see env.js or .env sections for general ideas)

env.js (optional)

This file may be created to store persistant environmental variables.

This file must be added .gitignore & never published. See security concerns for more details.

Example of storing information in this file:

module.exports = { 
  username: 'user',
  password: 'pass'
}

Example of getting information from this file:

const {username, password} = require('./env.js');
console.log(username, password);

.env (optional)

This is a commonly used way to store persistant environmental variables.

In your code, you can use the dotenv package to access the stored values at runtime.

This file must be added .gitignore & never published. See security concerns for more details.

Example of storing information in this file:

USERNAME=user
PASSWORD=pass

Example of getting information from this file:

require('dotenv').config()
console.log(process.env.USERNAME, process.env.PASSWORD);

💡 Methods

Settings (camera.Settings.<func()>)

power(type, enable)

  • Get or set the state of the camera power
  • type: 'get' or 'set'
  • enable: bool

recordVideo(type, enable)

  • Get or set the state of the local 24/7 recording
  • type: 'get' or 'set'
  • enable: bool

detectMotion(type, enable)

  • Get or set the state of motion detection
  • type: 'get' or 'set'
  • enable: bool

detectMotionSensitivity(type, sensitivity)

  • Get or set the level the sensitivity of motion detection
  • type: 'get' or 'set'
  • sensitivity: 'low', 'medium', 'high'

detectMotionTime(type, dayTime, nightTime)

  • Get or set the state of min duration of motion required
  • type: 'get' or 'set'
  • dayTime: integer
    • milliseconds
  • nightTime: integer
    • milliseconds

detectBabyCry(type, enable)

  • Get or set the state of baby crying detection
  • type: 'get' or 'set'
  • enable: bool

detectPerson(type, enable)

  • Get or set the state of person detection
  • type: 'get' or 'set'
  • enable: bool

recordAudio(type, enable)

  • Get or set the state of audio recording
  • type: 'get' or 'set'
  • enable: bool

detectAudio(type, enable)

  • Get or set the state of audio detection
  • type: 'get' or 'set'
  • enable: bool

detectAudioSensitivity(type, sensitivity)

  • Get or set the level the sensitivity of audio detection
  • type: 'get' or 'set'
  • sensitivity: 'low', 'medium', 'high'

motionTracking(type, enable)

  • Get or set the state of motion tracking
  • type: 'get' or 'set'
  • enable: bool

patrol(type, enable)

  • Get or set the state of camera patrolling
  • type: 'get' or 'set'
  • enable: bool

format(type)

  • Format the SD card
  • type: 'set'

resolution(type, resolution)

  • Get or set the resolution
  • type: 'get' or 'set'
  • resolution: '2560x1440', '1920x1080', '1280x720'

rotation(type, degree)

  • Get or set the state of image rotation
  • type: 'get' or 'set'
  • degree: 0 or 180

nightVision(type, state)

  • Get or set the state of infrared lights
  • type: 'get' or 'set'
  • state: 'auto', 'day', 'night'
    • day = always off
    • night = always on

statusLED(type, enable)

  • Get or set the state of the camera LED
  • type: 'get' or 'set'
  • enable: bool

doNotDisturb(type, enable)

  • Get or set the state of do not disturb
  • type: 'get' or 'set'
  • enable: bool

time(type, time)

  • Get or set the time of the camera
  • type: 'get' or 'set'
  • time: integer
    • epoch time

timezone(type, timezone, area)

  • Get or set the timezone of the camera
  • type: 'get' or 'set'
  • timezone: string
    • 'UTC-05:00'
  • area: string
    • 'America/New_York'

Actions (camera.Actions.<func()>)

preset(type, num)

  • Move camera to a preset location
  • type: 'set'
  • num: 1, 2, 3, 4

move(type, dir, speed)

  • Move the camera in a direction
  • type: 'set'
  • dir: 'left', 'up', 'right', 'down'
  • speed: integer

position(type, x, y)

  • Get or set the current position of the camera
  • type: 'get' or 'set'
  • x: integer
  • y: integer

stop(type)

  • Stop the camera from moving
  • type: 'set'

stream(type, view)

Not implemented yet

  • Get the live stream of the camera
  • Display in a window or return the buffer
  • type: 'get'
  • view: boolean

streamToFile(type, seconds)

Not implemented yet

  • Save the live stream of the camera to a file
  • type: 'get'
  • seconds: integer

streamToStream(type, format)

Not implemented yet

  • Restream the live stream of the camera in another format
  • type: 'get'
  • format: 'hls' or 'rtmp'

vodStream(type, view)

Not implemented yet

  • Get the VOD recording stream of the camera
  • Display in a window or return the buffer
  • type: 'get'
  • view: boolean

speak(type, audioStream)

Not implemented yet

  • Send an audio stream to the camera speaker
  • type: 'set'
  • audioStream: buffer

snapshot(type)

  • Get the link to the latest camera thumbnail image
  • type: 'get'

events(type, startTime, endTime)

  • Get the events detected by the camera within the time window specified
  • type: 'get'
  • startTime: integer
    • epoch time
  • endTime: integer
    • epoch time

Status (camera.Status.<func()>)

info(type)

  • Generic information about the camera
  • type: 'get'

card(type)

  • Information about the SD card
  • type: 'get'

cardEnc(type)

  • Information about the SD card encryption
  • type: 'get'

cloud(type)

  • Information about the connection to the cloud servers
  • type: 'get'

time(type)

  • Complete time configuration of the device
  • type: 'get'

presets(type)

  • List of stored preset locations
  • type: 'get'

vod(type, playerId)

  • Get basic information about the VOD status
  • type: 'get'
  • playerId: 'abc123'

👤 Author

Stephen Mendez

🤝 Contributing

Contributions, issues and feature requests are welcome!Feel free to check issues page. You can also take a look at the contributing guide.

😃 Show your support

Give a ⭐️ if this project helped you!

Consider making a donation of any amount!

📝 License

Copyright © 2021 Stephen Mendez This project is MIT licensed.


Kasa is a registered trademark of TP-LINK Research America Corporation.

Part of this README was generated with ❤️ by readme-md-generator