Populært innlegg Moskus Skrevet 20. februar 2017 Populært innlegg Skrevet 20. februar 2017 Nå er det mulig å styre en varmekilde med en vilkårlig temperatursensor og en vilkårlig varmekilde (av/på). Jeg har lovet i lengre tid å slippe script-pakken min, men det har vært litt mer utfordrende å lage en fungerende frontend. Nå har jeg imidlertid hoppet bukk over den problemstillingen og har flyttet innstillingene fra selve root-devicen og over i en tradisjonell ini-fil. Det gjør det lettere å endre alle innstillingene, selv om det er et stykke fra å være ideelt. Merk: Script-pakken er testet, men må vurderes som en beta-versjon. Egenskaper: "Auto", automatisk modus: Temperatur hentes ut fra et eller to oppsatte programmer. Programmene kan bruke ferdigdefinerte temperaturer eller egendefinerte. "Manual", manuell temperatur: justeres med nedtrekksboks og knapper for + og -) "High" og "Low" for hurtigvalg av forhåndsdefinerte "Schedule" og "AlternativeSchedule" kan byttes på f.eks. med Fridager.vb-scriptet (eller en vilkårlig annen On/Off virtuell device). Foreløpige begrensninger: Fungerer foreløpig ikke på Zee 1 eller 2. Begrensning i mono gjør at Enums ikke fungerer (visstnok). Jeg kan imidlertid unngå enums med litt omskriving (selv om det er veldig praktisk), så det kommer i en ny versjon. Nedtrekksboksen for manuell temperaturvalg setter ikke "Mode" til "Manual" automatisk (begrensning i scripting, kan ikke, så vidt jeg vet sette opp return CAPI-kall i script). + og - knappene gjør imidlertid dette helt fint. Oppsett 1. Først finn device Ref/IDene til både devicen for temperatursensoren og devicen for av/på bryteren til varmekilden (ovnen?). Device Ref står øverst på "Advanced"-tab'en etter at du har trykket på en device (eller i URLen som dukker opp når du holder musepekeren over linken til devicen). 2. Lag et event som du kaller "Termostat setup" (f.eks), sett trigger til "This Event is manually triggered". Legg til en Action som er "Run a Script", og trykk så på knappen "Edit, og skriv inn "VirtualThermostat.vb" (filnavnet er VELDIG viktig) og trykk OK. 3. Nå kollapser scriptet, så vi utvider det igjen og trykker på det røde flyet : . I scriptboksen (det store blanke feltet med Sub Main.... etc) fjerner du alt og kopierer inn scriptet under: Spoiler '© Moskus 2017 'Version 0.0.1 Private scriptName As String = "VirtualThermostat" Private scriptFile As String = scriptName & ".vb" Public Sub Main(ByVal rootDeviceRef As Object) 'Devices: 'Root: Heating, Cooling 'Mode: Manual, High, Low, Off 'Thermostat: Range 5 - 40, step 0.5 'Temperature: Adjustet for location End Sub Private Enum Modes Off = 0 Manual = 1 Low = 2 High = 3 Auto = 4 End Enum Private Enum ThermostatDeviceType Thermostat_Root = 0 Thermostat_Mode = 1 Thermostat_Setpoint = 2 Thermostat_Temperature = 3 End Enum Public Sub UpdateConfig(ByVal input As Object) Dim rootDeviceRef As Integer = CInt(input.ToString.Split("|")(0)) Dim s As New ThermostatSettings(hs, rootDeviceRef) s.Load(input.ToString.Split("|")(1)) s.Save(hs, rootDeviceRef) End Sub Public Sub Setup(ByVal inputString As Object) 'HeaterDeviceReference=76,ExternalTemperatureSensorRef=77 Dim useFahrenheit As Boolean = hs.GetINISetting("Settings", "gGlobalTempScaleF", "False", "settings.ini") Try Dim SVpair As HomeSeerAPI.VSPair Dim VGpair As HomeSeerAPI.VGPair '============= 'Root device 'Mode device '============= Dim rootRef As Integer = hs.NewDeviceRef("Thermostat mode") Dim rootDevice As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(rootRef) rootDevice.Location(hs) = scriptName rootDevice.Location2(hs) = scriptName rootDevice.Device_Type_String(hs) = ThermostatDeviceType.Thermostat_Mode.ToString rootDevice.DeviceType_Set(hs) = New HomeSeerAPI.DeviceTypeInfo rootDevice.Status_Support(hs) = True rootDevice.Can_Dim(hs) = False hs.SaveEventsDevices() rootDevice.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.SHOW_VALUES) rootDevice.MISC_Clear(hs, HomeSeerAPI.Enums.dvMISC.STATUS_ONLY) rootDevice.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.NO_LOG) For i As Integer = 0 To 4 Dim value As Modes = i SVpair = New HomeSeerAPI.VSPair(HomeSeerAPI.ePairStatusControl.Status) SVpair.PairType = HomeSeerAPI.VSVGPairType.SingleValue SVpair.Value = CInt(value) SVpair.Status = value.ToString hs.DeviceVSP_AddPair(rootRef, SVpair) VGpair = New HomeSeerAPI.VGPair VGpair.PairType = HomeSeerAPI.VSVGPairType.SingleValue VGpair.Set_Value = CInt(value) Select Case CInt(value) Case Is = Modes.Off VGpair.Graphic = "images/HomeSeer/contemporary/off.gif" Case Is = Modes.Manual VGpair.Graphic = "images/HomeSeer/contemporary/yellow.png" Case Is = Modes.Low VGpair.Graphic = "images/HomeSeer/contemporary/blue.png" Case Is = Modes.High VGpair.Graphic = "images/HomeSeer/contemporary/red.png" Case Is = Modes.Auto VGpair.Graphic = "images/HomeSeer/contemporary/green.png" End Select hs.DeviceVGP_AddPair(rootRef, VGpair) hs.DeviceScriptButton_AddButton(rootRef, value.ToString, CInt(value), scriptFile, "ModeButtonPress", CInt(value), 1, CInt(value) + 1, 1) Next 'Storing settings in ini file Dim s As New ThermostatSettings(inputString.ToString) s.Save(hs, rootRef) 'Setting up initial schedule hs.SaveINISetting("Schedule", "6:00", "High", scriptName & "_" & rootRef & ".ini") hs.SaveINISetting("Schedule", "8:00", "Low", scriptName & "_" & rootRef & ".ini") hs.SaveINISetting("Schedule", "16:00", "High", scriptName & "_" & rootRef & ".ini") hs.SaveINISetting("Schedule", "22:00", "Low", scriptName & "_" & rootRef & ".ini") 'Settign up initial alternative schedule hs.SaveINISetting("AlternativeSchedule", "9:00", "High", scriptName & "_" & rootRef & ".ini") hs.SaveINISetting("AlternativeSchedule", "23:00", "Low", scriptName & "_" & rootRef & ".ini") '============= 'Setpoint device '============= Dim setpointRef As Integer = hs.NewDeviceRef("Thermostat setpoint") Dim setpointDevice As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(setpointRef) setpointDevice.Location(hs) = scriptName setpointDevice.Location2(hs) = scriptName setpointDevice.Device_Type_String(hs) = ThermostatDeviceType.Thermostat_Setpoint.ToString setpointDevice.DeviceType_Set(hs) = New HomeSeerAPI.DeviceTypeInfo setpointDevice.Status_Support(hs) = True setpointDevice.Can_Dim(hs) = False hs.SaveEventsDevices() setpointDevice.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.SHOW_VALUES) setpointDevice.MISC_Clear(hs, HomeSeerAPI.Enums.dvMISC.STATUS_ONLY) setpointDevice.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.NO_LOG) Dim tempStart As Double = 5 Dim tempEnd As Double = 35 Dim forStep As Double = 0.5 Dim scale As String = "C" If useFahrenheit Then tempStart = 41 tempEnd = 95 forStep = 1 scale = "F" End If For i As Double = tempStart To tempEnd Step forStep SVpair = New HomeSeerAPI.VSPair(HomeSeerAPI.ePairStatusControl.Both) SVpair.PairType = HomeSeerAPI.VSVGPairType.SingleValue SVpair.Value = i SVpair.Status = i & " °" & scale SVpair.Render = HomeSeerAPI.Enums.CAPIControlType.Values SVpair.Render_Location.Row = 1 SVpair.Render_Location.Column = 1 SVpair.Render_Location.ColumnSpan = 1 hs.DeviceVSP_AddPair(setpointRef, SVpair) Next If useFahrenheit Then hs.SetDeviceValueByRef(setpointRef, 64, False) Else hs.SetDeviceValueByRef(setpointRef, 17.5, False) End If hs.DeviceScriptButton_AddButton(setpointRef, "-", 200, scriptFile, "SetpointButtonPress", ScriptParm:=200, Row:=1, Column:=2, ColumnSpan:=1) hs.DeviceScriptButton_AddButton(setpointRef, "+", 201, scriptFile, "SetpointButtonPress", ScriptParm:=201, Row:=1, Column:=3, ColumnSpan:=1) VGpair = New HomeSeerAPI.VGPair VGpair.PairType = HomeSeerAPI.VSVGPairType.Range VGpair.RangeStart = 0 VGpair.RangeEnd = 1000 VGpair.Graphic = "images/HomeSeer/contemporary/Thermometer-50.png" hs.DeviceVGP_AddPair(setpointRef, VGpair) '============= 'Temperature device '============= Dim roomTempRef As Integer = hs.NewDeviceRef("Thermostat room temp") Dim roomTempDevice As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(roomTempRef) roomTempDevice.Location(hs) = scriptName roomTempDevice.Location2(hs) = scriptName roomTempDevice.Device_Type_String(hs) = ThermostatDeviceType.Thermostat_Temperature.ToString roomTempDevice.DeviceType_Set(hs) = New HomeSeerAPI.DeviceTypeInfo roomTempDevice.Status_Support(hs) = True roomTempDevice.Can_Dim(hs) = False hs.SaveEventsDevices() roomTempDevice.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.SHOW_VALUES) roomTempDevice.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.STATUS_ONLY) roomTempDevice.MISC_Set(hs, HomeSeerAPI.Enums.dvMISC.NO_LOG) SVpair = New HomeSeerAPI.VSPair(HomeSeerAPI.ePairStatusControl.Status) SVpair.PairType = HomeSeerAPI.VSVGPairType.Range SVpair.RangeStart = -1000 SVpair.RangeEnd = 1000 SVpair.RangeStatusSuffix = " °" & scale SVpair.RangeStatusDecimals = 1 hs.DeviceVSP_AddPair(roomTempRef, SVpair) VGpair = New HomeSeerAPI.VGPair VGpair.PairType = HomeSeerAPI.VSVGPairType.Range VGpair.RangeStart = -1000 VGpair.RangeEnd = 1000 VGpair.Graphic = "images/HomeSeer/contemporary/Thermometer-90.png" hs.DeviceVGP_AddPair(roomTempRef, VGpair) 'Save devices hs.SaveEventsDevices() 'Associating devices rootDevice.Relationship(hs) = HomeSeerAPI.Enums.eRelationship.Parent_Root rootDevice.AssociatedDevice_Add(hs, setpointRef) rootDevice.AssociatedDevice_Add(hs, roomTempRef) setpointDevice.Relationship(hs) = HomeSeerAPI.Enums.eRelationship.Child setpointDevice.AssociatedDevice_Add(hs, rootRef) roomTempDevice.Relationship(hs) = HomeSeerAPI.Enums.eRelationship.Child roomTempDevice.AssociatedDevice_Add(hs, rootRef) 'Setting up events Dim eventRef As Integer = hs.NewEventGetRef("Thermostat " & rootRef, "Virtual Thermostat", "") hs.EventSetRecurringTrigger(eventRef, New TimeSpan(0, 5, 0), False, True) hs.AddActionRunScript(eventRef, "VirtualThermostat.vb", "CheckTemperature", rootRef) hs.WriteLog("Virtual Thermostat", "New thermostat created successfully!") Catch ex As Exception hs.WriteLog("Virtual Thermostat", "Error creating root device: " & ex.Message) End Try End Sub Public Sub ModeButtonPress(ByVal input As Object) Dim rootDeviceRef As Integer = input(0) Dim value As Modes = input(1) Dim s As New ThermostatSettings(hs, rootDeviceRef) 'Updating the mode device hs.SetDeviceValueByRef(rootDeviceRef, CInt(value), True) 'Updating the temperature device Select Case value Case = Modes.Off TurnOff(rootDeviceRef) Case Is = Modes.Low hs.SetDeviceValueByRef(GetChildReference(rootDeviceRef, ThermostatDeviceType.Thermostat_Setpoint), s.TemperatureLow, True) Case Is = Modes.High hs.SetDeviceValueByRef(GetChildReference(rootDeviceRef, ThermostatDeviceType.Thermostat_Setpoint), s.TemperatureHigh, True) Case Is = Modes.Auto Dim temp As Double = GetSetpointFromSchedule(rootDeviceRef) hs.SetDeviceValueByRef(GetChildReference(rootDeviceRef, ThermostatDeviceType.Thermostat_Setpoint), temp, True) End Select If value > Modes.Off Then CheckTemperature(rootDeviceRef) End Sub Public Sub SetpointButtonPress(ByVal input As Object) Dim setpointDeviceRef As Integer = input(0) Dim value As Integer = input(1) 'Get the current setpoint value Dim devValue As Double = hs.DeviceValueEx(setpointDeviceRef) 'Set the new setpoint value Select Case value Case = 200 'Down hs.SetDeviceValueByRef(setpointDeviceRef, devValue - 0.5, True) Case 201 'Up hs.SetDeviceValueByRef(setpointDeviceRef, devValue + 0.5, True) End Select 'Find the root device (the setpoint device is only associated to the root device) Dim setpointDevice As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(setpointDeviceRef) Dim rootDeviceRef As Integer = 0 If setpointDevice.AssociatedDevices_Count(hs) = 1 Then rootDeviceRef = setpointDevice.AssociatedDevices(hs)(0) End If If rootDeviceRef > 0 Then 'Set the mode to "manual" If hs.DeviceValue(rootDeviceRef) <> Modes.Manual Then hs.SetDeviceValueByRef(rootDeviceRef, Modes.Manual, True) 'Check the temperature and adjust the heater as needed CheckTemperature(rootDeviceRef) Else hs.WriteLog(scriptName, "Could not find root device for setpoint device") End If End Sub Private Function GetChildReference(ByVal rootDeviceRef As Integer, ByVal deviceType As ThermostatDeviceType) As Integer Dim root As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(rootDeviceRef) For Each i As Integer In root.AssociatedDevices(hs) Dim child As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(i) If child.Device_Type_String(hs).ToString = deviceType.ToString Then Return i End If Next Return 0 End Function Private Sub UpdateTemperatureDevice(ByVal rootDeviceRef As Integer) Dim s As New ThermostatSettings(hs, rootDeviceRef) Dim roomTemperature As Double = Math.Round((hs.DeviceValueEx(s.ExternalTemperatureSensorRef) + s.TemperatureCorrectionAddition) * s.TemperatureCorrectionMultiplier, 1) hs.SetDeviceValueByRef(GetChildReference(rootDeviceRef, ThermostatDeviceType.Thermostat_Temperature), roomTemperature, True) End Sub Public Sub CheckTemperature(ByVal rootDeviceRef As Object) Dim s As New ThermostatSettings(hs, CInt(rootDeviceRef)) UpdateTemperatureDevice(rootDeviceRef) Dim currentMode As Modes = hs.DeviceValue(rootDeviceRef) 'If the root is Off, then If currentMode = Modes.Off Then Exit Sub 'Check mode for auto, and update the setpoint device If currentMode = Modes.Auto Then Dim scheduleTemp As Double = GetSetpointFromSchedule(rootDeviceRef) hs.SetDeviceValueByRef(GetChildReference(rootDeviceRef, ThermostatDeviceType.Thermostat_Setpoint), scheduleTemp, True) End If 'Get roomtemperature from device and setpoints Dim roomTemperature As Double = hs.DeviceValueEx(GetChildReference(rootDeviceRef, ThermostatDeviceType.Thermostat_Temperature)) Dim setPoint As Double = hs.DeviceValueEx(GetChildReference(rootDeviceRef, ThermostatDeviceType.Thermostat_Setpoint)) Dim lowSetPoint As Double = setPoint - s.TemperatureOffset 'Set the mode button to manual if the temperature is not equal to TempHigh or TempLow and the mode is not Off or Auto If currentMode <> Modes.Auto AndAlso currentMode <> Modes.Off Then If setPoint <> s.TemperatureHigh AndAlso setPoint <> s.TemperatureLow Then hs.SetDeviceValueByRef(rootDeviceRef, Modes.Manual, True) End If End If If roomTemperature <= lowSetPoint Then TurnOn(rootDeviceRef) If s.Log Then hs.WriteLog(scriptName, "Heating ON - Temp: " & roomTemperature & "° - , Setpoint: " & setPoint & "°") ElseIf roomTemperature > lowSetPoint AndAlso roomTemperature <= setPoint Then Idle() If s.Log Then hs.WriteLog(scriptName, "Heating IDLE - Temp: " & roomTemperature & "° - , Setpoint: " & setPoint & "°") ElseIf roomTemperature > setPoint Then TurnOff(rootDeviceRef) If s.Log Then hs.WriteLog(scriptName, "Heating OFF - Temp: " & roomTemperature & "° - , Setpoint: " & setPoint & "°") Else If s.Log Then hs.WriteLog(scriptName, "Heating status unchanged - Temp: " & roomTemperature & "° - Setpoint: " & setPoint & "°") End If End Sub Private Sub TurnOff(ByVal rootDeviceRef As Object) Dim s As New ThermostatSettings(hs, rootDeviceRef) Dim cc As HomeSeerAPI.CAPI.CAPIControl = hs.CAPIGetSingleControlByUse(s.HeaterDeviceReference, HomeSeerAPI.ePairControlUse._Off) Dim ccResponse As HomeSeerAPI.CAPI.CAPIControlResponse = hs.CAPIControlHandler(cc) If s.Log Then hs.WriteLog("Virtual Thermostat", "Turn Off: " & ccResponse.ToString & " for device " & s.HeaterDeviceReference) End Sub Private Sub TurnOn(ByVal rootDeviceRef As Integer) Dim s As New ThermostatSettings(hs, rootDeviceRef) Dim cc As HomeSeerAPI.CAPI.CAPIControl = hs.CAPIGetSingleControlByUse(s.HeaterDeviceReference, HomeSeerAPI.ePairControlUse._On) Dim ccResponse As HomeSeerAPI.CAPI.CAPIControlResponse = hs.CAPIControlHandler(cc) If s.Log Then hs.WriteLog("Virtual Thermostat", "Turn On: " & ccResponse.ToString & " for device " & s.HeaterDeviceReference) End Sub Private Sub Idle() 'Do nothing End Sub Private Function GetSetpointFromSchedule(ByVal rootDeviceRef As Integer) As Double Dim s As New ThermostatSettings(hs, rootDeviceRef) Dim schedule As System.Collections.Generic.List(Of String) Dim scheduleArray() As String If s.AlternativeScheduleDeviceReference > 0 Then If hs.IsOff(s.AlternativeScheduleDeviceReference) Then scheduleArray = hs.GetINISectionEx("Schedule", scriptName & "_" & rootDeviceRef & ".ini") Else scheduleArray = hs.GetINISectionEx("AlternativeSchedule", scriptName & "_" & rootDeviceRef & ".ini") End If Else scheduleArray = hs.GetINISectionEx("Schedule", scriptName & "_" & rootDeviceRef & ".ini") End If schedule = scheduleArray.ToList 'Failsafe if no schedule is found If schedule.Count = 0 Then Return s.TemperatureLow If Not schedule(0).StartsWith("0:00") Then schedule.Insert(0, "0:00=Low") End If schedule.Add("24:00=Low") Dim timeNow As Double = Now.Hour + Now.Minute / 60 For i As Integer = 0 To schedule.Count - 2 Dim line() As String = schedule(i).Split("=") Dim nextLine() As String = schedule(i + 1).Split("=") Dim time_this As Double = line(0).Split(":")(0) + line(0).Split(":")(1) / 60 Dim time_next As Double = nextLine(0).Split(":")(0) + nextLine(0).Split(":")(1) / 60 If timeNow >= time_this AndAlso timeNow < time_next Then Select Case line(1) Case = "High" Return s.TemperatureHigh Case = "Low" Return s.TemperatureLow Case Else Dim temp As Double = 0 Dim success As Boolean = Double.TryParse(line(1), temp) If Not success Then hs.WriteLog(scriptName, "Error parsing value in schedule at time: " + line(i)) Return temp End Select End If Next Return 0 End Function Class ThermostatSettings Public Property ExternalTemperatureSensorRef As Integer = 0 Public Property TemperatureCorrectionMultiplier As Integer = 1 Public Property TemperatureCorrectionAddition As Integer = 0 Public Property TemperatureOffset As Double = 0.3 Public Property HeaterDeviceReference As Integer = 0 Public Property TemperatureHigh As Double = 22 Public Property TemperatureLow As Double = 18 Public Property AlternativeScheduleDeviceReference = 0 Public Property Log As Boolean = False Private scriptName As String = "VirtualThermostat" Public Sub Save(ByRef hs As Object, ByVal rootDeviceRef As Integer) Dim filename As String = scriptName & "_" & rootDeviceRef & ".ini" hs.SaveINISetting("Settings", "ExternalTemperatureSensorRef", Me.ExternalTemperatureSensorRef, filename) hs.SaveINISetting("Settings", "TemperatureCorrectionAddition", Me.TemperatureCorrectionAddition, filename) hs.SaveINISetting("Settings", "TemperatureCorrectionMultiplier", Me.TemperatureCorrectionMultiplier, filename) hs.SaveINISetting("Settings", "TemperatureOffset", Me.TemperatureOffset, filename) hs.SaveINISetting("Settings", "Log", Me.Log, filename) hs.SaveINISetting("Settings", "HeaterDeviceReference", Me.HeaterDeviceReference, filename) hs.SaveINISetting("Settings", "TemperatureHigh", Me.TemperatureHigh, filename) hs.SaveINISetting("Settings", "TemperatureLow", Me.TemperatureLow, filename) hs.SaveINISetting("Settings", "AlternativeScheduleDeviceReference", Me.AlternativeScheduleDeviceReference, filename) End Sub Public Sub New(ByRef hs As Object, ByVal rootDeviceRef As Integer) Dim lines() As String = hs.GetINISectionEx("Settings", scriptName & "_" & rootDeviceRef & ".ini") Dim inputString = String.Join(",", lines) 'Dim rootDevice As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(rootDeviceRef) 'Dim inputString As String = rootDevice.DeviceType_Get(hs).Device_SubType_Description.ToString Load(inputString) End Sub Public Sub New(ByVal inputString As String) Load(inputString) End Sub Public Sub Load(ByVal inputString As String) Dim lines() As String = inputString.Split(",") For Each line As String In lines Dim properties() As String = line.Split("=") Select Case properties(0) Case = "ExternalTemperatureSensorRef" Me.ExternalTemperatureSensorRef = CInt(properties(1)) Case = "TemperatureCorrectionAddition" Me.TemperatureCorrectionAddition = CInt(properties(1)) Case = "TemperatureCorrectionMultiplier" Me.TemperatureCorrectionMultiplier = CInt(properties(1)) Case = "TemperatureOffset" Me.TemperatureOffset = CInt(properties(1)) Case = "Log" Me.Log = CBool(properties(1)) Case = "HeaterDeviceReference" Me.HeaterDeviceReference = CInt(properties(1)) Case = "TemperatureHigh" Me.TemperatureHigh = properties(1) Case = "TemperatureLow" Me.TemperatureLow = properties(1) Case = "AlternativeScheduleDeviceReference" Me.AlternativeScheduleDeviceReference = properties(1) End Select Next 'HeaterDeviceReference=78,ExernalTemperatureSensorRef=394 End Sub End Class ... og trykk på "Save Script" knappen nederst. HUSK: Trykk på "Save Script" knappen nederst. Gjort det? I "Sub or Function"-boksen skal det stå "Setup". I Parameter skal det stå: HeaterDeviceReference=1139,ExternalTemperatureSensorRef=74 ... der du bytter ut 1139 med dev-ref til av/på-bryteren og 74 med dev-ref til temperatursensoren. Da skal alt se slik ut: 4. Trykk på den blå pilen øverst på eventet for å sette i gang setup-rutinen. Da er vi snart ferdige. 5. Scriptet oppretter et Event (i Event-kategorien "Virtual Thermostat") som kjører scriptet hvert 5. minutt, og det er nesten helt riktig. Vi må bare justere et par ting. Åpne scriptet som ligger under "Virtual Thermostat". Gi det et litt mer beskrivende navn, så er det enklere å finne tilbake. 6. Utvid Run Script action'en, og deaktiver "Only allow a single instance to run at a time" (ellers er det jo bare en termostat som vil fungere) Hvis alt nå er vel, skal det se slik ut: 7. Personlig skrur jeg av logging på slike eventer: 7. ??? 8. Profit! Konfigurasjon I /Config-mappen din har det nå dukket opp en fil som heter "VirtualThermostat_nnn.ini" der nnn er device referansen til root'en (den samme som også navngir eventet over). Den vil se f.eks. slik ut: [Settings] ExternalTemperatureSensorRef=74 TemperatureCorrectionAddition=0 TemperatureCorrectionMultiplier=1 TemperatureOffset=0,3 Log=False HeaterDeviceReference=1139 TemperatureHigh=22 TemperatureLow=19 AlternativeScheduleDeviceReference=0 [Schedule] 6:00=High 8:0=Low 16:00=High 22:00=Low [AlternativeSchedule] 6:00=High 23:00=Low ... der vi kjenner igjen ExternalTemperatureSensorRef og HeaterDeviceReference som de vi satte opp i Setup-rutinen. De andre feltene har følgende forklaring: TemperatureCorrectionAddition=0 er hvor mye som legges til eller trekkes fra den faktiske temperatursensoren. Fint for kalibrering TemperatureCorrectionMultiplier=1 hvor mye temperatursensoren skaleres med fra den faktiske temperatursensoren. Fint for kalibrering. (1 = ingen skalering) TemperatureOffset er hvor langt ned under "Setpoint" temperaturen tillates å bli før varmekilden skrus på. Hvis Setpoint er satt til 22 grader, vil ikke ovnen bli satt på før temperaturen har sunket under 21,7 grader. TemperatureHigh og Low er selvforklarende. AlternativeScheduleDeviceReference er referanse til en enhet som bestemmer om det er "Schedule" eller "AlternativeSchedule" som skal brukes. Schedule og AlternativeSchedule: Her står klokkeslett (i stigende rekkefølge og uten ledende nuller) og tilhørende temperaturer. Med mindre du spesifiserer noe annet, vil kl 0:00 alltid begynne med "Low" temperaturvalg. Så da leser vi Schedule slik: Mellom kl 00 og 06 er det "Low" Mellom kl 6 og 8 er det "High" Mellom 8 og 16 er det "Low" Mellom 16 og 22 er det "High" Og fra 22 og utover er det "Low" Du kan spesifisere din egen temperatur istedenfor "High" og "Low" også, i tilfelle du vil ha en halv grad ekstra om kvelden. Da kan det f.eks. se slik ut: [Schedule] 6:00=High 8:0=Low 16:00=High 20:00=22,5 22:00=Low Pro tip: Du kan også sette opp Eventet til å kjøre på "device change" når temperatursensoren endrer verdi, istedenfor hvert 5. minutt (eller hvor ofte det å passer deg). Da kan det også være lurt å sette opp et par tilleggs-triggere til på bestemte klokkeslett eller andre hendelser, for det er jo ingen garanti at temperaturen endrer seg slik at scriptet trigges. Enjoy! 12 1 Siter
ZoRaC Skrevet 20. februar 2017 Skrevet 20. februar 2017 4 timer siden, Moskus skrev: 5. Scriptet oppretter et device som kjører scriptet hvert 5. minutt Regner med du mener "event"? Topp script! Må vurdere om jeg skal ta i bruk det i stedet for RFXCOM. Siter
Moskus Skrevet 20. februar 2017 Forfatter Skrevet 20. februar 2017 11 minutter siden, ZoRaC skrev: Regner med du mener "event"? Wops, indeed! 11 minutter siden, ZoRaC skrev: Topp script! Må vurdere om jeg skal ta i bruk det i stedet for RFXCOM. Ja, jeg ble litt kjepphøy og opprettet en ny RFXCOM-termostat for å "bevise" at den fungerte fint. Det gjorde den ikke, så da måtte jeg jo bare krype til korset og fullføre scriptet... 1 Siter
Johs. Skrevet 22. februar 2017 Skrevet 22. februar 2017 (endret) Vakkert. En liten sak, dukker ikke opp i Imperihome eller HStouch som termostat. Lurer på om det kan skyldes at devicen mangler info på Device Type Internal: No API, Type: Type 0, SubType: Endret 22. februar 2017 av Johs. Siter
Moskus Skrevet 22. februar 2017 Forfatter Skrevet 22. februar 2017 Det er riktig. Det er ingen termostat, teknisk sett, og i scripts kan jeg ikke implementere Thermostat API som kreves for at HomeSeer teknisk sett skal definere det som en. Men det går å justere temperaturen med devicene. Det er ikke bare å sette riktig "Device Type", men det må også implementeres noen forhåndsdefinerte rutiner som scriptpakken ikke kan gjøre. Men det får bli når jeg oppgraderer scriptet til en plugin. Siter
Moskus Skrevet 13. mars 2017 Forfatter Skrevet 13. mars 2017 Fint om denne tråden holdes on topic... Siter
gullfrode Skrevet 19. mars 2017 Skrevet 19. mars 2017 Mulighet for å legge til flere enn en HeaterDeviceReference?(Har fire panelovner tilkoblet hver sine wall-plugs på stua) Siter
Moskus Skrevet 20. mars 2017 Forfatter Skrevet 20. mars 2017 9 timer siden, gullfrode skrev: Mulighet for å legge til flere enn en HeaterDeviceReference?(Har fire panelovner tilkoblet hver sine wall-plugs på stua) Tja... det er teknisk mulig å skrive om scriptet slik at HeaterDeviceReference er en kommaseparert liste...? Det jeg hadde gjort er å først lage en virtuell device som heter f.eks. "Varme", og så laget to eventer som skrur av eller på alle panelovnene dine når "Varme" blir skrudd av eller på. Deretter er det bare å la scriptet styre "Varme" istedenfor å styre panelovnen direkte. Siter
ZoRaC Skrevet 20. mars 2017 Skrevet 20. mars 2017 I siste versjon av HS kan man linke devicer. Kan man ikke bare linke panelovnene? Siter
Moskus Skrevet 20. mars 2017 Forfatter Skrevet 20. mars 2017 1 minutt siden, ZoRaC skrev: I siste versjon av HS kan man linke devicer. Kan man ikke bare linke panelovnene? Jo! Det er faktisk en mulignet! Hvis man vil kunne styre det avhengig av tid på døgnet kan man jo også bruke CloneDevice.vb-scriptet mitt. Tenkte ikke på den muligheten... ? 1 Siter
gullfrode Skrevet 20. mars 2017 Skrevet 20. mars 2017 Kongle! Master Moskus, får du til å implementere i scriptet at om en/flere dørsensorer er åpen så skrur ovnene seg av, eller må man løse det med if VD ditt eller datt. Begynner å bnærme seg funksjonalitet i Hc2 dette Homeseergreiene;-P Siter
Moskus Skrevet 20. mars 2017 Forfatter Skrevet 20. mars 2017 Et øyeblikk siden, gullfrode skrev: Master Moskus, får du til å implementere i scriptet at om en/flere dørsensorer er åpen så skrur ovnene seg av, eller må man løse det med if VD ditt eller datt. Du kan komme veldig langt med scripting, men når scriptet trenger input fra andre sensorer, så må man uansett til med et event. Da kan man like greit lage et event som skrur av termostaten når du åpner vinduet, og på igjen etterpå. Eventuelt kan du bruke DeviceState.vb-scriptet mitt til å lagre statusen på termostaten (mode og temperatur), slik at du kan få nøyaktig samme innstilling før og etter åpning av vinduet/døren. ... med mindre @ZoRaC kommer på en mulighet jeg har oversett. 1 Siter
Blodstrupmoen Skrevet 20. mars 2017 Skrevet 20. mars 2017 1 time siden, gullfrode skrev: Kongle! Master Moskus, får du til å implementere i scriptet at om en/flere dørsensorer er åpen så skrur ovnene seg av, eller må man løse det med if VD ditt eller datt. I mitt system, endrer jeg bare settpunkt på termostaten til f.eks 10grader når dører/vinduer åpnes. Siter
gullfrode Skrevet 20. mars 2017 Skrevet 20. mars 2017 9 minutter siden, Blodstrupmoen skrev: I mitt system, endrer jeg bare settpunkt på termostaten til f.eks 10grader når dører/vinduer åpnes. Men da er det en reell termostat og ikke en virtuell? Siter
Blodstrupmoen Skrevet 20. mars 2017 Skrevet 20. mars 2017 3 minutter siden, gullfrode skrev: Men da er det en reell termostat og ikke en virtuell? Nei, det er en virtuell termostat som jeg har scriptet/laget selv. Siter
gullfrode Skrevet 20. mars 2017 Skrevet 20. mars 2017 Gjerne del:o). Akkurat noe slikt jeg er ute etter. Siter
Moskus Skrevet 20. mars 2017 Forfatter Skrevet 20. mars 2017 15 minutter siden, Blodstrupmoen skrev: I mitt system, endrer jeg bare settpunkt på termostaten til f.eks 10grader når dører/vinduer åpnes. Utfordringen er mer hva du skal sette den til når du lukker vinduet igjen. Siter
Blodstrupmoen Skrevet 20. mars 2017 Skrevet 20. mars 2017 Et øyeblikk siden, Moskus skrev: Utfordringen er mer hva du skal sette den til når du lukker vinduet igjen. Da settes den til den verdien som er relevant for tidspunkt på døgnet. Fungerer utmerket. Målet mitt med HA er at det skal være automatisk, og man skal slippe å trykke/skru på knapper for å få det som man vil. Dette har jeg oppnådd ganske bra, og det er ytterst sjelden det er behov for å endre temp, lys etc. ut over det som er satt i systemet. Men hvis man skulle ha endret settpunkt manuelt, så vil det jo gå tilbake til standard verdi etter av vindu/dør har vært åpnet. Dette ser jeg på som helt uproblematisk. Siter
Moskus Skrevet 20. mars 2017 Forfatter Skrevet 20. mars 2017 Ja. Og det er fint mulig med HomeSeer hvis man kan scripte det. Som sagt, er det faktisk relativt enkelt med dette scriptet, men man får jo selvfølgelig enda flere muligheter hvis man bygger det selv. Det jeg har gjort, er å sette skru av termostaten (eller sette setpoint til lav -> samme effekt), og så sette den på Auto etterpå (siden Auto kan gi deg forskjellig temperatur basert på klokkeslett). Ferdig arbeid. Siter
gullfrode Skrevet 15. april 2017 Skrevet 15. april 2017 Event som setter til manuell og gitt temp ved åpen dørsensor fungerte selvfølgelig fint med VD-ene. Lagde bare som Moskus foreslo en VD for rom med flere varmenoder, og egen event for av og på. Men hvordan implementere fridager-scriptet i scriptet, slik at Alternative scedule blir valgt på fridager? Siter
Moskus Skrevet 18. april 2017 Forfatter Skrevet 18. april 2017 Den 15.04.2017 klokken 14.45, gullfrode skrev: Men hvordan implementere fridager-scriptet i scriptet, slik at Alternative scedule blir valgt på fridager? Hva nøyaktig er problemet? Det er vel bare å implementere scriptet, og referere det i .ini-filen? Siter
gullfrode Skrevet 18. april 2017 Skrevet 18. april 2017 Hva nøyaktig er problemet? Det er vel bare å implementere scriptet, og referere det i .ini-filen?Ikke noe problem, bare løsning. Dvs AlternativeScheduleDeviceReference="Reference ID på Fridag-device"Takk Moskus, noob som nevnt. 1 Siter
Snurre Skrevet 26. juli 2017 Skrevet 26. juli 2017 Hei, denne er veldig aktuell for meg. Har fulgt oppskriften over (flere ganger), men får ikke dette til å virke. Det blir ikke opprettet noe event jeg kan jobbe videre med. Har fulgt oppskriften til punkt og prikke. (kan sies at jeg "remoter" inn) Noen tips? takk, S Siter
Snurre Skrevet 26. juli 2017 Skrevet 26. juli 2017 Et øyeblikk siden, gullfrode skrev: Winblows eller unix? UNIX -sel unit Siter
Anbefalte innlegg
Bli med i samtalen
Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.