Skip to content

bengentree/mysa

Repository files navigation

mysa

Very unofficial Go SDK for interacting with Mysa Smart Thermostats.

Ported from mysa-js-sdk by @bourquep.

Installation

go get github.com/bengentree/mysa

Usage

package main

import (
    "context"
    "fmt"
    "log"
    "log/slog"

    "github.com/bengentree/mysa"
)

func main() {
    ctx := context.Background()

    // Create a new client (logging disabled by default)
    client, err := mysa.NewClient(ctx)
    // Or with logging enabled:
    // client, err := mysa.NewClient(ctx, mysa.WithLogger(slog.Default()))
    if err != nil {
        log.Fatal(err)
    }
    defer client.Close(ctx)

    // Login with your Mysa credentials
    if err := client.Login(ctx, "email@example.com", "password"); err != nil {
        log.Fatal(err)
    }

    // Get all devices
    devices, err := client.GetDevices(ctx)
    if err != nil {
        log.Fatal(err)
    }

    for id, device := range devices.DevicesObj {
        fmt.Printf("Device: %s (%s)\n", *device.Name, id)
    }

    // Get device states (temperature, setpoint, etc.)
    states, err := client.GetDeviceStates(ctx)
    if err != nil {
        log.Fatal(err)
    }

    for id, state := range states.DeviceStatesObj {
        if state.SensorTemp != nil {
            fmt.Printf("Device %s: %.1f°C\n", id, state.SensorTemp.V)
        }
    }

    // Set temperature (in Celsius)
    setpoint := 21.0
    if err := client.SetDeviceState(ctx, "device-id", &setpoint, nil, nil); err != nil {
        log.Fatal(err)
    }
}

Features

  • Authenticate with Mysa via AWS Cognito
  • Get device list and configuration
  • Get current device states (temperature, humidity, setpoint)
  • Set device temperature
  • Real-time updates via MQTT
  • Session persistence (save/load sessions)

Real-time Updates

// Start receiving real-time updates
if err := client.StartRealtimeUpdates(ctx, "device-id"); err != nil {
    log.Fatal(err)
}

// Listen for events
go func() {
    for status := range client.Events.StatusChanged {
        fmt.Printf("Temperature: %.1f°C, Setpoint: %.1f°C\n",
            status.Temperature, status.SetPoint)
    }
}()

Session Persistence

// Save session after login
session := client.Session()
if err := session.SaveToFile("session.json"); err != nil {
    log.Fatal(err)
}

// Load session later
session, err := mysa.LoadSessionFromFile("session.json")
if err != nil {
    log.Fatal(err)
}

client, err := mysa.NewClient(ctx, mysa.WithSession(session))

Logging

The SDK uses Go's standard log/slog package. Logging is disabled by default.

// Enable logging with default logger
client, err := mysa.NewClient(ctx, mysa.WithLogger(slog.Default()))

// Or use a custom JSON logger
logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
    Level: slog.LevelDebug,
}))
client, err := mysa.NewClient(ctx, mysa.WithLogger(logger))

License

MIT

About

🔆 Mysa smart thermostat client

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages