plugin laat interfacekaart crashen

Homeseer Forum in het Nederlands (DUTCH forum)

Moderator: Ruud

Post Reply
maikelwijnen
Starting Member
Starting Member
Posts: 41
Joined: Tue Jun 16, 2009 9:15 pm
Location: Netherlands

plugin laat interfacekaart crashen

Post by maikelwijnen »

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
Attachments
hspi_k8061.rar
(90.42 KiB) Downloaded 344 times
maikelwijnen
Starting Member
Starting Member
Posts: 41
Joined: Tue Jun 16, 2009 9:15 pm
Location: Netherlands

Re: plugin laat interfacekaart crashen

Post by maikelwijnen »

Niemand een idee?
maikelwijnen
Starting Member
Starting Member
Posts: 41
Joined: Tue Jun 16, 2009 9:15 pm
Location: Netherlands

Re: plugin laat interfacekaart crashen

Post by maikelwijnen »

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)
User avatar
Rene
Global Moderator
Global Moderator
Posts: 1689
Joined: Wed Oct 08, 2008 3:54 pm
Location: Netherlands

Re: plugin laat interfacekaart crashen

Post by Rene »

Je kan geen .exe plugin maken. De plugin moet in de context van Homeseer draaien.
Rene.
maikelwijnen
Starting Member
Starting Member
Posts: 41
Joined: Tue Jun 16, 2009 9:15 pm
Location: Netherlands

Re: plugin laat interfacekaart crashen

Post by maikelwijnen »

Volgens de SDK van homeseer moet dat wel kunnen
For 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.
Sterker nog, ik heb een plugin gevonden genaamd hspi_pjcNetwork.exe
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.
Digit
Global Moderator
Global Moderator
Posts: 3388
Joined: Sat Mar 25, 2006 10:23 am
Location: Netherlands
Contact:

Re: plugin laat interfacekaart crashen

Post by Digit »

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.
maikelwijnen
Starting Member
Starting Member
Posts: 41
Joined: Tue Jun 16, 2009 9:15 pm
Location: Netherlands

Re: plugin laat interfacekaart crashen

Post by maikelwijnen »

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?
Digit
Global Moderator
Global Moderator
Posts: 3388
Joined: Sat Mar 25, 2006 10:23 am
Location: Netherlands
Contact:

Re: plugin laat interfacekaart crashen

Post by Digit »

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! :)
maikelwijnen
Starting Member
Starting Member
Posts: 41
Joined: Tue Jun 16, 2009 9:15 pm
Location: Netherlands

Re: plugin laat interfacekaart crashen

Post by maikelwijnen »

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
Post Reply

Return to “Homeseer algemeen Forum”