HM Skript mittels Timer auslösen.

Anbindung von FS20-Komponenten, ELV-Wetterstationen, EnOcean und DMX an HomeMatic

Moderator: Co-Administratoren

Antworten
Arthy
Beiträge: 103
Registriert: 17.12.2014, 00:03
System: CCU
Danksagung erhalten: 1 Mal

HM Skript mittels Timer auslösen.

Beitrag von Arthy » 15.03.2019, 18:36

Hallo Leute,

ich wollte mal fragen, ob es auch möglich ist mittels Timer ein normales Skript auszulösen. Das tcl geht weiß ich für das normale CCU Skript habe ich nichts gefunden. Ich wollte mittels cuxd timer sowohl ein tcl als auch normales Skript auslösen. Gibt es da eine Möglichkeit?
Das Programm sollte wie unten aussehen, nur dass das zweite Skript auch periodisch nach der TCL Datei ausgelöst wird.

Dankeschön

Gruß
Arthy
Druck.jpg
Zuletzt geändert von Arthy am 16.03.2019, 20:19, insgesamt 1-mal geändert.

Benutzeravatar
uwe111
Beiträge: 4820
Registriert: 26.02.2011, 22:22
Hat sich bedankt: 3 Mal
Danksagung erhalten: 245 Mal
Kontaktdaten:

Re: HM Skript mittels Timer auslösen.

Beitrag von uwe111 » 16.03.2019, 16:56

Hallo Arthy,

Bitte füge beim nächsten Mal einen besseren Screenshot an.
Arthy hat geschrieben:
15.03.2019, 18:36
ich wollte mal fragen, ob es auch möglich ist mittels Timer ein normales Skript auszulösen. Das tcl geht weiß ich für das normale CCU Skript habe ich nichts gefunden. Ich wollte mittels cuxd timer sowohl ein tcl als auch normales Skript auslösen. Gibt es da eine Möglichkeit?
Ich weiß zwar nicht, wo Du nachgeschaut hast, aber in der CUxD Doku habe ich das mit Beispielen beschrieben.
Arthy hat geschrieben:
15.03.2019, 18:36
Das Programm sollte wie unten aussehen, nur dass das zweite Skript auch periodisch nach der TCL Datei ausgelöst wird.
Welches TCL Script?

Viele Grüße

Uwe
Alle sagten: Das geht nicht. Dann kam einer, der wußte das nicht und hat's einfach gemacht.
SPENDEN :wink: Download: CUxD 2.11, SSH KeyDir

Arthy
Beiträge: 103
Registriert: 17.12.2014, 00:03
System: CCU
Danksagung erhalten: 1 Mal

Re: HM Skript mittels Timer auslösen.

Beitrag von Arthy » 16.03.2019, 21:34

Hallo Uwe,

vielen Dank für deine Antwort. Den Screenshot habe ich bereits in besserer Qualität oben hochgeladen. Ich versuche mein Problem noch einmal zu präzisieren. Also ich weiß, dass ich mittel des CUxD Timers CMD_Exec einfach ein tcl Skript aufrufen kann. Genau das mache ich auch oben im Programm in dem "Dann" Abschnitt alle 60s (siehe unten). Damit hole ich mir ein paar Daten aus einer Api und packe sie in Sysvariablen. Unmittelbar danach würde ich aber gerne noch ein HM Skript ausführen, das im gleichen Zyklus, wie das tcl Skript abläuft. Ich wollte halt fragen, ob ich das auch mittels des CUxD Timers realisieren kann. Dann würde ich halt direkt nach dem ersten Aufruf im Dann-Abschnitt noch einmal den Timer aufrufen, nur halt mit dem HM Skript, falls man es mittels CUxD aufrufen kann.
Hintergrund des Ganzen ist, dass ich im tcl Skript die Daten aus der Api nicht wie gewünscht umgerechnet in die Sysvariablen kriege. Daher danach noch das HM Skript, wo ich mir die Daten noch einmal umrechne und sie in die finalen Sysvariablen reinschreibe. Ich hoffe ich konnte es etwas verständlicher darstellen.

Besten Dank

Gruß
Arthy

tcl.jpg

Benutzeravatar
uwe111
Beiträge: 4820
Registriert: 26.02.2011, 22:22
Hat sich bedankt: 3 Mal
Danksagung erhalten: 245 Mal
Kontaktdaten:

Re: HM Skript mittels Timer auslösen.

Beitrag von uwe111 » 17.03.2019, 06:56

Hallo Arthy,
Arthy hat geschrieben:
16.03.2019, 21:34
Unmittelbar danach würde ich aber gerne noch ein HM Skript ausführen, das im gleichen Zyklus, wie das tcl Skript abläuft. Ich wollte halt fragen, ob ich das auch mittels des CUxD Timers realisieren kann.
Ja, Du kannst Dein HM-Script z.B. direkt in Dein TCL-Script einbetten, oder in ein zweites TCL-Script und dieses unmittelbar nach dem ersten TCL-Script in der CMD_EXEC-Befehlszeile (per Semikolon getrennt) aufrufen.

Für die Einbindung von HM-Script in TCL-Script kannst Du Dir Beispiele im cuxd/extra/ Verzeichnis ansehen (z.B. timer.tcl).

Viele Grüße

Uwe
Alle sagten: Das geht nicht. Dann kam einer, der wußte das nicht und hat's einfach gemacht.
SPENDEN :wink: Download: CUxD 2.11, SSH KeyDir

Arthy
Beiträge: 103
Registriert: 17.12.2014, 00:03
System: CCU
Danksagung erhalten: 1 Mal

Re: HM Skript mittels Timer auslösen.

Beitrag von Arthy » 18.03.2019, 21:27

Hallo Uwe,

Danke für deine Tipps. Habe mir die tcl Skripte sowie die Doku angeschaut, kriege das aber irgendwie nicht hin. Wie du oben an dem Programm erkennen kannst, lasse ich sobald der Drucker an ist die Timerfunktion aufrufen. Also mit dem tcl Skript, das ich alle 60 Sekunden mit Hilfe der Timer CMD_Exec Funktion aufrufe hole ich mir ein paar Daten und schreibe sie in die Systemvariablen:

Code: Alles auswählen

...

 # Werte aus Datei auslesen
 # ========================
 puts "Lese Werte aus"
 regexp {\"state\": \"(.*?)\"} $input dummy state
 regexp {\"completion\": (.*?)\,} $input dummy completion
 regexp {\"printTime\": (.*?)\,} $input dummy printTime
 regexp {\"printTimeLeft\": (.*?)\,} $input dummy printTimeLeft
 regexp {\"name\": (.*?)\,} $input dummy name

 set rega_cmd ""
 append rega_cmd "var w0 = dom.GetObject('octoprint_status');"
 append rega_cmd "w0.State('$state');"
 append rega_cmd "var w1 = dom.GetObject('octoprint_completion');"
 append rega_cmd "w1.State('$completion');"
 append rega_cmd "var w2 = dom.GetObject('octoprint_printTime_s');"
 append rega_cmd "w2.State('$printTime');"

 append rega_cmd "var w3 = dom.GetObject('octoprint_printTimeLeft_s');"
 append rega_cmd "w3.State('$printTimeLeft');"

 append rega_cmd "var w4 = dom.GetObject('octoprint_name');"
 append rega_cmd "w4.State('$name');"

rega_script $rega_cmd
Danach müsste ich dieses HM Skript durchlaufen lassen, um die Zeiten entsprechend umzurechnen:

Code: Alles auswählen

var Laufzeit1 = dom.GetObject("octoprint_printTime_s").Value(); 
! WriteLine ("Laufzeit in s: " # Laufzeit1)
! WriteLine ("Laufzeit im Stundenformat: " # (Laufzeit1.ToTime () -3600).Format ("%H:%M:%S"));
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("octoprint_printTime").State ((Laufzeit1.ToTime () -3600).Format ("%H:%M:%S") );

var Laufzeit2 = dom.GetObject("octoprint_printTimeLeft_s").Value(); 
! WriteLine ("Verbliebene Druckzeit in s: " # Laufzeit2)
! WriteLine ("Verbliebene Druckzeit im Stundenformat: " # (Laufzeit2.ToTime () -3600).Format ("%H:%M:%S"));
! WriteLine ("Fertig um: " # (localtime+Laufzeit2).Format ("%H:%M:%S")); 
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("octoprint_endTime").State ((localtime+Laufzeit2).Format ("%H:%M:%S") );
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("octoprint_printTimeLeft").State ((Laufzeit2.ToTime () -3600).Format ("%H:%M:%S") );
Kannst du mir bitte sagen, wie ich am besten das Programm oben anpasse, damit ich entweder das HM Skript in das tcl Skript einfüge oder es nochmal mittels der Timerfunktion aufrufe. Das wäre super.
Besten Dank im voraus.

Gruß
Arthy

Benutzeravatar
uwe111
Beiträge: 4820
Registriert: 26.02.2011, 22:22
Hat sich bedankt: 3 Mal
Danksagung erhalten: 245 Mal
Kontaktdaten:

Re: HM Skript mittels Timer auslösen.

Beitrag von uwe111 » 19.03.2019, 10:19

Hallo Arthy,
Arthy hat geschrieben:
18.03.2019, 21:27
Kannst du mir bitte sagen, wie ich am besten das Programm oben anpasse, damit ich entweder das HM Skript in das tcl Skript einfüge oder es nochmal mittels der Timerfunktion aufrufe.
Genau so, wie Du es bereits in Deinem TCL-Script gemacht hast. Da steht ja schon HM-Script drin.
Einfach noch folgendes hinten anfügen...

Code: Alles auswählen

 set rega_cmd ""
 append rega_cmd "... hier jeweils eine Zeile vom HM-Script ..."
 ...
 append rega_cmd "... hier die letzte Zeile vom HM-Script ..."
 rega_script $rega_cmd
Viele Grüße

Uwe
Alle sagten: Das geht nicht. Dann kam einer, der wußte das nicht und hat's einfach gemacht.
SPENDEN :wink: Download: CUxD 2.11, SSH KeyDir

Arthy
Beiträge: 103
Registriert: 17.12.2014, 00:03
System: CCU
Danksagung erhalten: 1 Mal

Re: HM Skript mittels Timer auslösen.

Beitrag von Arthy » 20.03.2019, 21:15

Hallo Uwe,

genau so habe ich es auch schon vorher probiert aber leider läuft das Skript nicht durch. Habe das tcl Skript mit dem vorletzten Abschnitt folgend ergänzt:

Code: Alles auswählen

…

# Werte aus Datei auslesen
 # ========================
 puts "Lese Werte aus"
 regexp {\"state\": \"(.*?)\"} $input dummy state
 regexp {\"completion\": (.*?)\,} $input dummy completion
 regexp {\"printTime\": (.*?)\,} $input dummy printTime
 regexp {\"printTimeLeft\": (.*?)\,} $input dummy printTimeLeft
 regexp {\"name\": (.*?)\,} $input dummy name

 set rega_cmd ""
 append rega_cmd "var w0 = dom.GetObject('octoprint_status');"
 append rega_cmd "w0.State('$state');"
 append rega_cmd "var w1 = dom.GetObject('octoprint_completion');"
 append rega_cmd "w1.State('$completion');"
 append rega_cmd "var w2 = dom.GetObject('octoprint_printTime_s');"
 append rega_cmd "w2.State('$printTime');"
 append rega_cmd "var w3 = dom.GetObject('octoprint_printTimeLeft_s');"
 append rega_cmd "w3.State('$printTimeLeft');"
 append rega_cmd "var w4 = dom.GetObject('octoprint_name');"
 append rega_cmd "w4.State('$name');"

 set rega_cmd ""
 append rega_cmd "var Laufzeit1 = dom.GetObject("octoprint_printTime_s").Value();"
 append rega_cmd "dom.GetObject (ID_SYSTEM_VARIABLES).Get ("octoprint_printTime").State ((Laufzeit1.ToTime () -3600).Format ("%H:%M:%S") );"

rega_script $rega_cmd

Beim Starten des Skrips über Terminal bekomme ich leider die folgende Fehlermeldung und komme deshalb nicht weiter. Hast du noch eventuell einen Tipp?

Code: Alles auswählen

/usr/local/addons/octoprint$ tclsh octoprintstatus.tcl
Abfrage der Daten:
Job
Lese Werte aus
extra characters after close-quote
    while executing
"append rega_cmd "var Laufzeit1 = dom.GetObject("
    (file "octoprintstatus.tcl" line 47)
Besten Dank

Gruß
Arthy

Arthy
Beiträge: 103
Registriert: 17.12.2014, 00:03
System: CCU
Danksagung erhalten: 1 Mal

Re: HM Skript mittels Timer auslösen.

Beitrag von Arthy » 21.03.2019, 01:34

Hallo,

habe noch etwas rumprobiert, nun geht es. Das Problem waren die inneren doppelten Anführungszeichen. Hier musste ich sie alle in einzelne umwandeln. Danach gings.

Gruß
Arthur

Benutzeravatar
uwe111
Beiträge: 4820
Registriert: 26.02.2011, 22:22
Hat sich bedankt: 3 Mal
Danksagung erhalten: 245 Mal
Kontaktdaten:

Re: HM Skript mittels Timer auslösen.

Beitrag von uwe111 » 21.03.2019, 10:03

Hallo Arthur,

ja, Anführungszeichen musst Du entweder escapen oder umschreiben.
Sonst weiß der Interpreter natürlich nicht, wo der String zu Ende ist.

Viele Grüße

Uwe
Alle sagten: Das geht nicht. Dann kam einer, der wußte das nicht und hat's einfach gemacht.
SPENDEN :wink: Download: CUxD 2.11, SSH KeyDir

Antworten

Zurück zu „CUxD“