Meerdere UI Actions

Forum over Homeseer Plugin ontwikkelingen, hierin staan aparte forums voor bijvoorbeeld Plugwise, RFXcom, Fritzbox, Alphatronics etc.

Moderator: Digit

Meerdere UI Actions

Postby kriz83 » Thu Oct 25, 2012 8:11 pm

Hoi,

Ben ondertussen druk bezig met mijn plugin, maar ik het lukte me niet om meerdere acties correct toe te voegen.

De code:
Code: Select all
public String ActionUI(String action_string)
        {
            StringBuilder builder = new StringBuilder();

            //
            // RELAY
            //
            builder.Append("Extender Relay");

            // Select device
            builder.Append(string.Format("\t{0}\t{1}\t", (int)HSControlType.UI_DROP_LIST, "0"));
            builder.Append("Extender:");
            builder.Append(string.Format("\tExtender 1"));
            builder.Append(string.Format("\tExtender 2"));
            builder.Append(string.Format("\tExtender 3"));
            builder.Append("\r");


            //Relay Actions
            builder.Append(string.Format("\t\t{0}\t{1}\t", (int)HSControlType.UI_DROP_LIST, "0"));
            builder.Append("Action:");
            builder.Append(string.Format("\tRelay Open"));
            builder.Append(string.Format("\tRelay Close"));
            builder.Append(string.Format("\tRelay Toggle"));
            builder.Append("\r");

            //Relay Ports
            builder.Append(string.Format("\t\t{0}\t{1}\t", (int)HSControlType.UI_DROP_LIST, "0"));
            builder.Append("Relay:");
            builder.Append(string.Format("\t1"));
            builder.Append(string.Format("\t2"));
            builder.Append(string.Format("\t3"));
            builder.Append(string.Format("\t4"));
            builder.Append("\r");
            builder.Append("\t");

            //
            // PowerSense
            //
            builder.Append(string.Format("{0}{1}{2}", (char)1, IFACE_NAME, (char) 4));

            builder.Append("Extender PowerSense\t");
            builder.Append("Extender PowerSense");

            // Select device
            builder.Append(string.Format("\t{0}\t{1}\t", (int)HSControlType.UI_DROP_LIST, "0"));
            builder.Append("Extender:");
            builder.Append(string.Format("\tExtender 1"));
            builder.Append(string.Format("\tExtender 2"));
            builder.Append(string.Format("\tExtender 3"));
            builder.Append("\r");

            //Sensor Ports
            builder.Append(string.Format("\t\t{0}\t{1}\t", (int)HSControlType.UI_DROP_LIST, "0"));
            builder.Append("Sensor:");
            builder.Append(string.Format("\t1"));
            builder.Append(string.Format("\t2"));
            builder.Append(string.Format("\t3"));
            builder.Append(string.Format("\t4"));
            builder.Append("\r");

            return builder.ToString();
        }


Wanneer ik een PowerSense Actie (2de in de lijst) toevoeg, krijg ik volgende text in de functie ValidateActionUI:
Code: Select all
Extender | Extender PowerSense| - | Extender 1|1

Hier kan ik dus perfect filteren (Extender Powersense komt voor in de string)

Echter, voor de relay (de eerste actie uit de lijst) krijg ik het volgende:
Code: Select all
Extender| - | Extender 1 | Relay Open |1


Hoe komt het dat ik hier niet Extender Relay te zien krijg ?
Heb al vanalles geprobeerd, maar het wil maar niet lukken ...

Kan iemand me helpen ?

Bedankt !
Kristof
HomeSeer - PlugWise - RFXComm - Philips Pronto TSU9800/9600/9300
kriz83
Member
Member
 
Posts: 200
Joined: October 2012
Location: Belgium

Re: Meerdere UI Actions

Postby Digit » Thu Oct 25, 2012 11:24 pm

Hi Kristof,

Sorry, maar welke Plugin? Ik lees zo ongeveer alles op dit forum (en bemoei me ook overal mee :lol: ), maar ben het even kwijt.

Vergeet niet dat als je bepaalde dingen gaat uitbreiden, je in een voorbeeld-plugin die je hebt gekregen (dat herinner ik me dan nog wel) misschien bepaalde dingen kunt missen die wel noodzakelijk zijn maar die niet altijd uit de example code hoeven te blijken. Dan moet je dus teruggrijpen op de docu van Homeseer (die o zo lekker werkt...).
Bij de TriggerUI (ik ga er vanuit dat je deze http://homeseer.com/support/homeseer/De ... In_SDK.htm wel kent) staat hoe het in elkaar moet steken.
En eigenlijk is het zo: de documentatie van HS is fout of je doet zelf iets niet goed... zo simpel is het vaak :wink:

Kom je er na uren lang puzzelen nog niet uit, dan zou het een goed idee zijn om bv. aan te tonen dat je precies doet wat er volgens HS van je wordt gevraagd, maar dat het nog steeds niet werkt...
En dan wordt het interessant!
User avatar
Digit
Global Moderator
Global Moderator
 
Posts: 3388
Joined: March 2006
Location: Netherlands

Re: Meerdere UI Actions

Postby kriz83 » Fri Oct 26, 2012 7:08 am

Hoi Robert,

Het gaat om een plugin voor het aansturen van een bakje met Relays en PowerSensors.

Ik heb inderdaad de SDK gelezen, alsook enkele voorbeelden bekeken, maar ik krijg het na enkele uren nog steeds niet goed...
HomeSeer - PlugWise - RFXComm - Philips Pronto TSU9800/9600/9300
kriz83
Member
Member
 
Posts: 200
Joined: October 2012
Location: Belgium

Re: Meerdere UI Actions

Postby AshaiRey » Fri Oct 26, 2012 9:40 am

Sorry ik heb mijn code niet bij de hand om te checken maar volgens mij moet je een groep afsluiten met een builder.Append("\t"); zoals gedaan bij //Relay ports. Zodra ik weer thuis ben zal ik eens spitten voor je.
Bram
AshaiRey
Senior Member
Senior Member
 
Posts: 1301
Joined: February 2009
Location: Netherlands

Re: Meerdere UI Actions

Postby kriz83 » Fri Oct 26, 2012 9:54 am

Hartelijk dank Bram.
Zal het straks eens proberen !
HomeSeer - PlugWise - RFXComm - Philips Pronto TSU9800/9600/9300
kriz83
Member
Member
 
Posts: 200
Joined: October 2012
Location: Belgium

Re: Meerdere UI Actions

Postby AshaiRey » Fri Oct 26, 2012 11:24 am

Ik heb mijn plugin gedaan in VB omdat ik hier meer voorbeelden voor beschikbaar had. Echter de ActionUI opbouw verloopt hetzelfde. Je moet wel een paar VB dingen vertalen naar C#

Ik heb ondervonden dat de vbTab's belangrijk zijn omdat deze als scheiding worden gebruikt

vbCr = "\r"
vbLf = "\n"
vbCrLf = "\r\n"
vbTab = "\t" ofwel ansi 09

Nog een opmerking
' first entry for drop lists must be "No Action" or an empty string. Index 0 into this control
' is always a no action
' For text controls, an empty string indicates no action

VB code voorbeeld
Code: Select all

Bij de 2e set heb ik meet detail info gezet.

         sbAUI.Append("ZMC - Schakelen") <-- De 1e actie die op de action pagina te kiezen is
        ' Zone selection.
        sbAUI.Append(vbTab & UI_DROP_LIST & vbTab & Attributes & vbTab)
        sbAUI.Append("Locatie:")
        sbAUI.Append(vbTab & "No Action")
        For i = 0 To MAX_ZONES
            sbAUI.Append(vbTab & ZoneNames(i))
        Next
        sbAUI.Append(vbTab & "Alles")
        sbAUI.Append(vbCr)

        'Opties selectie box AAN/UIT
        sbAUI.Append(vbTab)
        sbAUI.Append(vbTab & UI_DROP_LIST & vbTab & CATTR_ALLOW_TEXT_ENTRY & vbTab)
        sbAUI.Append("Opties zijn AAN/UIT")
        sbAUI.Append(vbTab & "No Action")
        sbAUI.Append(vbTab & "AAN" & vbTab & "UIT")
        sbAUI.Append(vbCr)
...
De volgende actie set
...

       ' 2nd action set.
        sbAUI.Append(Chr(1) & IFACE_NAME & Chr(4)) <-- ieder volgende actie die toegevoegd wordt begint met een Char(1) de naam van de interface (ZMC in mijn geval) en een Char(4)
        sbAUI.Append("ZMC - Kies bron" & vbTab)   <--- Deze komt voor op de pagina waarop je de actie kan kiezen
        sbAUI.Append("ZMC - Kies bron")     <-- Dit is de header text op de daaropvolgende detail pagina van de actie
        sbAUI.Append(vbTab & UI_DROP_LIST & vbTab & Attributes & vbTab)  <-- Dit is de dropdown lijst definitie. Het object en de kader om de vraag selectie dus.
        sbAUI.Append("Bron:<br><i><b>A</b> wordt meestal voor omroep gebruikt en <b>B</b> is de default voor muziek</i>") <-- De beschrijving van de komende actie
        sbAUI.Append(vbTab & "No Action") <-- 1e regel van de vulling van de dropdown lijst
        sbAUI.Append(vbTab & "A")
        sbAUI.Append(vbTab & "B") <- 3e regel
        sbAUI.Append(vbCr) <-- Afsluiting van deze actie regel

       sbAUI.Append(vbTab)  <-- Hierna volgt nog een TAB om alles af te sluiten
        Return sbAUI.ToString
Bram
AshaiRey
Senior Member
Senior Member
 
Posts: 1301
Joined: February 2009
Location: Netherlands

Re: Meerdere UI Actions

Postby kriz83 » Fri Oct 26, 2012 11:48 am

Hey Bram, bedankt.

Van zodra ik thuis ben ga ik het proberen.
Maar kijg je in de ValidateActionUI dan ook de string 'ZMC - Schakelen' uitschakelen te zien ?

Want de acties komen bij mij wel gewoon goed in de lijst, het is enkel in de ValidateAction dat de 'actie' ontbreekt voor de eerste actie uit de lijst.
HomeSeer - PlugWise - RFXComm - Philips Pronto TSU9800/9600/9300
kriz83
Member
Member
 
Posts: 200
Joined: October 2012
Location: Belgium

Re: Meerdere UI Actions

Postby AshaiRey » Fri Oct 26, 2012 12:24 pm

Hoi Kristof,
Ik ga er vanuit dat je VB wel kan volgen en heb daarom de functie hieronder gezet zoals ik hem gebruikt.
Feitelijk doe ik er niets in. Dat hoeft ook niet want je kan alleen waardes kiezen uit lijstjes waardoor de gekozen waarden altijd correct zijn en niet gevalideerd hoeven te worden. (mits je ze natuurlijk correct opzet in de code)

Code: Select all
   Public Function ValidateActionUI(ByRef actionstr As String) As String
        Dim items() As String

        If actionstr Is Nothing Then Return ""
        If actionstr.Trim = "" Then Return ""
        If InStr(actionstr, Chr(2)) = 0 Then Return "Invalid action string passed to ValidateActionUI"

        items = Split(actionstr, Chr(2))

        If UBound(items) < 2 Then   ' This is determined by the number of controls in your ActionUI
            Return "Invalid action string passed to ValidateActionUI"
        End If

        Return "" ' actions are OK
      End Function
Bram
AshaiRey
Senior Member
Senior Member
 
Posts: 1301
Joined: February 2009
Location: Netherlands

Re: Meerdere UI Actions

Postby kriz83 » Fri Oct 26, 2012 12:50 pm

Hey Bram,

Dat klopt inderdaad. Maar die string die als parameter meekomt in die functie, is toch ook die die meekomt als je een actie effectief uitvoert of niet ?
Ik wil namelijk wel weten WELKE actie er uitgevoerd wordt :-)

Alvast bedankt voor je tijd !
HomeSeer - PlugWise - RFXComm - Philips Pronto TSU9800/9600/9300
kriz83
Member
Member
 
Posts: 200
Joined: October 2012
Location: Belgium

Re: Meerdere UI Actions

Postby AshaiRey » Fri Oct 26, 2012 1:11 pm

Hoi Kristof,

Nu komen we ergens, je wilt dus weten welke actie er uitgevoerd moet worden.
Dat doe je dus in TriggerAction()
Daar komt de action string binnen en die kan je dan gaan parsen. Ik heb weer een stukje VB code hieronder geplakt. Ik weet dat je C# wilt hebben maar die heb ik niet voorhanden voor je in werkende vorm.

Dit is alleen het bovenste stukje van de SUB zodat je kan zien hoe verschillende acties afgevangen kunnen worden.
Ik verzamel eerst allerlei waarden die ik later gebruik in een SELECT CASE action en zo de action afvang en de bijbehorende functie afroep met de benodigde parameter(s).

Code: Select all
    ' When an HS event is triggered, and the action is set to control this plugin, this function
    ' is called. The passed string is a chr(2) seperated list of actions in the order as added with ActionUI
    Public Sub TriggerAction(ByRef actionstr As String)
        If Debug >= DEBUG_LOW Then hs.WriteLog(IFACE_NAME, "HSPI.TriggerAction called - Action string : " & actionstr)
        Dim actions() As String
        Dim ZoneName As String = ""
        Dim action As String = ""
        Dim message As String = ""
        Dim Radio As String = ""
        Dim TriggerTime As Integer = -1
        Dim Voice As String = ""
        Dim NewVolume As Integer = -1
        Dim WavFile As String = ""
        Dim i As Short

        If actionstr Is Nothing Then Exit Sub
        If InStr(actionstr, Chr(2)) = 0 Then Exit Sub

        actions = Split(actionstr, Chr(2))
        ' index 0 = plugin name
        ' index 1 = not used
        ' index 2 = first action
        ' index 3 = second action, etc.
        If Debug = DEBUG_HIGH Then
            For i = 0 To UBound(actions)
                hs.WriteLog(IFACE_NAME, "HSPI.TriggerAction value " & i.ToString & ":" & actions(i))
            Next
        End If
        If UBound(actions) < 2 Then
            hs.WriteLog(IFACE_NAME, "Bad action string passed to TriggerAction.")
            Exit Sub
        End If

        'Controleer eerst de condities
        'Schakelen
        If actions(0) = "ZMC" Then
            ZoneName = actions(2).ToUpper().Trim
            action = actions(3).ToUpper().Trim
            TriggerTime = Val(actions(5).Trim)
            If TriggerTime > 28800 Then TriggerTime = 28800 '8 uur
            If TriggerTime < 1 Then TriggerTime = 1
            If actions(4) <> "" Then
                NewVolume = Val(actions(4).Trim)
                If NewVolume < 0 Then NewVolume = 0
                If NewVolume > 63 Then NewVolume = 63
                action = "VOLUME"
            End If
        End If

        'Kies bron
        If InStr(actions(0).ToUpper(), "ZMC - KIES BRON") > 0 Then
            ZoneName = actions(3).ToUpper().Trim
            If actions(2).ToUpper().Trim = "A" Then
                action = "BRON A"
            Else
                action = "BRON B"
            End If
        End If

        'Bericht omroepen
        If InStr(actions(0).ToUpper(), "ZMC - BERICHT OMROEPEN") > 0 Then
            ZoneName = actions(4).ToUpper().Trim
            message = actions(2).Trim
            TriggerTime = Val(actions(5).Trim)
            NewVolume = Val(actions(6).Trim)
            WavFile = actions(7).ToUpper().Trim
            action = "OMROEP"
            If UCase(actions(3).ToUpper().Trim <> "NO ACTION") Then
                message = "<voice required='Name=" & actions(3) & "'>" & message
            End If
            If Debug = DEBUG_HIGH Then hs.WriteLog(IFACE_NAME, "##" & message & "##")
        End If

Bram
AshaiRey
Senior Member
Senior Member
 
Posts: 1301
Joined: February 2009
Location: Netherlands

Re: Meerdere UI Actions

Postby kriz83 » Fri Oct 26, 2012 3:26 pm

Mmmm, het wil maar niet lukken.

Komt goed in de lijst etc, maar voor relay ontbreekt er dus een stukje tekst in de action string die je meekrijgt in die functies.

Heb de wijzigingen gedaan zoals hier boven vermeld :-(
HomeSeer - PlugWise - RFXComm - Philips Pronto TSU9800/9600/9300
kriz83
Member
Member
 
Posts: 200
Joined: October 2012
Location: Belgium

Re: Meerdere UI Actions

Postby kriz83 » Fri Oct 26, 2012 3:52 pm

Heb even een slimmed down versie gemaakt:
Code: Select all
StringBuilder builder = new StringBuilder();

            // Action 1
            builder.Append("Action 1");
            builder.Append(string.Format("\t{0}\t{1}\t", (int)HSControlType.UI_DROP_LIST, "0"));
            builder.Append("State:");
            builder.Append(string.Format("\tOn"));
            builder.Append(string.Format("\tOff"));
            builder.Append("\r");

            // Action 2
            builder.Append(string.Format("{0}{1}{2}", (char)1, IFACE_NAME, (char)4));
            builder.Append("Action 2\t");
            builder.Append("Action 2");
            builder.Append(string.Format("\t{0}\t{1}\t", (int)HSControlType.UI_DROP_LIST, "0"));
            builder.Append("true:");
            builder.Append(string.Format("\tyes"));
            builder.Append(string.Format("\tno"));
            builder.Append("\r");

            builder.Append("\t");


De string die binnenkomt bij triggeraction (eerst actie 1, daarna 2):
Code: Select all
Extender | - | On
Extender | Action 2 | - | yes
HomeSeer - PlugWise - RFXComm - Philips Pronto TSU9800/9600/9300
kriz83
Member
Member
 
Posts: 200
Joined: October 2012
Location: Belgium

Re: Meerdere UI Actions

Postby AshaiRey » Sat Oct 27, 2012 9:17 am

Volgens mij gaat het hier fout

>first entry for drop lists must be "No Action" or an empty string. Index 0 into this control is always a no action

Code: Select all
  // Action 1
            builder.Append("Action 1");
            builder.Append(string.Format("\t{0}\t{1}\t", (int)HSControlType.UI_DROP_LIST, "0"));
            builder.Append("State:");
builder.Append(string.Format("\tNo Action"));  // Toegevoegd
            builder.Append(string.Format("\tOn"));
            builder.Append(string.Format("\tOff"));
            builder.Append("\r");

Bram
AshaiRey
Senior Member
Senior Member
 
Posts: 1301
Joined: February 2009
Location: Netherlands

Re: Meerdere UI Actions

Postby kriz83 » Sat Oct 27, 2012 4:13 pm

Gevonden ...
in de SDK staat dus:
If the action string contains a Chr(4) character, then your plug-in has two action pages, and TriggerAction is being called for the 2nd action page.


Ander vraagje ... Ik heb nu dus mijn plugin, maar met diezelfde plugin wil ik meerdere 'instances' bedienen...
Ik bedoel hiermee, ik heb meerdere van die bakjes hier staan, maar hoe kan ik het maken dat ik op een pagina een 'extender device' kan bijmaken ?

ConfigDevice2 ? Maar hoe maak ik daar een device bij aan ?
HomeSeer - PlugWise - RFXComm - Philips Pronto TSU9800/9600/9300
kriz83
Member
Member
 
Posts: 200
Joined: October 2012
Location: Belgium

Re: Meerdere UI Actions

Postby AshaiRey » Sat Oct 27, 2012 4:59 pm

Phoe hé! Het is voor mij ook alweer zo'n 2 jaar geleden hoor. Dat wordt diep graven in de code. :-)
Ik weet nog dat ik een hele boel tijd hier aan heb verspilt om config schermen en dergelijke te maken. Ik heb toen een stap terug gedaan en tegen mezelf gezegt 'wat wil je nu doen en wie moet het doen' Het antwoord hierop was dat mijn plugin mijn specifieke hardware moest aansturen en het was alleen voor mij bedoelt. Mede doordat niemand anders zo'n configuratie heeft. Als je dat in gedacht houd begrijp je ook dat ik alleen een help pagina hebt als documentatie. Op de config pagina kan je alleen het debug level instellen en verder niets. Ik laat alles automatisch voor mij regelen door de plugin omdat ik hier een voor mij bekende omgeving heb. Kijk dan wordt het opeens een stuk makkelijker. :-)

als het goed is heb je ook een file waarin definities staan en initialisaties. In de VB versie heet deze module.vb, hoe die voor de C# versie heet weet ik niet. Tot nu toe hebben de functies dezelfde naamgevingen dus ga ik er nu ook van uit. In de functie InitHW() lees ik alles settings in uit het ini bestand. Daarna ga ik naar een subroutine die CreateDevice() heet. Deze heb ik geloof ik zelf gemaakt. Hier controleer ik of de devices bestaan, zo niet dan maak ik alle benodigde devices en bijbehorende buttons aan. Deze zijn later dan gewoon in de plugin te gebruiken.
Bram
AshaiRey
Senior Member
Senior Member
 
Posts: 1301
Joined: February 2009
Location: Netherlands

Next

Return to Homeseer Plugins Forum

Who is online

Users browsing this forum: No registered users and 1 guest