Page 1 of 2
Meerdere UI Actions
Posted: Thu Oct 25, 2012 9:11 pm
by kriz83
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
Re: Meerdere UI Actions
Posted: Fri Oct 26, 2012 12:24 am
by Digit
Hi Kristof,
Sorry, maar welke Plugin? Ik lees zo ongeveer alles op dit forum (en bemoei me ook overal mee
), 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
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!
Re: Meerdere UI Actions
Posted: Fri Oct 26, 2012 8:08 am
by kriz83
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...
Re: Meerdere UI Actions
Posted: Fri Oct 26, 2012 10:40 am
by AshaiRey
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.
Re: Meerdere UI Actions
Posted: Fri Oct 26, 2012 10:54 am
by kriz83
Hartelijk dank Bram.
Zal het straks eens proberen !
Re: Meerdere UI Actions
Posted: Fri Oct 26, 2012 12:24 pm
by AshaiRey
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
Re: Meerdere UI Actions
Posted: Fri Oct 26, 2012 12:48 pm
by kriz83
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.
Re: Meerdere UI Actions
Posted: Fri Oct 26, 2012 1:24 pm
by AshaiRey
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
Re: Meerdere UI Actions
Posted: Fri Oct 26, 2012 1:50 pm
by kriz83
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 !
Re: Meerdere UI Actions
Posted: Fri Oct 26, 2012 2:11 pm
by AshaiRey
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
Re: Meerdere UI Actions
Posted: Fri Oct 26, 2012 4:26 pm
by kriz83
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
Re: Meerdere UI Actions
Posted: Fri Oct 26, 2012 4:52 pm
by kriz83
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
Re: Meerdere UI Actions
Posted: Sat Oct 27, 2012 10:17 am
by AshaiRey
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");
Re: Meerdere UI Actions
Posted: Sat Oct 27, 2012 5:13 pm
by kriz83
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 ?
Re: Meerdere UI Actions
Posted: Sat Oct 27, 2012 5:59 pm
by AshaiRey
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.