Sorry voor het verzuimen van het delen van de informatie,
Ik blijf mijn bedenkingen hebben over het importeren van een plugin bij homeseer, maar heb het als volgt opgelost:
Eerst had ik op verschillende plaatsen in de plugin communicatie met de K8061, nu gebeurd dit allemaal in 1 SUB
HSPI CLASS:
Als er een output aangestuurd dient te worden ga ik eerst na wat de waarde is, en of die anders is dan Homeseer al heeft staan als status, dan (Bij analoge waarde) of de waarde niet hoger is dan de Max of lager is dan de Min, anders aanpassen.
Dan Set ik een variabele in de Array:
bij Digitaal uit is het OutputChange(IOCard, 1) = 1
bij Analoog uit is het OutputChange(IOCard, 2) = 1
bij PWM uit is het OutputChange(IOCard, 3) = 1
MODULE1 MODULE:
Om de 100ms wordt de timer COMMUNICATION getriggert.
- Eerst de timer op Disable zetten.
For i=0 to 7 (want er kunnen max 8 kaarten op)
Kijk of kaart i aangesloten is Else End Sub
Lees digitale inputs, vergelijk met bekende HS gegevens anders doorgeven
zo ook met Analoge inputs
EN DAN
if OutputChange(i, 1) = 1 then
Haal alle 8 de Digitale output statussen van deze kaart op en stuur ze als een array door naar de IOCard
OutputChange(i, 1) = 0
End if
Zo ook met analoge outputs, en PWM outputs.
Hier de Scripts:
HSPI CLASS:
Code: Select all
Public Sub SetIOEx(ByVal dv As Object, ByVal housecode As String, ByVal devicecode As String, ByVal command As Short, _
ByVal brightness As Short, ByVal data1 As Short, ByVal data2 As Short, ByVal voice_command As String, ByVal host As String)
Dim bOurs As Boolean = False
If Not dv Is Nothing Then
If dv.interface.trim = PLUGIN_NAME Then
bOurs = True
Else
Exit Sub ' Not ours.
End If
End If
If Not bOurs Then
If gBaseCode.ToUpper <> housecode.Trim.ToUpper Then
Exit Sub ' Not ours
End If
End If
hs.WriteLog(PLUGIN_NAME, "SetIOEx for " & housecode & devicecode & _
", Cmd=" & command.ToString & _
", Brt=" & brightness.ToString & _
", D1/D2=" & data1.ToString & "/" & data2.ToString & _
", Vcmd=" & voice_command & _
", Host=" & host)
Dim ref As Integer
Dim ArrayCount As Integer
Dim DeviceCodeSplit() As String = Split(devicecode, "+")
Dim i As Integer
ArrayCount = UBound(DeviceCodeSplit)
For i = 0 To ArrayCount
ref = hs.GetDeviceRef(housecode & DeviceCodeSplit(i))
dv = hs.GetDeviceByRef(ref)
' Nu is dv. gevult met de gegevens van de output die we willen aansturen.
Dim SetOutput() As String = Split(dv.dev_type_string)
Dim IOCard As Integer = SetOutput(2)
Dim IOType As String = SetOutput(4)
Dim IOChannel As Integer = SetOutput(5)
Dim Max As Integer
Dim Min As Integer
Select Case IOType
Case "DO"
OutputChange(IOCard, 1) = 1
Case "AO"
Max = IOCardValMax(IOCard, 2, IOChannel)
Min = IOCardValMin(IOCard, 2, IOChannel)
If command.ToString = 2 Then
hs.SetDeviceValue(housecode & DeviceCodeSplit(i), Max)
ElseIf command.ToString = 3 Then
hs.SetDeviceValue(housecode & DeviceCodeSplit(i), Min)
End If
OutputChange(IOCard, 2) = 1
Case "PWM"
Max = IOCardValMax(IOCard, 3, IOChannel)
Min = IOCardValMin(IOCard, 3, IOChannel)
If command.ToString = 2 Then
hs.SetDeviceValue(housecode & DeviceCodeSplit(i), Max)
ElseIf command.ToString = 3 Then
hs.SetDeviceValue(housecode & DeviceCodeSplit(i), Min)
End If
OutputChange(IOCard, 3) = 1
End Select
Next
End Sub
MODULE1:
Code: Select all
Sub StartCommunicationTimer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles StartCommunicationTimer.Elapsed
Dim i As Integer
Dim j As Integer
Dim DIBit(7) As Integer
Dim DIByte As Integer
Dim AOBuffer(7) As Integer
Dim Buffer(100) As Integer
Dim Min As Integer
Dim Max As Integer
Dim Val As Integer
Dim Margin As Integer
StartCommunicationTimer.Enabled = False
For i = 0 To 7
If Connected(i) Then
CModule1(i) = True
PGModule1(i) = PowerGood(i)
Else
CModule1(i) = False
End If
If Connected(i) And AddedDevices(i) Then
' ########################################## INPUTS ##########################################
' Digital Inputs
DIByte = ReadAllDigital(i)
DIBit(0) = (DIByte And 1)
DIBit(1) = (DIByte And 2) \ 2
DIBit(2) = (DIByte And 4) \ 4
DIBit(3) = (DIByte And 8) \ 8
DIBit(4) = (DIByte And 16) \ 16
DIBit(5) = (DIByte And 32) \ 32
DIBit(6) = (DIByte And 64) \ 64
DIBit(7) = (DIByte And 128) \ 128
For j = 0 To 7
If DIBit(j) = 0 And Not hs.DeviceStatus(First_hc(i) & First_dc(i) + j) = 3 Then
hs.SetDeviceStatus(First_hc(i) & First_dc(i) + j, 3)
hs.WriteLog(PLUGIN_NAME, "Device: " & First_hc(i) & First_dc(i) + j & " Set to Off")
ElseIf DIBit(j) = 1 And Not hs.DeviceStatus(First_hc(i) & First_dc(i) + j) = 2 Then
hs.SetDeviceStatus(First_hc(i) & First_dc(i) + j, 2)
hs.WriteLog(PLUGIN_NAME, "Device: " & First_hc(i) & First_dc(i) + j & " Set to On")
End If
Next
' Analog Inputs
ReadAllAnalog(i, Buffer)
For j = 1 To 8
Min = IOCardValMin(i, 1, j)
Max = IOCardValMax(i, 1, j)
Margin = IOCardValMargin(i, 1, j)
Val = (((Max - Min) / 1024) * Buffer(j - 1)) + Min
If Val <= Min And Not hs.DeviceValue(First_hc(i) & First_dc(i) + j + 15) <= Min Then
hs.SetDeviceStatus(First_hc(i) & First_dc(i) + j + 15, 3)
hs.SetDeviceValue(First_hc(i) & First_dc(i) + j + 15, Min)
hs.WriteLog(PLUGIN_NAME, "Device: " & First_hc(i) & First_dc(i) + j & " Set to Minimal. Value = " & Min)
ElseIf Val >= Max And Not hs.DeviceValue(First_hc(i) & First_dc(i) + j + 15) >= Max Then
hs.SetDeviceStatus(First_hc(i) & First_dc(i) + j + 15, 2)
hs.SetDeviceValue(First_hc(i) & First_dc(i) + j + 15, Max)
hs.WriteLog(PLUGIN_NAME, "Device: " & First_hc(i) & First_dc(i) + j & " Set to Maximal. Value = " & Max)
ElseIf hs.DeviceValue(First_hc(i) & First_dc(i) + j + 15) > Val + Margin Or hs.DeviceValue(First_hc(i) & First_dc(i) + j + 15) < Val - Margin Then
hs.SetDeviceStatus(First_hc(i) & First_dc(i) + j + 15, 19)
hs.SetDeviceValue(First_hc(i) & First_dc(i) + j + 15, Val)
hs.WriteLog(PLUGIN_NAME, "Device: " & First_hc(i) & First_dc(i) + j & " Set to Value = " & Val)
End If
Next
' ########################################## OUTPUTS ##########################################
Dim DOBit(8) As Integer
Dim DOByte As Integer
DOBit(1) = 1
DOBit(2) = 2
DOBit(3) = 4
DOBit(4) = 8
DOBit(5) = 16
DOBit(6) = 32
DOBit(7) = 64
DOBit(8) = 128
' Digital Outputs
If OutputChange(i, 1) = 1 Then
DOByte = 0
For j = 1 To 8
If hs.DeviceStatus(First_hc(i) & First_dc(i) + j + 7) = 17 Then
hs.SetDeviceStatus(First_hc(i) & First_dc(i) + j + 7, 3)
End If
If hs.DeviceStatus(First_hc(i) & First_dc(i) + j + 7) = 2 Then
DOByte = DOByte + DOBit(j)
End If
Next
OutputAllDigital(i, DOByte)
OutputChange(i, 1) = 0
End If
' Analog Outputs
If OutputChange(i, 2) = 1 Then
hs.WriteLog(PLUGIN_NAME, "Analog Outputs")
Dim ConvertVal As Integer
For j = 1 To 8
Max = IOCardValMax(i, 2, j)
Min = IOCardValMin(i, 2, j)
Val = hs.DeviceValue(First_hc(i) & First_dc(i) + j + 23)
' In geval van overwaarde/onderwaarde, Stel waarde bij
If Val > Max Then
Val = Max
ElseIf Val < Min Then
Val = Min
End If
ConvertVal = (255 / (Max - Min)) * (Val - Min)
AOBuffer(j - 1) = ConvertVal
Next
OutputAllAnalog(i, AOBuffer(0))
OutputChange(i, 2) = 0
End If
' PWM Outputs
If OutputChange(i, 3) = 1 Then
Dim ConvertVal As Integer
Max = IOCardValMax(i, 3, 1)
Min = IOCardValMin(i, 3, 1)
Val = hs.DeviceValue(First_hc(i) & First_dc(i) + 32)
' In geval van overwaarde/onderwaarde, Stel waarde bij
If Val > Max Then
Val = Max
ElseIf Val < Min Then
Val = Min
End If
ConvertVal = (255 / (Max - Min)) * (Val - Min)
OutputPWM(i, ConvertVal)
OutputChange(i, 2) = 0
End If
End If
Next
If RescanIOCards Then
CloseDevices()
While Not i < 0
i = OpenDevice()
End While
For i = 0 To 7
If Connected(i) Then
hs.WriteLog(PLUGIN_NAME, "IOCard " & i & " is Connected")
Else
hs.WriteLog(PLUGIN_NAME, "IOCard " & i & " is Disconnected")
End If
Next
RescanIOCards = False
End If
StartCommunicationTimer.Enabled = True
End Sub