Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon! 🥇🥈🥉

Moskus

Administrator
  • Innlegg

    16 883
  • Ble med

  • Besøkte siden sist

  • Dager vunnet

    811

Alt skrevet av Moskus

  1. 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).
  2. SmartToggle.vb "Toggler" en device mellom "Off" og "On Last Level" hvis den finnes (altså er en Z-wave device). Kun mellom "Off" og "On" ellers. Parameter: 400 ... der 400 er device ref til device'n du vil toggle. Public Sub Main(ByVal input As Object) '© Moskus 2015 Dim control As String = input Dim devicevalue As Double = hs.DeviceValueEx(control) Dim capi As HomeSeerAPI.CAPIControl = Nothing If devicevalue = 0 Then 'device is off, so let's trigger "On Last Level" if it exists on the device, and just "On" capi = hs.CAPIGetSingleControl(input, True, "on last level", False, False) If capi Is Nothing Then '"On last Level" wasn't found, so we need to find "On" capi = hs.CAPIGetSingleControl(input, True, "on", False, False) End If Else 'The device is on, so let's turn it offf capi = hs.CAPIGetSingleControl(input, True, "off", False, False) End If If capi IsNot Nothing Then hs.CAPIControlHandler(capi) Else hs.WriteLog("SmartToggle", "Could not execute CAPIcontrol, it's nothing! (Input device value: " & devicevalue & ")") End If End Sub Eventet ser da slik ut:
      • 6
      • Like
  3. CloneDevice.vb Speiler status fra en device over på flere andre. Praktisk for å f.eks. kunne skru av/på/dimme et helt rom samtidig. Parameter: 100|200+201+202 ... hvor 100 er master device (typisk taklampe) og 200-202 er andre devicer, Trigges typisk av master device set to any status. Sub Main(ByVal parms As String) '© Moskus Dim input() As String = Split(parms.ToString, "|") Dim control As String = input(0).ToString Dim devs() As String = Split(input(1).ToString, "+") Dim devicevalue As Double = hs.DeviceValueEx(control) Dim CAPIcontrol As HomeSeerAPI.CAPIControl = Nothing For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(control) If devicevalue = cc.ControlValue Then CAPIcontrol = cc Exit For End If Next For Each d as String In devs Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(d) If CAPIcontrol.Label.ToLower.Contains("dim") Then If dev.Can_Dim(Nothing) Then Dim capi As HomeSeerAPI.CAPIControl = Nothing For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(d) If cc.Label = CAPIcontrol.Label Then capi = cc Exit For End If Next hs.CAPIControlHandler(capi) Else Dim off As HomeSeerAPI.CAPIControl = Nothing For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(d) If cc.Label.ToLower = "off" Then off = cc Exit For End If Next hs.CAPIControlHandler(off) End If Else Dim capi As HomeSeerAPI.CAPIControl = Nothing For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(d) If cc.Label = CAPIcontrol.Label Then capi = cc Exit For End If Next hs.CAPIControlHandler(capi) End If Next End Sub
  4. Dette scriptet brukes f.eks. hvis du vil øke lyset gradvis fra 0% til 100% over en halv time. Da trenger du et script som trigger hvert 18. sekund, og som kjører dette scriptet: IncrementLight.vb Public Sub Main(ByVal _deviceRef As Object) '© Moskus Dim deviceRef As Integer = Integer.Parse(_deviceRef) Dim deviceValue As Integer = hs.DeviceValue(deviceRef) 'Exit if the device is already at maximum, i.e. "On" If hs.CAPIGetStatus(deviceRef).Status = "On" Then Exit Sub 'Find the correct CAPI control to execute. I really miss Linq!!! For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceRef) If cc.ControlValue = (deviceValue + 1) Then 'Set the correct dim level hs.CAPIControlHandler(cc) 'We're done, so let's exit! Exit Sub End If Next End Sub IncrementLightCustom.vb Ulempen med de fleste dimmere er at de ikke er lineære. De første 1-20% gir en mye større relativt forskjell enn de siste 80-99%. Det gjør det følgende scriptet med, men du trenger en "counter" som må settes til 0 før du starter. Parameter: 100#counter name ... der 100 er device ref til lampen du skal styre, og "counter name" selvfølgelig er navnet på counteren. Public Sub Main(ByVal _deviceRefAndCounter As Object) '© Moskus Dim deviceRef As Integer = Integer.Parse(_deviceRefAndCounter.ToString.Split("#")(0)) Dim countervalue As Integer = hs.CounterValue(_deviceRefAndCounter.ToString.Split("#")(1)) Dim modifier As Integer = 4 Dim dimvalue As Integer = Math.Ceiling(countervalue ^ (modifier) / 100 ^ (modifier - 1)) 'Exit if the device is already at maximum, i.e. "On" If hs.CAPIGetStatus(deviceRef).Status = "On" Then Exit Sub 'Find the correct CAPI control to execute. I really miss Linq!!! For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceRef) If cc.ControlValue = dimvalue Then 'Set the correct dim levelQ hs.CAPIControlHandler(cc) 'We're done, so let's exit! Exit Sub End If Next End Sub IncrementLightRGB.vb Hvis man istedenfor har en RGB-stripe eller lampe, og man først vil ha lyset rødt, så gult, og deretter hvitt, kan man bruke dette. Du må endre de fire første linjene for å passe til ditt oppsett. Public Sub Main(ByVal _nothingreally As Object) '© Moskus Dim deviceR As Integer = 990 Dim deviceG As Integer = 991 Dim deviceB As Integer = 992 Dim countervalue As Integer = hs.CounterValue("Sunshine soverom") Dim modifier As Integer = 2 Dim dimvalue As Integer = Math.Ceiling(countervalue ^ (modifier) / 100 ^ (modifier - 1)) 'Exit if the device is already at maximum, i.e. "On" 'If hs.CAPIGetStatus(deviceR).Status = "On" Then Exit Sub 'Red If countervalue <= 100 Then 'Find the correct CAPI control to execute. I really miss Linq!!! For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceR) If cc.ControlValue = dimvalue Then If hs.CAPIGetStatus(deviceR).Status <> "On" Then hs.CAPIControlHandler(cc) Exit For End If Next End If 'Green If countervalue > 100 AndAlso countervalue <= 200 Then For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceG) If cc.ControlValue = countervalue - 100 Then If hs.CAPIGetStatus(deviceG).Status <> "On" Then hs.CAPIControlHandler(cc) Exit For End If Next End If If countervalue = 150 Then Dim capi As HomeSeerAPI.CAPIControl = hs.CAPIGetSingleControl(deviceB, True, "off", False, False) hs.CAPIControlHandler(capi) End If 'Blue If countervalue > 150 Then For Each cc As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(deviceB) If cc.ControlValue = countervalue - 150 Then If hs.CAPIGetStatus(deviceB).Status <> "On" Then hs.CAPIControlHandler(cc) Exit For End If Next End If End Sub Generelt oppsett av eventer:
  5. Hva er scripting? De fleste litt større systemer støtter scripting i en eller annen form. Ettersom det er så mye de forskjellige systemene kan gjøre, så er det ikke sikkert at utviklerne har tenkt på alle muligheter som er mulig å få til og legger muligheter for det inn i Event-motorene sine. Det er der scripting kommer inn. Det er en enkel måte å utvide mulighetene i hjemmeautomasjonssystemet sitt. Noen bruker python, ande LUA. HomeSeer er skrevet i .NET og bruker VB.net (og C#) som scriptspråk, og det er en stor del av grunnen til at jeg valgte HomeSeer som styringssystem. Jeg har programmert mye i VB og VB.net (og mer og mer C#), så å kunne bruke samme språk i HomeSeer er jo en enorm fordel. Når det er sagt så er jo ikke LUA så langt borte fra VB. Pr. default er ikke hele .NET biblioteket tilgjengelig som scripting, men de mest brukte funksjonene er der (og det er ikke lite bare det). Man har imidlertid mulighet til å legge til referanser selv hvis man ønsker det. Hva trenger jeg? I utgangspunktet trenger du ingenting, utenom litt kunnskap om VB, .NET og HomeSeer. Hvis du ikke har noe av dette, men likevel kan tenke deg å scripte litt så er det her en liten liste: Du må vite litt om språket generelt, hvordan man lager en variabel, hva en Sub og Function er, litt om klasser, etc. Bob Tabor dekker det meste: https://mva.microsoft.com/en-US/training-courses/vb-fundamentals-for-absolute-beginners-8297?l=3THjWMYy_4904984382 Du trenger noe å programmere i. Selve script-vinduet i HS er tungvindt, selv om det er 100% mulig. Skaff deg heller Visual Studio Community og tenScripting, så kan du scripte i Visual Studio med full IntelliSense, syntaks-korrigering, og alle andre praktiske hjelpemidler Visual Studio har å tilby (og det er ikke få). Du trenger å vite (eller i det minste finne ut) hva som er mulig i HS3, og det er ikke rent lite. I hjelp-filene står det mye om scripting, og i SDKet står det enda mer dyptgående om klasser, eventer, callbacks, etc. Men... plugins? "Hvis scripting er så genialt, hvorfor lages det plugins?" Fordi å lage plugins gir enda større frihet, selv om det er mer arbeid. I en plugin kan man bruke hele .NET biblioteket av funksjoner uten å tenke på om det er støttet ut av esken eller ei. Så hvis man skal lage et system for å lese og skrive til en server (som Fitbit-plugin'en) eller til en kaffetrakter, så er det mye lettere med en plugin der man uten videre kan opprette nye tråder, bruke LiNQ, og lage en enda tettere integrering i HS3. HST har gjort mye smart i SDKet sitt, men personlig synes jeg de utgangspunktene de hadde laget i beste fall var vanskelige å forstå. De som ønsker å se på plugins, kan istedenfor se på mitt eget pluginsample. Det finner du her: http://board.homeseer.com/showthread.php?t=177339
  6. Den primære endringen er vel grei nok. Synd at amerikanere ikke har forstått at verden er støtte enn USA, men slik har det vel vært lenge nå. Men alle bug-fixene er jeg interessert i. HS bruker jo nesten ikke minne lenger!
  7. Har kjørt beta .65 og HS3 .258 i 3 dager nå. Vanvittig bra. Minnebruken går faktisk nedover, og er nå under 90 MB. Jeg tror ikke jeg har sett sånn minnebruk siden jeg installerte HS2 i 2007...
  8. HomeSeer er oppdatert til versjon 3.0.0.258, bare start HS på nytt for å laste ned. Changelog her.
  9. Jeg kjører ikke beta i HS3 lenger, men for HStouch Server og Z-wave-plugin'en gjør jeg det, de kjører altfor safe etter min mening. Jeg kjører .61 og har ingen overflow exceptions i min logg. Dette på Linux? EDIT: Installerte .65 også. Alt fremdeles vel. Kan det være mono-relatert?
  10. Moskus

    Test

    frem til

    Hurra, dette blir gøy!
×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.