DeviceState.vb
Lar deg lagre og laste inn innstillinger for et utvalgt av enheter. Synes du at lyset er perfekt akkurat nå? Lagre det! Og hent det tilbake senere.
Sub Main(ByVal not_used As Object)
'By Moskus, August 2015
'Set up a new config.
'Specify devices between the brackets below (comma separated):
Dim devices() As Integer = {342, 872, 873}
'Specify a configuration name. This is used when calling "Save" and "Load" later.
Dim config_name As String = "Bedroom"
'Creating initial ini file and store it in a list
Dim lst As New System.Collections.Generic.List(Of DeviceState)
For Each d As Integer In devices
Dim dS As New DeviceState
dS.deviceRef = d
dS.deviceValue = hs.DeviceValueEx(d)
lst.Add(dS)
Next
'Write the list to file
SaveToFile(config_name, lst)
End Sub
Sub Save(ByVal config_name As String)
'Get the device list
Dim lst As System.Collections.Generic.List(Of DeviceState) = LoadFromFile(config_name)
'Get the current device values for each device
For Each d As DeviceState In lst
d.deviceValue = hs.DeviceValueEx(d.deviceRef)
Next
'Store the list
SaveToFile(config_name, lst)
End Sub
Sub Load(ByVal config_name As String)
'Get the device list
Dim lst As System.Collections.Generic.List(Of DeviceState) = LoadFromFile(config_name)
For Each d As DeviceState In lst
'Find the correct CAPI based on device value...
Dim CAPIcontrol As HomeSeerAPI.CAPIControl = Nothing
For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(d.deviceRef)
If d.deviceValue = cc.ControlValue Then
CAPIcontrol = cc
Exit For
End If
Next
'... And execute it
hs.CAPIControlHandler(CAPIcontrol)
Next
End Sub
Function LoadFromFile(ByVal config_name As String) As System.Collections.Generic.List(Of DeviceState)
Dim lst As New System.Collections.Generic.List(Of DeviceState)
Dim filename As String = "DeviceState_" & config_name & ".ini"
Dim lines() As String = hs.GetINISectionEx("Devices", filename)
For Each line As String In lines
Dim deviceRef As Integer = line.Split("=")(0).Trim
Dim deviceValue As Double = line.Split("=")(1).Trim
lst.Add(New DeviceState(deviceRef, deviceValue))
Next
Return lst
End Function
Sub SaveToFile(ByVal config_name As String, ByVal stateList As System.Collections.Generic.List(Of DeviceState))
Dim filename As String = "DeviceState_" & config_name & ".ini"
For Each d As DeviceState In stateList
hs.SaveINISetting("Devices", d.deviceRef, d.deviceValue, filename)
Next
End Sub
<Serializable>
Public Class DeviceState
Public Property deviceRef As Integer
Public Property deviceValue As Double
Public Sub New()
End Sub
Public Sub New(ByVal _deviceRef As Integer, ByVal _deviceValue As Double)
Me.deviceRef = _deviceRef
Me.deviceValue = _deviceValue
End Sub
End Class
Oppsett:
Det er to måter å lage et oppsett på.
1. Redigere Main()-sub'en med å liste opp device'referansene i krølleparantesene i denne linjen:
Dim devices() As Integer = {342, 872, 873}
og navnet i denne linjen:
Dim config_name As String = "Bedroom"
... og så kjøre scriptet med å kalle Main-sub'en.
2. Lag en INI-fil i \Config-mappen på dette formatet:
[Devices]
devRef1=devValue1
devRef2=devValue2
devRef3=devValue3
Navngi den "DeviceState_DittVariabelNavn.ini" der du bytter ut DittVariabelNavn med noe mer beskrivende. Det er dette du skal kalle senere.
Mitt testeksempel ser slik ut for DeviceState_Bedroom.ini:
[Devices]
342=53
872=25
873=39
Når det er gjort er det bare å lage to eventer. Et for lagring og et for tilbakestilling. Lagring av lys gjøres med å kjøre scriptet "DeviceStates.vb" med funksjon "Save" og parameter satt til DittVariabelNavn, slik:
Tilbakestilling er helt likt, men da bytter du ut "Save" med "Load".
Det er da mulig å lage veldig enkle "scenes" med å kopiere en ini-fil og gi den et nytt navn, som f.eks. "Bedroom-Morning", "Bedroom-Sexytime", "Bedroom-Night", "Bedroom-Off", og så videre. Bare redigere ini-filene med passende verdier, og restore som det passer deg.
Så lenge teknologien som styrer lyset lagrer devicevalue og bruker CAPI til kontroll (og det gjør vel alle skulle jeg mene), så vil dette fungere. Jeg tror til og med det fungerer med andre enheter (som f.eks. Squeezebox Play/Pause, og så videre).