Erweiterung der XML-API - Version 1.2 ?

Nutzung von XML RPC, Remote Script, JSON RPC, XMLAPI

Moderator: Co-Administratoren

ultrah
Beiträge: 427
Registriert: 08.03.2010, 13:38
Hat sich bedankt: 6 Mal
Danksagung erhalten: 34 Mal

Re: Erweiterung der XML-API - Version 1.2 ?

Beitrag von ultrah » 01.06.2017, 17:55

Fleißig fleißig!

Fehlt nur noch Authentifizierung :mrgreen:

ultrah
Beiträge: 427
Registriert: 08.03.2010, 13:38
Hat sich bedankt: 6 Mal
Danksagung erhalten: 34 Mal

Re: Erweiterung der XML-API - Version 1.2 ?

Beitrag von ultrah » 17.12.2017, 23:14

Moin,

irgendwie stehe ich grade auf dem Schlauch. Eigentlich wollte ich nur einen dritten Parameter zu statelist.cgi hinzufügen, aber der Skript will bei mir dann einfach nicht laufen. Bei devicelist.cgi klappt es problemlos.

Wahrschenlich liegt es einfach daran dass ich keine Ahnung von TCL habe und auch nicht wie man es debuggt :D

Kann mir vielleicht mal jemand unter die Arme greifen?

Code: Alles auswählen

#!/bin/tclsh
load tclrega.so
puts -nonewline {Content-Type: text/xml
Access-Control-Allow-Origin: *

<?xml version="1.0" encoding="ISO-8859-1" ?><stateList>}

set ise_id 0
set show_internal 0
set show_remote 0

catch {
	set input $env(QUERY_STRING)
	set pairs [split $input &]
	foreach pair $pairs {
		if {0 != [regexp "^(\[^=]*)=(.*)$" $pair dummy varname val]} {
   			set $varname $val
   		}
	}
}

integer ise_id = "} $ise_id {";
integer show_internal = "} $show_internal {";
integer show_remote = "} $show_remote {";

if { ise_id != 0 } then {

  append comm {
        object obj = dom.GetObject(ise_id);
        if(obj.TypeName() == "HSSDP")
        {
            object oDP = obj;
            string dp = oDP.Name().StrValueByIndex(".", 2);

            Write("<datapoint");
            Write(" name='");WriteXML(oDP.Name());Write("'");
            Write(" type='");WriteXML(oDP.Name().StrValueByIndex(".", 2));Write("'");
            Write(" ise_id='");WriteXML(ise_id);Write("'");
            ! state fragt den aktuellen status des sensors/aktors ab, dauert lange
            if (show_internal == 1) {
                Write(" state='");WriteXML(oDP.State());Write("'");
            }
            ! value nimmt den von der ccu gecachten wert, moeglicherweise nicht korrekt. Ggf. bei einigen geraeten immer abfragen
            Write(" value='");WriteXML(oDP.Value());Write("'");
            Write(" valuetype='");WriteXML(oDP.ValueType());Write("'");
            Write(" timestamp='");WriteXML(oDP.Timestamp().ToInteger());Write("'");
            Write(" />");
        }
    }

} else {





append comm {

string sDevId;
string sChnId;
string sDPId;

	foreach (sDevId, root.Devices().EnumUsedIDs())
	{
		object oDevice   = dom.GetObject(sDevId);

		if( oDevice.ReadyConfig() && (oDevice.Name() != "Zentrale") && (oDevice.Name() != "HMW-RCV-50 BidCoS-Wir") )
		{
			Write("<device");
			Write(" name='" # oDevice.Name() # "'");
			Write(" ise_id='" # sDevId # "'");

			string interfaceid = oDevice.Interface();
			string servicechan = "" # dom.GetObject(interfaceid).Name() #"."#oDevice.Address()#":0";
			object schan = dom.GetObject(servicechan#".UNREACH");
			if(schan) { Write(" unreach='" # schan.Value() #"'"); }
			object schan = dom.GetObject(servicechan#".STICKY_UNREACH");
			if(schan) { Write(" sticky_unreach='" # schan.Value() #"'"); }
			object schan = dom.GetObject(servicechan#".CONFIG_PENDING");
			if(schan) { Write(" config_pending='" # schan.Value() #"'"); }
			
			Write(" >");  ! device tag schliessen

			foreach(sChnId, oDevice.Channels())
			{
				object oChannel = dom.GetObject(sChnId);
				if ( (! oChannel.Internal()) ||  oChannel.Internal()  )
				{

					Write("<channel name='");
					WriteXML( oChannel.Name() );
					Write("' ise_id='" # sChnId);					
					Write("' index='" # oChannel.ChnNumber());
					
					if (oChannel.Internal()) {
						Write("' visible='" );
						Write("' operate='");
						
					} else {
						Write("' visible='"); 
						WriteXML(oChannel.Visible());
						
						Write("' operate='");                        
						object o_sysVar = dom.GetObject(sChnId); 	
						if( o_sysVar.UserAccessRights(iulOtherThanAdmin) == iarFullAccess ) {
							Write("true");
						} else {
							Write("false");		
						} 
					}
					

					Write("'>");
					
					foreach(sDPId, oChannel.DPs().EnumUsedIDs())
					{
						object oDP = dom.GetObject(sDPId);
						if(oDP)
						{
							string dp = oDP.Name().StrValueByIndex(".", 2);

							if( (dp != "ON_TIME") && (dp != "INHIBIT") && (dp != "CMD_RETS") && (dp != "CMD_RETL") && (dp != "CMD_SETS") && (dp != "CMD_SETL") )
							{
								Write("<datapoint");
								Write(" name='"); WriteXML(oDP.Name());
								Write("' type='"); WriteXML(oDP.Name().StrValueByIndex(".", 2));
								Write("' ise_id='" # sDPId );
                                ! state fragt den aktuellen status des sensors/aktors ab, dauert lange
								if (show_internal == 1) {
                                        Write("' state='"); WriteXML(oDP.State());
                                }
                                ! value nimmt den von der ccu gecachten wert, moeglicherweise nicht korrekt. Ggf. bei einigen geraeten immer abfragen
								Write("' value='"); WriteXML(oDP.Value());
								Write("' valuetype='" # oDP.ValueType());
								Write("' valueunit='" # oDP.ValueUnit());
								Write("' timestamp='" # oDP.Timestamp().ToInteger());
								Write("' operations='" # oDP.Operations());
								Write("' />");
							}
						}
					}
					Write("</channel>");
				}
			}
			Write("</device>");
		}
	}

  }

  array set res [rega_script $comm]

  puts -nonewline $res(STDOUT)
}
puts -nonewline {</stateList>}



Benutzeravatar
Monty1979
Beiträge: 854
Registriert: 28.10.2010, 20:47
Wohnort: Bremen
Kontaktdaten:

Re: Erweiterung der XML-API - Version 1.2 ?

Beitrag von Monty1979 » 08.01.2018, 15:44

Hey,

wo hast du das denn her?

Code: Alles auswählen

integer ise_id = "} $ise_id {";
integer show_internal = "} $show_internal {";
integer show_remote = "} $show_remote {";
in unserem original steht doch das

Code: Alles auswählen

set comm "var ise_id=$ise_id;\n"
set comm "var show_internal=$show_internal;\n"

ultrah
Beiträge: 427
Registriert: 08.03.2010, 13:38
Hat sich bedankt: 6 Mal
Danksagung erhalten: 34 Mal

Re: Erweiterung der XML-API - Version 1.2 ?

Beitrag von ultrah » 09.01.2018, 04:00

Aus devicelist.cgi, ich wollte mal hier das parsing der Parameter vereinheitlichen. Außerdem hat es bei devicelist.cgi geklappt :mrgreen:

Siehe hier: https://github.com/hobbyquaker/XML-API/ ... st.cgi#L22

Ich mach vll mal einen Pull Request für die devicelist auf Github auf, dann diskutiert es sich einfacher.

Gibts eine Möglichkeit um diese Skripts zu debuggen oder eine Fehlerausgabe mit Zeilenangabe zu bekommen?

Benutzeravatar
Monty1979
Beiträge: 854
Registriert: 28.10.2010, 20:47
Wohnort: Bremen
Kontaktdaten:

Re: Erweiterung der XML-API - Version 1.2 ?

Beitrag von Monty1979 » 09.01.2018, 09:16

Moin,

ach so ja in der divecelist ist das drin.
Da funktioniert es aber nur so weil es in den

Code: Alles auswählen

array set res [rega_script { ... }
implementiert ist.
Bei der statelist wird ja erst am ende das

Code: Alles auswählen

array set res [rega_script $comm]
initialisiert.

Zum Testen bzw erstellen nehme ich immer von hobbyquaker das HQ WebUi. Da gibts eine schönen Editor unter dem Reiter Entwicklung.

Gruß Monty

Benutzeravatar
Monty1979
Beiträge: 854
Registriert: 28.10.2010, 20:47
Wohnort: Bremen
Kontaktdaten:

Re: Erweiterung der XML-API - Version 1.2 ?

Beitrag von Monty1979 » 09.01.2018, 09:22

Ach so,

also so sollte es gehen

Code: Alles auswählen

#!/bin/tclsh

load tclrega.so
puts -nonewline {Content-Type: text/xml
Access-Control-Allow-Origin: *

<?xml version="1.0" encoding="ISO-8859-1" ?><stateList>}

set ise_id 0
set show_internal 0
set show_remote 0

catch {
  set input $env(QUERY_STRING)
  set pairs [split $input &]
  foreach pair $pairs {
    if {0 != [regexp "^(\[^=]*)=(.*)$" $pair dummy varname val]} {
      set $varname $val      
    }    
  }
}

set comm "var ise_id=$ise_id;\n"
set comm "var show_internal=$show_internal;\n"
set comm "var show_remote=$show_remote;\n"

.....
if { $show_remote!= 0 } then {
....

Johnnyr
Beiträge: 5
Registriert: 01.02.2017, 14:01

Re: Erweiterung der XML-API - Version 1.2 ?

Beitrag von Johnnyr » 15.01.2018, 08:51

Ich hätte da mal ein Problem. Ich habe die Version 1.5 installiert und bei mir wir bei Zusatzsoftware auch die 1.5 angezeigt, wenn ich die Einstellungen aufrufe steht oben "XML-API Version 1.12", nur ein anzeige Fehler?

NI0X
Beiträge: 208
Registriert: 26.11.2017, 14:00

Re: Erweiterung der XML-API - Version 1.2 ?

Beitrag von NI0X » 15.01.2018, 11:18

Ist mir auch mal aufgefallen, scheint nur nicht geändert worden zu sein.

Johnnyr
Beiträge: 5
Registriert: 01.02.2017, 14:01

Re: Erweiterung der XML-API - Version 1.2 ?

Beitrag von Johnnyr » 15.01.2018, 12:46

Ok, danke!

ultrah
Beiträge: 427
Registriert: 08.03.2010, 13:38
Hat sich bedankt: 6 Mal
Danksagung erhalten: 34 Mal

Re: Erweiterung der XML-API - Version 1.2 ?

Beitrag von ultrah » 01.02.2018, 20:19

Monty1979 hat geschrieben:Ach so,

also so sollte es gehen

Code: Alles auswählen

#!/bin/tclsh

load tclrega.so
puts -nonewline {Content-Type: text/xml
Access-Control-Allow-Origin: *

<?xml version="1.0" encoding="ISO-8859-1" ?><stateList>}

set ise_id 0
set show_internal 0
set show_remote 0

catch {
  set input $env(QUERY_STRING)
  set pairs [split $input &]
  foreach pair $pairs {
    if {0 != [regexp "^(\[^=]*)=(.*)$" $pair dummy varname val]} {
      set $varname $val      
    }    
  }
}

set comm "var ise_id=$ise_id;\n"
set comm "var show_internal=$show_internal;\n"
set comm "var show_remote=$show_remote;\n"

.....
if { $show_remote!= 0 } then {
....
Danke! Ich bau da demnächst einen PR draus :)

Antworten

Zurück zu „Softwareentwicklung von externen Applikationen“