jens-maus/cuxd

View on GitHub
common/cuxd/extra/toggle.tcl

Summary

Maintainability
Test Coverage
#!/bin/tclsh
#
# Version 1.1 * (C) '2020 by Uwe Langhammer
# script to toggle switches/dimmer
#
# usage: toggle.tcl [-v] [-ms] <interface.address:ch.DP> [<LEVEL>] [<RAMPTIME0>] [<RAMPTIME1>] [<ONTIME>]
#

load tclrega.so

set state_file "/var/cache/cuxd/state_"

proc getopt {_argv name {_var ""}} {
  upvar 1 $_argv argv $_var var
  set pos [lsearch -regexp $argv ^$name]
  if {$pos>=0} {
    if {$_var != ""} {
      set var 1
    }
    set argv [lreplace $argv $pos $pos]
    incr ::argc -1
    return 1
  }
  return 0
}

set verbose [getopt argv -v]
set ms [getopt argv -ms]

if { $argc < 1 } {
  puts "USAGE: toggle.tcl \[-v\] \[-ms\] <interface.address:ch.DP> \[<LEVEL>\] \[<RAMPTIME0>\] \[<RAMPTIME1>\] \[<ONTIME>\]"
  exit 1
}

set address [lindex $argv 0]
set state [lindex $argv 1]
set set_ramptime0 [lindex $argv 2]
set set_ramptime1 [lindex $argv 3]
set set_ontime [lindex $argv 4]

if { $argc >= 2 } {
  if {[string is double $state] && ($state > 0)} {
  } else {
    set state 0
  }
} else {
  set state 0
}

if { 1 } {
  set level 0
  if {[regexp -- {\.[^\.]+\:\d+\.LEVEL$} $address]} {
    set level 1
  }
  regsub -- {\.[^\.]+$} $address "" addr

  append cmd "var ret;"

  append state_file $address
  if { [ file exists $state_file ] && ([ expr [ clock seconds ] - [ file mtime $state_file ] ] < 4) } {
    set fp [ open $state_file "r" ]
    gets $fp data
    close $fp
    if { $data } {
      append cmd "if (true) \{"
    } else {
      append cmd "if (false) \{"
    }
  } else {
    append cmd "if (dom.GetObject(\"$address\").Value()) \{"
  }

  if {[string is double $set_ramptime0] && ($set_ramptime0 > 0)} {
    if { $ms } { set set_ramptime0 [expr $set_ramptime0 / 1000.0] }
    puts "ON_TIME ${set_ramptime0}s"
    append cmd "dom.GetObject(\"$addr.RAMP_TIME\").State(\"$set_ramptime0\");"
  }

  append cmd "dom.GetObject(\"$address\").State(0);"
  append cmd "ret = 0;"
  append cmd "\} else \{"

  if {[string is double $set_ramptime1] && ($set_ramptime1 > 0)} {
    if { $ms } { set set_ramptime1 [expr $set_ramptime1 / 1000.0] }
    puts "ON_TIME ${set_ramptime1}s"
    append cmd "dom.GetObject(\"$addr.RAMP_TIME\").State(\"$set_ramptime1\");"
  }

  if {[string is double $set_ontime] && ($set_ontime > 0)} {
    if { $ms } { set set_ontime [expr $set_ontime / 1000.0] }
    puts "ON_TIME ${set_ontime}s"
    append cmd "dom.GetObject(\"$addr.ON_TIME\").State(\"$set_ontime\");"
  }

  if { $level } {
    if { $state } {
      append cmd "dom.GetObject(\"$address\").State($state);"
    } else {
      append cmd "dom.GetObject(\"$addr.OLD_LEVEL\").State(1);"
    }
  } else {
    append cmd "dom.GetObject(\"$address\").State(1);"
  }
  append cmd "ret = 1;"
  append cmd "\}"

  if { $verbose } { puts $cmd }

  array set values [rega_script $cmd]

  if { [info exists values(ret)] && ( $values(ret) != "null" ) } {
    puts "OK"
#    puts $values(ret)
    set fp [ open $state_file "w" ]
    puts -nonewline $fp $values(ret)
    close $fp
    exit 0
  } else {
    puts "ERROR"
    exit 1
  }
}