Skip to content

Instantly share code, notes, and snippets.

@bradfitz
Created August 17, 2018 04:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bradfitz/b52d90d88c6d4f9736749ab8a964c3a2 to your computer and use it in GitHub Desktop.
Save bradfitz/b52d90d88c6d4f9736749ab8a964c3a2 to your computer and use it in GitHub Desktop.
Home Assistant wrapper
package main
import (
"flag"
"fmt"
"log"
"os"
"os/exec"
"path/filepath"
"syscall"
"time"
)
const remSerialPath = "/remserial/remotezstick"
func main() {
log.Printf("hasswrap starting.")
flag.Parse()
errc := make(chan error, 1)
go func() {
errc <- fmt.Errorf("remserial ended: %v", runRemoteSerial())
}()
go func() {
if err := waitRemSerial(); err != nil {
errc <- err
}
log.Printf("remote serial up. starting home assistant.")
errc <- fmt.Errorf("home assistant ended: %v", runHomeAssistant())
}()
go cleanLoop()
log.Fatal(<-errc)
}
func cleanLoop() {
const ozwLog = "/config/OZW_Log.txt"
for {
var st syscall.Stat_t
if err := syscall.Stat(ozwLog, &st); err != nil {
log.Printf("stat %s: %v", ozwLog, err)
} else {
size := st.Blocks * 512 // not Size; want un-sparse space only
log.Printf("stat %s: %d blocks, %d bytes (%d size)", ozwLog, st.Blocks, size, st.Size)
if size > 10<<20 {
err := syscall.Truncate(ozwLog, 0)
log.Printf("truncate %s: err=%v", err)
}
}
time.Sleep(time.Minute)
}
}
func waitRemSerial() error {
t0 := time.Now()
for i := 0; i < 20; i++ {
if _, err := os.Lstat(remSerialPath); err == nil {
return nil
}
time.Sleep(100 * time.Millisecond)
}
return fmt.Errorf("remote serial device %s didn't appear in %v", remSerialPath, time.Since(t0).Round(100*time.Millisecond))
}
func runRemoteSerial() error {
dir := filepath.Dir(remSerialPath)
if fi, err := os.Stat(dir); err != nil {
return fmt.Errorf("statting serial device dir: %v", err)
} else if !fi.IsDir() {
return fmt.Errorf("dir %v is: %v", dir, fi.Mode())
}
cmd := exec.Command("/usr/local/bin/remserial", "-r", "zpi.ward.fitzpat.com", "-p", "23000",
"-l", remSerialPath, "/dev/ptmx")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
func runHomeAssistant() error {
cmd := exec.Command("python", "-m", "homeassistant", "--config", "/config")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment