Hoi,
Ik ben bezig om meerdere Velleman K8061 USB interface door Homeseer te laten besturen.
Het uitlezen van de ingangen gaat prima, het aansturen van de uitgangen gaat prima, maar als ik een soort stress-test doe klapt de K8061 er uit, Communicatie valt weg en kan alleen hersteld worden door de USB er uit te halen.
(Ik maak in homeseer een event die om de 5 sec de digitale outputs omschakeld)
Nu komt het interessante gedeelte, Met het script in een VB windows programma met een paar knoppen en zo, werkt het perfect zelfs met een togglerate van 1 sec.
Ik heb In HSPI.vb de output aansturing geregeld, en in MODULE1.vb de input uitlezing geregeld, en ben er al achter dat deze parallel lopen aan elkaar, dus dat het kan voorkomen dat hij aanstuurd, en uit wil lezen op het zelfde moment. Dat geeft bij Velleman ook problemen, maar dat heb ik zelf opgelost.
Ik begin te denken dat homeseer de boel een paar ms vertraagt waardoor het aansturingen van de K8061 door elkaar gaan lopen.
Ik heb mijn script bijgevoegd, in de hoop dat iemand er even over wil kijken of ik misschien een grove fout heb gemaakt.
Maikel
plugin laat interfacekaart crashen
Moderator: Ruud
-
- Starting Member
- Posts: 41
- Joined: Tue Jun 16, 2009 9:15 pm
- Location: Netherlands
plugin laat interfacekaart crashen
- Attachments
-
- hspi_k8061.rar
- (90.42 KiB) Downloaded 345 times
-
- Starting Member
- Posts: 41
- Joined: Tue Jun 16, 2009 9:15 pm
- Location: Netherlands
Re: plugin laat interfacekaart crashen
Niemand een idee?
-
- Starting Member
- Posts: 41
- Joined: Tue Jun 16, 2009 9:15 pm
- Location: Netherlands
Re: plugin laat interfacekaart crashen
Misschien als ik een EXE plugin maak dat hij dan individueel draaid, en zo geen problemen geeft, In welke vorm kan ik een EXE plugin maken, ofwel (Welk programma met welke tamplate)
Re: plugin laat interfacekaart crashen
Je kan geen .exe plugin maken. De plugin moet in de context van Homeseer draaien.
Rene.
-
- Starting Member
- Posts: 41
- Joined: Tue Jun 16, 2009 9:15 pm
- Location: Netherlands
Re: plugin laat interfacekaart crashen
Volgens de SDK van homeseer moet dat wel kunnen
Maar misschien vergelijk ik de verkeerde dingen.
Ik snap alleen niet waarom de kaarten op tilt slaan als ik het via Homeseer doe, dus ik zoek hopeloos naar een alternatief. Het lijkt me sterk dat het simpel weg niet mogelijk is.
Sterker nog, ik heb een plugin gevonden genaamd hspi_pjcNetwork.exeFor each file that matches that criteria, HomeSeer then looks for the hspi classname in the file. For this reason, regardless of whether you have a COM or .NET plug-in, you must create an hspi class within the plug-in. With .NET plug-ins, the class name is case sensitive and thus should be all uppercase (HSPI). Under COM, you can create an ActiveX User Control, ActiveX DLL, or ActiveX EXE so long as there is a creatable HSPI class in the program. An ActiveX EXE is preferred since EXE programs run in their own process (thread) thus are easier to track. ActiveX DLLs or controls run under the process of hs_Compatibility.exe, so there is no means for controlling execution outside of HomeSeer.
Maar misschien vergelijk ik de verkeerde dingen.
Ik snap alleen niet waarom de kaarten op tilt slaan als ik het via Homeseer doe, dus ik zoek hopeloos naar een alternatief. Het lijkt me sterk dat het simpel weg niet mogelijk is.
Re: plugin laat interfacekaart crashen
Ik ben 1 van de 6 downloaders
Wat mij als eerste opviel is dat je zowel in hspi als in module1 declares hebt staan voor de k8061.dll. Als je dan zelf al tot de conclusie bent gekomen dat hspi en module1 parallel aan elkaar draaien (wat ik zelf nog nooit heb bemerkt, maar het zal dan wel? Hoe kom je tot die conclusie btw) dan zou ik, bij de problemen die je beschrijft, als eerste alle aanroepen van die k8061.dll centraliseren tot 1 entiteit die die dll nog maar kan aanroepen; zelfs als je denkt dit goed te hebben opgelost; ik heb overigens verder niet bekeken hoe je dat hebt opgelost...
Maar als je zelf al stelt dat aansturing alsnog door elkaar kan gaan lopen, moet je je daar ook op concentreren.
Ik heb zelf een maand of 2-3 geleden ook een stresstest gedaan met HS om te kijken of een in ontwikkeling zijnde plugin een flinke continue data stream wel aankon. Ik zag toen wel een onwaarschijnlijk hoge CPU, maar vastlopen? nee, dat niet.

Wat mij als eerste opviel is dat je zowel in hspi als in module1 declares hebt staan voor de k8061.dll. Als je dan zelf al tot de conclusie bent gekomen dat hspi en module1 parallel aan elkaar draaien (wat ik zelf nog nooit heb bemerkt, maar het zal dan wel? Hoe kom je tot die conclusie btw) dan zou ik, bij de problemen die je beschrijft, als eerste alle aanroepen van die k8061.dll centraliseren tot 1 entiteit die die dll nog maar kan aanroepen; zelfs als je denkt dit goed te hebben opgelost; ik heb overigens verder niet bekeken hoe je dat hebt opgelost...
Maar als je zelf al stelt dat aansturing alsnog door elkaar kan gaan lopen, moet je je daar ook op concentreren.
Ik heb zelf een maand of 2-3 geleden ook een stresstest gedaan met HS om te kijken of een in ontwikkeling zijnde plugin een flinke continue data stream wel aankon. Ik zag toen wel een onwaarschijnlijk hoge CPU, maar vastlopen? nee, dat niet.
-
- Starting Member
- Posts: 41
- Joined: Tue Jun 16, 2009 9:15 pm
- Location: Netherlands
Re: plugin laat interfacekaart crashen
Bedankt voor je tips.
Ik heb de aansturing helemaal los van de homeseer besturing gedaan. (Dus bij InitIO 1 timer starten die hem aan en uit stuurt zonder tussenkomst van homeseer (Geen inputs meer), en dan alleen in hspi.vb). Helaas krijg ik dan het zelfde probleem. Even voor de goede orde, Homeseer loopt niet vast, maar de communicatie met de interfacekaarten crashen.
In de eerste instantie dacht ik dat het aan Velleman lag, maar als ik een stand alone EXE maak met een aansturing om de 50ms blijft hij goed werken.
Ik heb ook al de prioriteit van Homeseer op Realtime gezet in de Processmanager van windows, helaas zonder resultaat.
Het is toch niet zo dat ik mijn plugin op een "verkeerde" manier aanmeld bij homeseer? Of onder een verkeerde proceduren?
Is er misschien nog een andere manier om te proberen te achterhalen waar het probleem zich ergens ontwikkeld?
Ik heb de aansturing helemaal los van de homeseer besturing gedaan. (Dus bij InitIO 1 timer starten die hem aan en uit stuurt zonder tussenkomst van homeseer (Geen inputs meer), en dan alleen in hspi.vb). Helaas krijg ik dan het zelfde probleem. Even voor de goede orde, Homeseer loopt niet vast, maar de communicatie met de interfacekaarten crashen.
In de eerste instantie dacht ik dat het aan Velleman lag, maar als ik een stand alone EXE maak met een aansturing om de 50ms blijft hij goed werken.
Ik heb ook al de prioriteit van Homeseer op Realtime gezet in de Processmanager van windows, helaas zonder resultaat.
Het is toch niet zo dat ik mijn plugin op een "verkeerde" manier aanmeld bij homeseer? Of onder een verkeerde proceduren?
Is er misschien nog een andere manier om te proberen te achterhalen waar het probleem zich ergens ontwikkeld?
Re: plugin laat interfacekaart crashen
Hoi Maikel,
Ik lees in http://www.domoticaforum.eu/pkk/viewtop ... 528#p38568 dat een nieuwe versie van je plugin stabieler is; betekent dit dat je problemen zijn opgelost? Ik ben eigenlijk wel benieuwd wat je daarvoor hebt gedaan, altijd interessant om te weten!
Ik lees in http://www.domoticaforum.eu/pkk/viewtop ... 528#p38568 dat een nieuwe versie van je plugin stabieler is; betekent dit dat je problemen zijn opgelost? Ik ben eigenlijk wel benieuwd wat je daarvoor hebt gedaan, altijd interessant om te weten!

-
- Starting Member
- Posts: 41
- Joined: Tue Jun 16, 2009 9:15 pm
- Location: Netherlands
Re: plugin laat interfacekaart crashen
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:
MODULE1:
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