Soladin 600

Forum over Homeseer scripts (DUTCH forum)

Moderators: TANE, Ruud

Post Reply
User avatar
Peterpc
Member
Member
Posts: 217
Joined: Sun Sep 30, 2007 12:54 pm
Location: Netherlands
Contact:

Soladin 600

Post by Peterpc »

Ik heb sinds kort 3 zonnepanelen op het dak van mijn schuur geplaatst.
De energie wordt door een Soladin 600 aan het lichtnet geleverd.
De Soladin 600 is met een seriele aansluiting uit te lezen.
Hiervoor is bijvoorbeeld 'Masterlog' software beschikbaar.
Via deze software is de com port prima uit te lezen. Maar de data wordt in een SQL file bewaard, waar ik niet in kan komen.
Nu wil ik in Homeseer door middel van een stript de data uitlezen.
Ik weet inmiddels wat ik naar de com port moet sturen om data terug te krijgen.
Alleen in plaats van 30 data bits krijg ik er maar 15 of 16 terug.
Met 'device monitoring Studio' kan ik de communicatie volgen, maar met mijn script gaat het steeds fout.
Dit is het gedeelte dat de communicatie doet.:

Code: Select all


    SerialPort1.Open()

    SerialPort1.Write(P_rqb, 0, P_rqb.Length)
    system.threading.thread.sleep(p_sleep)
    Try
        For I = 0 To 8
            system.threading.thread.sleep(p_sleept)
            P_antwb(I) = SerialPort1.ReadByte()
            If debug = 2 Then hs.writelog("Zonnepaneelb " & I, P_antwb(I))
        Next
    Catch ex As Exception
    End Try
    SerialPort1.Write(P_rqa, 0, P_rqa.Length)
    system.threading.thread.sleep(p_sleep)
    Try


        For I = 0 To 30
            system.threading.thread.sleep(p_sleept)
            P_antwa(I) = SerialPort1.ReadByte()
            If debug = 2 Then hs.writelog("Zonnepaneela " & I, P_antwa(I))
        Next

    Catch ex As Exception
    End Try
Eerst worden er 9 bytes ingelezen, dat gaat goed.
Bij de tweede write actie moeten er 30 bytes terug komen, maar dat zijn er dus altijd maar 15 of 16
Iemand een idee waarom niet alle bytes ingelezen worden?
Peter
http://www.pcgsm.nl/
labium
Advanced Member
Advanced Member
Posts: 512
Joined: Sat Feb 06, 2010 10:56 am
Location: netherlands

Re: Soladin 600

Post by labium »

il lees de virtuele seriele poort van mijn plugwise stick uit met dit idee als thread, en werkt minimaal 1 week goed. is wel c#.

Code: Select all

    public void hosttoclient()
        {
            while (Hconnected)
            {
                byte[] UsbHostReadBuffer = new byte[256];
                byte HostorClient = 2;
                int NumberOfReadBytes;

                NumberOfReadBytes = serialUSBHost.Read(UsbHostReadBuffer, 0, 256);

                if (NumberOfReadBytes > 0)
                {
                   // usbSerial.SerialLine.Write(UsbHostReadBuffer, 0, NumberOfReadBytes);

                    netmfcom.Write(UsbHostReadBuffer, 0, NumberOfReadBytes);

                    Debug.Print("stick:  " + NumberOfReadBytes.ToString());
                  

                    //cdcwrite1(UsbHostReadBuffer, NumberOfReadBytes, HostorClient);
                }
            }

            //Thread.Sleep(10);
        }
Last edited by labium on Sat Jan 19, 2013 5:28 pm, edited 1 time in total.
Digit
Global Moderator
Global Moderator
Posts: 3388
Joined: Sat Mar 25, 2006 10:23 am
Location: Netherlands
Contact:

Re: Soladin 600

Post by Digit »

Het zal er wel niks mee te maken hebben, maar waarom doe je een sleep als ReadByte() toch synchroon werkt (oftewel, die wacht tot er een byte is gelezen of geeft een timeout(exception))?
User avatar
Peterpc
Member
Member
Posts: 217
Joined: Sun Sep 30, 2007 12:54 pm
Location: Netherlands
Contact:

Re: Soladin 600

Post by Peterpc »

Ik heb al allerlei manieren geprobeerd en dat is blijven 'hangen' ; van een van de probeersels. De Ik zal het morgen eens proberen zonder die vertraging. De Ik kan helaas alleen maar testen als er voldoende licht is, kan anders werkt de soladin niet.
Peter
http://www.pcgsm.nl/
AshaiRey
Senior Member
Senior Member
Posts: 1310
Joined: Mon Feb 02, 2009 5:27 pm
Location: Netherlands
Contact:

Re: Soladin 600

Post by AshaiRey »

Bij de tweede write actie moeten er 30 bytes terug komen, maar dat zijn er dus altijd maar 15 of 16
Iemand een idee waarom niet alle bytes ingelezen worden?
Dat klinkt als het gebruiken van een verkeerde type variabele voor P_antwb(I). {er is niet genoeg code gepost om dit met zekerheid te zeggen}
Eentje dus die te klein is om 30 bits in op te slaan. Waarschijnelijk moet je een long of een double gebruik. Google anders eens op variabeltypen om te kijken welke je nodig heb.
Bram
User avatar
Peterpc
Member
Member
Posts: 217
Joined: Sun Sep 30, 2007 12:54 pm
Location: Netherlands
Contact:

Re: Soladin 600

Post by Peterpc »

Ik heb de variable getest of er 30 waarden konden worden opgeborgen en dat is geen probleem.
Dit is de volledige code voor het uitlezen van de poort:

Code: Select all

Sub Main(ByVal Params As String)
    Dim P_antwa(30) As Byte
    Dim P_antwb(8) As Byte
    Dim p_sleep
    Dim p_sleept
    Dim I, J, a, aa, b, c, d, da
    p_sleep = 0
    p_sleept = 0
    Dim debug, vraag

    Dim Serialport1 As New IO.Ports.SerialPort
    Dim P_rqa() As Byte = New Byte() {17, 0, 255, 255, 182, 0, 0, 0, 197}
    ' 11 00 AA AA 9A 00 00 00 FF gemeten {17, 0, 170, 170, 154, 0, 0, 0, 255} request voor actuele waarde 9
    Dim P_rqb() As Byte = New Byte() {17, 0, 170, 170, 154, 0, 0, 0, 255}
    ' 11 00 FF FF B6 00 00 00 C5 gemeten {17, 0, 255, 255, 182, 0, 0, 0, 197} request voor alle waarden 31


    debug = 2
    vraag = 0 '0 = eerste aanvraag overslaan
    SerialPort1.PortName = "COM4" 'zonnepaneel
    For I = 0 To 30 'test of alle bytes te beschrijven zijn
        P_antwa(I) = 0
    Next
    ' Set the read/write timeouts
    SerialPort1.ReadTimeout = 5000
    SerialPort1.WriteTimeout = 5000
    SerialPort1.ReadBufferSize = 2

    SerialPort1.Open()
    If vraag = 1 Then
        SerialPort1.Write(P_rqb, 0, P_rqb.Length)
        system.threading.thread.sleep(p_sleep)
        Try
            For I = 0 To 8
                system.threading.thread.sleep(p_sleept)
                P_antwb(I) = SerialPort1.ReadByte()
                If debug = 2 Then hs.writelog("Zonnepaneelb " & I, P_antwb(I))
            Next
        Catch ex As Exception
        End Try
        system.threading.thread.sleep(p_sleep)
    End If

    SerialPort1.Write(P_rqa, 0, P_rqa.Length)
    system.threading.thread.sleep(p_sleep)

    Try
        For I = 0 To 30
            system.threading.thread.sleep(p_sleept)
            P_antwa(I) = SerialPort1.ReadByte()
            If debug = 2 Then hs.writelog("Zonnepaneela " & I, P_antwa(I))
        Next
    Catch ex As Exception
    End Try
    SerialPort1.Close()
Als ik de poort test met het programma serial communication tester, dan wordt er elke keer keurig 30 bytes uitgelezen, zie bijgevoegd plaatje.
Maar met mijn VB script wil het maar niet lukken.
result.png
result.png (40.29 KiB) Viewed 6751 times
Peter
http://www.pcgsm.nl/
Digit
Global Moderator
Global Moderator
Posts: 3388
Joined: Sat Mar 25, 2006 10:23 am
Location: Netherlands
Contact:

Re: Soladin 600

Post by Digit »

Ehh, "0 TO 30" is toch 31 bytes proberen te lezen?
User avatar
Peterpc
Member
Member
Posts: 217
Joined: Sun Sep 30, 2007 12:54 pm
Location: Netherlands
Contact:

Re: Soladin 600

Post by Peterpc »

Het zijn inderdaad 31 bytes die moeten worden uitgelezen.
Peter
http://www.pcgsm.nl/
Digit
Global Moderator
Global Moderator
Posts: 3388
Joined: Sat Mar 25, 2006 10:23 am
Location: Netherlands
Contact:

Re: Soladin 600

Post by Digit »

OK... ik las overal het getal 30, als er dan idd maar 30 bytes komen dan gaat ie in een timeout want je probeert er 31 te lezen.
Post Reply

Return to “Homeseer Scripts Forum”