Scripting: .Variable() bringt kein Ergebnis / stoppt Script

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

Moderator: Co-Administratoren

Antworten
KilamMalik
Beiträge: 152
Registriert: 31.12.2011, 11:12
Wohnort: Augschburg

Scripting: .Variable() bringt kein Ergebnis / stoppt Script

Beitrag von KilamMalik » 31.12.2011, 12:40

Hi,

habe kürzlich mit Homematic angefangen und wollte mich jetzt in das Scripting einarbeiten. Jede Sprache hat ja so Ihre Eigenheiten, und da bin ich jetzt auf ein Problem gestoßen, wo ich nicht weiterkomme und auch keine Infos dazu gefunden habe.

Ich wollte das Beispielscript aus der Doku zum Setzen der Maximaltemperatur in einer Systemvariable ausprobieren. Das habe ich gleich etwas ausgebaut auf Min/Max Temperatur meines Außensensors. Dazu habe ich zwei Variablen definiert:

Code: Alles auswählen

max_outside
Maximale Außentemperatur
Zahl
Minimalwert: -40
Maximalwert: 100
°C
Thermostat Außen

Code: Alles auswählen

min_outside
Minimale Außentemperatur
Zahl
Minimalwert: -40
Maximalwert: 100
°C
Thermostat Außen
Dann hole ich per Script das Variablenobjekt und möchte es mit dem Außensensor vergleichen und dadurch min/max anpassen. Wenn ich die Zentrale reboote, dann haben die Systemvariablen anscheinend den Minimalwert, deswegen möchte ich im Falle des Minimalwertes den Wert des Außensensors übernehmen oder wenn er größer/kleiner als max/min ist:

Code: Alles auswählen

var source  = dom.GetObject("$src$"); 
var maxTemp = dom.GetObject("max_outside");
var minTemp = dom.GetObject("min_outside"); 
 
if (source && minTemp && maxTemp)
{
!--- Debug ---!
  string stderr;
  string stdout;
  system.Exec("logger -t script -p user.debug _source.Value()_: " + source.Value() + ", " + minTemp.Variable() + ", " + maxTemp.Variable(), &stdout, &stderr);
!--- Debug ---!

  ! Nach Neustart der CCU steht der minimale Wert in min- und maxTemp, also -40 -> Dann und auch wenn aktueller
  ! Wert kleiner / größer, auf den aktuellen Wert setzen:

  if (minTemp.Variable() == -40 || source.Value() < minTemp.Variable()) 
  { 
    minTemp.Variable(source.Value()); 
  } 

  if (maxTemp.Variable() == -40 || source.Value() > maxTemp.Variable()) 
  { 
    maxTemp.Variable(source.Value()); 
  } 
} 
Das Logging habe ich dann eingebaut, als es nicht funktioniert hat. Die Variablen hat er mit get.domObject ja anscheinend gefunden, sonst würde er nicht bis zum Logging kommen. Aber dann scheint das Programm abzubrechen, sobald ich minTemp.Variable() aufrufe -> es wird nur source.Value() geloggt. Interressant ist, wenn ich die Reihenfolge im Logging austausche, also so:

system.Exec("logger -t script -p user.debug _source.Value()_: " + minTemp.Variable() + ", " + source.Value() + ", " +maxTemp.Variable(), &stdout, &stderr);

Dann wird gar nix mehr geloggt. Deswegen kommt es mir so vor, als ob das Scripting an der Stelle abbricht. Laut GUI hat die minTemp und maxTemp auch den Wert -40, also nicht undefiniert, dann hätte ich das Verhalten noch erwarten können.

Irgendwas muss ich übersehen haben... kann mir jemand helfen?

Danke,
Frank.

Benutzeravatar
Herbert_Testmann
Beiträge: 11062
Registriert: 17.01.2009, 11:30
Danksagung erhalten: 7 Mal

Re: Scripting: .Variable() bringt kein Ergebnis / stoppt Scr

Beitrag von Herbert_Testmann » 31.12.2011, 13:24

Falls das Problem keiner löst, kann ich Dir heute abend ein funktionierendes Script aus meiner CCU rein kopieren. Dann kannst Du vergleichen.

Ich lasse die Werte immer um Mitternacht zurück setzen auf
min 80° max -40°
Falls die CCU mal neu gestartet wird, stimmt der eine Wert natürlich bis Mitternacht nicht, oder ich führe das Script zum Rücksetzen manuell aus der WebUi aus.

Guten Rutsch

Benutzeravatar
Herbert_Testmann
Beiträge: 11062
Registriert: 17.01.2009, 11:30
Danksagung erhalten: 7 Mal

Re: Scripting: .Variable() bringt kein Ergebnis / stoppt Scr

Beitrag von Herbert_Testmann » 31.12.2011, 13:27

Ich habe mich mal per FTP nach Hause verbunden und Dir ein Beispiel raus gesucht.
Vergleichen und anpassen musst Du selbst.

PS: Damit das mit dem Objekt $src$ als Source funktioniert, muss das Script im Temperatursensor mit Ausführen bei Aktualisierung liegen

Code: Alles auswählen

! Die max /min Temp über einen Zeitraum in Systemvariablen speichern
! Rücksetzen mit einem separaten Script
!
! Das Script wird in ein WebUI Programm gelegt, 
! das bei Aktualisierung des Objektes ausgeführt wird.
! Name des Temperatursensors "Garten Temp"
! Name der Systemvariablen "Aussentemperatur_max"
! Name der Systemvariablen "Aussentemperatur_min"
!
var source = dom.GetObject("$src$");
var maxTemp = dom.GetObject("Aussentemperatur_max");
if (source)
{
if (source.Value() > maxTemp.Variable())
{
maxTemp.Variable(source.Value());
}
}
else
{
var wds = dom.GetObject("Garten Temp");
var curTemp = wds.DPByHssDP("TEMPERATURE");
maxTemp.Variable(curTemp.Value());
}
var source = dom.GetObject("$src$");
var minTemp = dom.GetObject("Aussentemperatur_min");
if (source)
{
if (source.Value() < minTemp.Variable())
{
minTemp.Variable(source.Value());
}
}
else
{
var wds = dom.GetObject("Garten Temp");
var curTemp = wds.DPByHssDP("TEMPERATURE");
minTemp.Variable(curTemp.Value());
}

Code: Alles auswählen

! Setzt die Systemvariablen für max / min Werte
! zu einer bestimmten Zeit auf einen Wert
! der im Script festgelegt ist
! Das Script wird per WebUI zu einer bestimmten Zeit ausgeführt
! Die Systemvariablen "xyz"  sind Beispiele
!
var minTemp = dom.GetObject("Aussentemperatur_min");
minTemp.Variable(80);
var maxTemp = dom.GetObject("Aussentemperatur_max");
maxTemp.Variable(-40);
var minTemp1 = dom.GetObject("DG_HWR_Temp_min");
minTemp1.Variable(80);
var maxTemp1 = dom.GetObject("DG_HWR_Temp_max");
maxTemp1.Variable(-40);

KilamMalik
Beiträge: 152
Registriert: 31.12.2011, 11:12
Wohnort: Augschburg

Re: Scripting: .Variable() bringt kein Ergebnis / stoppt Scr

Beitrag von KilamMalik » 31.12.2011, 15:22

Hallo Herbert,

Danke für die Schnelle Antwort :-) Eigentlich müsste es demnach bei mir auch gehen. Darum habe ich bei mir die Bedingungen etwas aufgedröselt, damit ich dem Fehler auf die Spur komme. Und es scheint wohl an dem == Vergleich zu liegen. Wenn ich das so hinschreibe:

Code: Alles auswählen

var source  = dom.GetObject("$src$"); 
var maxTemp = dom.GetObject("max_outside");
var minTemp = dom.GetObject("min_outside"); 
 
if (source && minTemp && maxTemp)
{
!--- Debug ---!
  string stderr;
  string stdout;

  system.Exec("logger -t script -p user.debug _source.Value()_: " + source.Value() + ", " + minTemp.Variable() + ", " + maxTemp.Variable(), &stdout, &stderr);
!--- Debug ---!
  ! Nach Neustart der CCU steht der minimale Wert in min- und maxTemp, also -40 -> Dann und auch wenn aktueller
  ! Wert kleiner / größer, auf den aktuellen Wert setzen:

  if (minTemp.Variable() == -40)
  { 
    system.Exec("logger -t script -p user.debug mintemp==-40", &stdout, &stderr);
    minTemp.Variable(source.Value()); 
  } 
  if (source.Value() < minTemp.Variable()) 
  { 
    system.Exec("logger -t script -p user.debug mintemp<src", &stdout, &stderr);
    minTemp.Variable(source.Value()); 
  } 

  if (maxTemp.Variable() == -40)
  { 
    system.Exec("logger -t script -p user.debug maxtemp==-40", &stdout, &stderr);
    maxTemp.Variable(source.Value()); 
  } 
  if (source.Value() > maxTemp.Variable()) 
  { 
    system.Exec("logger -t script -p user.debug mintemp<source", &stdout, &stderr);
    maxTemp.Variable(source.Value()); 
  } 
} 
Dann kommt er in den Zweig if (source.Value() < minTemp.Variable()) rein und führt den auch aus. Irgendwie so als ob die -40 gar nicht wirklich drin gestanden wären. Wenn ich mir das recht überlege... ich habe die -40 nie reingeschrieben, die WebUI hat sie mir als aktuellen Wert ausgegeben. Das könnte jetzt natürlich sein, dass der undefiniert war und von der UI nur dann als -40 angezeigt wurde. Auf jeden Fall komme ich so weiter ;-)

Das mit dem Zurücksetzen auf Mitternacht finde ich eine gute Idee. Ich hatte es zuerst vor, mit dem TimeStamp der SystemVariable zu arbeiten und damit immer die letzten 24h zu haben.

Grade noch eine Frage -> Der Variablenname wird ja so (max_outside) in der WebUI angezeigt, kann man da auch einen sichtbaren Namen definieren oder ist diese ID und der sichtbare Name identisch?

Danke und guten Rutsch,
Frank.

Benutzeravatar
Herbert_Testmann
Beiträge: 11062
Registriert: 17.01.2009, 11:30
Danksagung erhalten: 7 Mal

Re: Scripting: .Variable() bringt kein Ergebnis / stoppt Scr

Beitrag von Herbert_Testmann » 31.12.2011, 21:26

Ich habe von diesem Script dingens -20 Ahnung :)
Beim Abschreiben heisst es aber immer "die Namen muessen exakt den eigenen Systemvariablen entsprechen, sonst funktioniert es nicht".
Ist doch auch nicht weiter störend, oder?

Guten Rutsch

Antworten

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