tcl-Script

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

home-frank
Beiträge: 59
Registriert: 24.03.2009, 15:22

Re: tcl-Script

Beitrag von home-frank » 27.06.2009, 00:14

chii hat geschrieben:versuch' mal folgendes:

Code: Alles auswählen

#!/bin/tclsh
load tclrega.so

rega_script {dom.GetObject("gstatk1").State(3);}
das funktioniert !
kann ich meine Scripte dann einfach in rega_script einklammern ?

Code: Alles auswählen

rega_script  {
viele Zeilen Script;
nochmerh..;
}

dirch
Beiträge: 579
Registriert: 24.10.2008, 03:26
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Re: tcl-Script

Beitrag von dirch » 27.06.2009, 00:37

Huch, das hatte ich ja total uebersehen :oops:

Ja, einfach in rega_script { } einklammern.
Neun von zehn Stimmen in meinen Kopf sagen ich bin nicht verrückt. Die andere summt die Melodie von Tetris . ...

home-frank
Beiträge: 59
Registriert: 24.03.2009, 15:22

Re: tcl-Script

Beitrag von home-frank » 27.06.2009, 11:00

OK, Danke.

Achso, noch ne Frage, müssen dann normale Tcl-Anweisungen von HM-Anweisungen getrennt werden?, wahrscheinlich...
also:

Code: Alles auswählen

#!/bin/tclsh
load tclrega.so
rega_script {dom.GetObject("gstatk1").State(3);}
tcl-Anweisung;
rega_script {HM-Anweisung;}tcl-Anweisung;
oder dürfen normale Tcl-Anweisungen auch innerhalb der regascriptklammern stehen?

gr.
frank

dirch
Beiträge: 579
Registriert: 24.10.2008, 03:26
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Re: tcl-Script

Beitrag von dirch » 27.06.2009, 12:44

Innerhalb der rega_script klammern (oder anfuehrungszeichen) darf lediglich CCU Skript Code stehen, normale TCL Anweisungen sind da nicht erlaubt.

Ach ja, rega_script liefert ein array (von rueckgabewerten) zurueck:

Code: Alles auswählen

array set result [rega_script $isecmd]
array set result [rega_script "$cmd"]
set stdout [split $result(STDOUT) "\n"]
array set result [rega_script "system.LogLevel();"]
Alternativ kann man auch noch rega nutzen, offenbar liefert das direkt den Rueckgabewert eines CCU Befehls zurueck:

Code: Alles auswählen

set cur_level [rega system.LogLevel()]
set value [rega dom.GetObject(5555).Value()]
Gruss,
Dirch
Neun von zehn Stimmen in meinen Kopf sagen ich bin nicht verrückt. Die andere summt die Melodie von Tetris . ...

home-frank
Beiträge: 59
Registriert: 24.03.2009, 15:22

Re: tcl-Script

Beitrag von home-frank » 27.06.2009, 21:47

Hallo Dirch,
Deine letzten Hinweise zwingen mich zum nachdenken, eigentlich wollte ich das Schritt für Schritt machen aber vielleicht sollte ich die Grundsätze vorher verstehen, ich komme nochmal auf dein Wetter-XML-Scripthttp://homematic-forum.de/forum/viewtop ... =19&t=2853 zurück :
in dem proc SetSystemVariable speicherst Du also eigentlich das HM-Script, welches Du in der Zeile array set result [rega_script $command] ausführst.
Du baust also in Tcl erst einen "Text" zusammen um die HM-Anweisungen und die Tcl-Variablen zu "verknüpfen" und startest dann erst mit [rega_script ...] die Abarbeitung.(?)
---
Und damit mein Tcl-Script mit werten aus dem HM-Raum arbeiten kann, hole ich die zuerst alle nach dem Beispiel:
set value [rega dom.GetObject(meine_HM_Variable).Value()]
----
das

Code: Alles auswählen

array set result [rega_script $isecmd]
array set result [rega_script "$cmd"]
set stdout [split $result(STDOUT) "\n"]
array set result [rega_script "system.LogLevel();"]
habe ich nicht ganz verstanden, aber wenn ich nach der Methode wie oben alles machen kann bin ich schon weiter.

gr.
frank

dirch
Beiträge: 579
Registriert: 24.10.2008, 03:26
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Re: tcl-Script

Beitrag von dirch » 29.06.2009, 09:50

home-frank hat geschrieben: ....
in dem proc SetSystemVariable speicherst Du also eigentlich das HM-Script, welches Du in der Zeile array set result [rega_script $command] ausführst.
Du baust also in Tcl erst einen "Text" zusammen um die HM-Anweisungen und die Tcl-Variablen zu "verknüpfen" und startest dann erst mit [rega_script ...] die Abarbeitung.(?)
Ganz genau, da man TCL und CCU Skript Code nicht mischen kann baue ich mir in TCL den CCU Code als string zusammen, den ich dann ueber rega_script ausfuehre.
home-frank hat geschrieben: Und damit mein Tcl-Script mit werten aus dem HM-Raum arbeiten kann, hole ich die zuerst alle nach dem Beispiel:
set value [rega dom.GetObject(meine_HM_Variable).Value()]
Ja, das ist eine Moeglichkeit, oder Du holst Dir gleich alle Werte in einem Rutsch:

Code: Alles auswählen

array set values [rega_skript { 
var v1 = dom.GetObject(meine_HM_Variable1).Value();
var v2 = dom.GetObject(meine_HM_Variable2).Value();
var v3 = dom.GetObject(meine_HM_Variable3).Value();
} ]
Nun kannst Du im TCL Code ueber das values array auf die Werte zugreifen:

Code: Alles auswählen

set variablenwert1 $values(v1)
set variablenwert2 $values(v2)
.....
home-frank hat geschrieben: das

Code: Alles auswählen

array set result [rega_script $isecmd]
array set result [rega_script "$cmd"]
set stdout [split $result(STDOUT) "\n"]
array set result [rega_script "system.LogLevel();"]
habe ich nicht ganz verstanden, aber wenn ich nach der Methode wie oben alles machen kann bin ich schon weiter.
Das sollten nur ein paar Beispiele sein wie man noch CCU code ueber rega_script ausfuehren kann und wie man an die Ergebnisse kommt.

Gruss,
Dirch
Neun von zehn Stimmen in meinen Kopf sagen ich bin nicht verrückt. Die andere summt die Melodie von Tetris . ...

home-frank
Beiträge: 59
Registriert: 24.03.2009, 15:22

Re: tcl-Script

Beitrag von home-frank » 29.06.2009, 10:00

OK, Danke,
jetzt hab ich erstmal genug Material zum probieren.
gr. frank

dirch
Beiträge: 579
Registriert: 24.10.2008, 03:26
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Re: tcl-Script

Beitrag von dirch » 29.06.2009, 12:18

Ach ja, ich hab den Code ungetestet einfach so runtergeschrieben, da koennen durchaus Fehler drin sein - daher alles ohne Gewähr.
Neun von zehn Stimmen in meinen Kopf sagen ich bin nicht verrückt. Die andere summt die Melodie von Tetris . ...

home-frank
Beiträge: 59
Registriert: 24.03.2009, 15:22

Re: tcl-Script

Beitrag von home-frank » 29.06.2009, 18:56

dirch hat geschrieben:Ach ja, ich hab den Code ungetestet einfach so runtergeschrieben, da koennen durchaus Fehler drin sein - daher alles ohne Gewähr.
Kein Problem, ich versuche den Code zu kapieren, nicht zu kopieren.

Christoph
Beiträge: 283
Registriert: 28.07.2007, 13:12

Re: tcl-Script

Beitrag von Christoph » 18.07.2009, 15:35

Hi,

ich versuche auch gerade mal ein tcl Script zu erstellen. Ich habe aber noch immer nicht begriffen, wie ich an die Werte der HM-Commandos komme. Egal was ich probiere es klappt nicht.

Ansonsten kann ich aber Geräte schalten Variablen setzen... Nur eben ich bekomme keine Rückmeldung.

Anbei ein Testscript:

Code: Alles auswählen

#!/bin/tclsh
load tclrega.so

array set values [rega_script {
var weck=dom.GetObject("Weckzeit").Variable();
var set_weck=dom.GetObject("Weckzeit").State(900);]
}]

set x=$values(weck)
set x=$values(set_weck)
set y 12345678

puts "Das Ergebnis"
puts "Weck = $weck"
puts "SetWeck= $set_weck"
puts "y = $y"
y wird korrekt ausgegeben. Aber die Ergebnisse der HM Befehle führen zu einem Fehler. Wenn ich dann direkt $values(weck) ausgebe erhalte ich null.

Wie sieht es denn aus, wenn ich nur einen HM Befehl habe und den per:
#!/bin/tclsh
load tclrega.so

set set_weck rega_script {var set_weck=dom.GetObject("Weckzeit").State(800);}

puts "Das Ergebnis"
puts "SetWeck= $set_weck"
puts "y = $y"
versuche das abzufragen? Hier bekomme ich den Fehler angezeigt, dass der Variablenwert fehlt. Das bedeutet wohl, dass rega_script nichts zurückliefert.

Auch wenn ich nur: set set_weck rega_script {dom.GetObject("Weckzeit").State(800);} benutze, liefert rega_script kein Ergebnis.

Dann hätte ich noch eine ganz wichtige Frage!
Ich möchte gerne das Script aufrufen und Parameter übergeben. Wie geht das und in welchen Variablen knn ich die Parameter später auslesen?
Ciao, Christoph.

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“