Parameter (z.B. Thermostat-Modus) per WebUI/Script ändern

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Benutzeravatar
owagner
(verstorben)
Beiträge: 1193
Registriert: 13.05.2008, 19:49
Danksagung erhalten: 1 Mal

Parameter (z.B. Thermostat-Modus) per WebUI/Script ändern

Beitrag von owagner » 28.11.2010, 11:45

Über WebUI-Programme bzw. HMScript ist es nicht direkt möglich, die Konfigurations-Parameter eines HM-Gerätes (z.B. den Betriebsmodus eines Thermostates) zu verändern. Über ein kleines TCL-Script geht es aber doch. Man muss dazu den XML-RPC-Request "putParamset", der auch vom WebUI zur Konfiguration der Geräte verwendet wird, an den entsprechenden BidCoS-Dienst verschicken.

Man legt dazu zuerst mittels telnet oder ftp auf der CCU das folgende Script in /usr/local/setparam.tcl an:

Code: Alles auswählen

#
# Aufruf für ein putParamset (z.B. via system.Exec)
# =================================================
# von Oliver Wagner <owagner@vapor.com>
#
# tclsh setparam <addresse> <item> <datentyp> <wert>
# z.B.
# tclsh setparam GEQ004711:2 MODE_TEMPERATUR_REGULATOR int 1
#
# Diese Version ist fuer Funk. Fuer Wired muss unten der Port von 2001 auf 2000 geaendert werden.
#
load tclrpc.so
set item [lindex $argv 1]
set datatype [lindex $argv 2]
set val [lindex $argv 3]
set cmd "{$item {$datatype $val}}"
xmlrpc http://127.0.0.1:2001/ putParamset [list string [lindex $argv 0]] [list string "MASTER"] [list struct $cmd]
Danach kann man dann per HMScript diese Script aufrufen, um Parameter zu setzen. Beispiel zum Setzen eines Thermostaten auf Modus "Auto":

Code: Alles auswählen

var addr=dom.GetObject("Thermostat Kueche 1").Address();
var stdout;
var stderr;
system.Exec("tclsh /usr/local/setparam.tcl "+addr+" MODE_TEMPERATUR_REGULATOR int 1",&stdout,&stderr);
Wichtig bei dem Wandthermostat-Beispiel ist, dass der Aufruf gegen das zweite Untergerät erfolgt (also das mit der Addresse mit :2 hinten)

Ich habe die Dinger bei mir z.B. so benannt:

Hauptgerät "Thermostat <Raum>"
Erstes Untergerät (Thermometer/Feuchtemesser) "Thermostat <Raum> 0"
Zweites Untergerät (der eigentliche Regler) "Thermostat <Raum> 1"
Drittes Untergerät (der Empfänger für die TFKs) "Thermostat <Raum> 2"

Hier wird also mit "Thermostat Kueche 1" gleich das richtige Untergerät angesprochen. Alternativversion von sambasamba:

Code: Alles auswählen

var addr=dom.GetObject("Thermostat Kueche").Address();
var stdout;
var stderr;
system.Exec("tclsh /usr/local/setparam.tcl "+addr+":2 MODE_TEMPERATUR_REGULATOR int 1",&stdout,&stderr);
Hier holt man sich das Hauptgerät und hängt die Unteradresse ":2" selber dran. ACHTUNG! Das funktioniert aber nur, wenn "Thermostat Kueche" ein eindeutiger
Name ist. Nennt man z.B. sowohl das Hauptgerät als auch das erste Untergerät "Thermostat Kueche", dann liefert dom.GetObject("Thermostat Kueche") das erste Untergerät ":1" und man versucht "GEQ4711815:1:2" anzusprechen, was schiefgeht...

Viele Grüße,
Olli

erste Revision: Hinweis auf Untergerät/:2 hinzugefügt (danke sambasamba)
Zuletzt geändert von owagner am 28.11.2010, 15:12, insgesamt 2-mal geändert.

sambasamba
Beiträge: 1602
Registriert: 16.08.2009, 23:18
Wohnort: Landau/Südpfalz
Hat sich bedankt: 21 Mal
Danksagung erhalten: 4 Mal

Re: Parameter (z.B. Thermostat-Modus) per WebUI/Script änder

Beitrag von sambasamba » 28.11.2010, 14:24

..damit können alle die Ihre RT nicht per Script steuern bei spontaner Abwesenheit ("bin über Nacht weg") oder Urlaub die RTs auf CEN schalten, die Absenktemperatur rüberspielen und fertig. Und programmgesteuert kurz vor Rückkehr wieder auf AUTO... Und das in den RT gespeicherte Prog. läuft wieder.
Super Sache.

Die Aktion löst ne Servicemeldung aus 'konfig-daten stehen zur Übertragung an', die natürlich verschwindet sobald sich der RT gemeldet hat.

Hier sieht das jetzt so aus:
Es gibt eine Systemvariable 'Heizstatus' vom Typ Werteliste, die die Zustände NORMAL URLAUB AUS annehmen kann.

WebUI-Programm:
image1311.gif
image1311.gif (22.05 KiB) 32543 mal betrachtet
image1313.gif
image1313.gif (5.46 KiB) 32543 mal betrachtet
das 1. Script:

Code: Alles auswählen

! RT Büro, Wohn,Schlaf auf CEN  schalten              
!                            
var addr=dom.GetObject("Buero.Raumthermostat").Address();
var stdout;
var stderr;
system.Exec("tclsh /usr/local/setparam.tcl "+addr+":2 MODE_TEMPERATUR_REGULATOR int 2",&stdout,&stderr);

addr=dom.GetObject("Wohn.Raumthermostat").Address();
system.Exec("tclsh /usr/local/setparam.tcl "+addr+":2 MODE_TEMPERATUR_REGULATOR int 2",&stdout,&stderr);

addr=dom.GetObject("Schlafzimmer.Raumthermostat").Address();
system.Exec("tclsh /usr/local/setparam.tcl "+addr+":2 MODE_TEMPERATUR_REGULATOR int 2",&stdout,&stderr);
im 2. Script ist bei den system.exec Aufrufen nur int 2 durch int 1 ersetzt.

Wenn ich jetzt die Nacht außer Haus bin drücke ich irgendeinen Knopf, der Heizstatus auf URLAUB und eine weitere Variable 'BINausserHaus' auf wahr setzt.
Immer morgens um 5 schaltet ein anderes Programm bei BINausserHaus=WAHR und Heizstatus=URLAUB den Heizstatus auf NORMAL.

Wenn ich in Urlaub fahre setze ich von Hand HEIZSTATUS auf URLAUB und ändere ein auch vorhandenes WebUI-Programm, das einmalig ausgelöst zum gewünschten Rückkehrzeitpunkt den Heizstatus auf NORMAL setzt.

Einen Haken hat die Sache.
Beim Zurückschalten auf AUTO bleibt die zuletzt im CENT-Mode in den RT geschriebene Temperatur bis zum nächsten Schaltzeitpunkt aktiv.
Würde ich als bug bezeichnen, denn wenn man direkt am RT über die Menü-Taste von CEN auf AUTO schaltet, geht der RT auf die aktuell aktive Solltemperatur, und so erwartet man das ja auch. Ich habs mal ELV gemeldet.
Also muß man so rechtzeitig auf Normalbetrieb schalten, daß man den nächsten Schaltpunkt nicht verpaßt (meist morgens). Ein workaround: im RT mehr Schaltpunkte setzen als eigentlich benötigt, mit entspr. kurzen Zeitabständen.

V.

erik
Beiträge: 776
Registriert: 31.10.2007, 13:32
Hat sich bedankt: 6 Mal
Danksagung erhalten: 6 Mal

Re: Parameter (z.B. Thermostat-Modus) per WebUI/Script änder

Beitrag von erik » 11.12.2010, 23:37

Hallo zusammen,

vielen Dank für das Script. Hier noch einige Infos und ein Script von mir:

Die Bedeutung der Ziffer:

Code: Alles auswählen

0 Manu
1 Auto
2 CEN
Ich selber nutze meine Regler mit dem Heizungsscript hier im Forum. Dazu sollen die Regler recht "Dumm" im Modus "MANU" arbeiten, jedoch kann es immer mal passieren, das der Modus aus versehen verstellt wurde. Das unten stehende Script liest alle Regler im Gewerk "Heizung" aus und stellt diese auf MANU.

Code: Alles auswählen

! Version 1.0
! Script setzt alle Heizungsregler aus dem Gewerk HEIZUNG in den Modus MANU
! Script von Erik Groennerud - 11.12.2010
! http://homematic-forum.de/forum/viewtopic.php?f=31&t=5621&p=36987#p36987




var myAssembly = dom.GetObject("Heizung");
     string itemID;
     foreach(itemID, myAssembly.EnumUsedIDs())
     {
       var item = dom.GetObject(itemID);
       if (item.IsTypeOf(OT_CHANNEL))
       {

         var device = dom.GetObject(item.Device());
         if (device.HssType() == "HM-CC-TC")
         {
           var addr=dom.GetObject(device).Address();
					 var stdout;
					 var stderr;
					 system.Exec("tclsh /usr/local/setparam.tcl "+addr+":2 MODE_TEMPERATUR_REGULATOR int 0",&stdout,&stderr);
         }
       }
     }
     
 
Das Script lasse ich Nachts laufen, so daß ich die Servicemeldungen nicht mit bekomme :-)

Grüße

Erik

EnergyStar
Beiträge: 1276
Registriert: 27.07.2010, 11:38
Danksagung erhalten: 1 Mal

Re: Parameter (z.B. Thermostat-Modus) per WebUI/Script änder

Beitrag von EnergyStar » 18.01.2011, 12:16

Hallo Olli,
im Bereich für homeputer wurde Deine Lösung zum Setzen des Modus schon umgesetzt.
Mich würde jetzt interessieren, ob man nicht auch den eingestellten Modus auch abfragen kann? Weil den kann man ja auch von Hand setzen. Und nach einem Eingriff möchte man den vielleicht wieder auf den vorherigen Wert setzen, oder für die Anzeige nutzen, oder, oder...
Wenn Du so in dem Thema drin steckst, kannst Du das auch noch herausfinden und hier als Lösung einstellen?
Vielen Dank für Deine Mühe.
Gruß
EnergyStar
--------------------------------------------
CCU1 mit 1.514, CUxD 0.59b, Historian V0.7.6hf1
161 Kanäle in 35 Geräten
in schrittweiser Migration auf die
CCU2 mit 2.15.5, CUxD 0.68, Historian V0.7.6hf1
254 Kanäle in 88 Geräten
gesamte Funktionalität über die
CL-Box mit homeputer CLX Ver. 4.0 Rel. 150625
Ansichten: 17, Objekte: 882, Zeilen: 19863, Variablen: 1966

Benutzeravatar
owagner
(verstorben)
Beiträge: 1193
Registriert: 13.05.2008, 19:49
Danksagung erhalten: 1 Mal

Re: Parameter (z.B. Thermostat-Modus) per WebUI/Script änder

Beitrag von owagner » 18.01.2011, 12:22

Das geht analog mit getParamset

PeterM
Beiträge: 761
Registriert: 14.10.2008, 10:15
System: Alternative CCU (auf Basis OCCU)
Wohnort: Walldorf/Baden
Danksagung erhalten: 2 Mal

Re: Parameter (z.B. Thermostat-Modus) per WebUI/Script änder

Beitrag von PeterM » 18.01.2011, 12:34

Hallo Olli,

vielen Dank. Habe noch das getparamset.tcl erstellt, aber wo schreibt der Aufruf die Info hin?
Da muß doch sicherlich noch der Aufruf:
system.Exec("tclsh /var/datadisk/getParamset.tcl "+addr+" MODE_TEMPERATUR_REGULATOR",&stdout,&stderr);
entsprechend angepasst werden!?!?!?

Viele Grüße,
Peter

Benutzeravatar
owagner
(verstorben)
Beiträge: 1193
Registriert: 13.05.2008, 19:49
Danksagung erhalten: 1 Mal

Re: Parameter (z.B. Thermostat-Modus) per WebUI/Script änder

Beitrag von owagner » 18.01.2011, 13:10

Hmhm. Ich glaube, der einzige Weg, die Daten zurück ins Script zu kriegen, ist, per tcl direkt in eine Systemvariable zu schreiben. Dazu müßte es irgendwo Beispiele geben...

Benutzeravatar
anli
Beiträge: 4326
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 23 Mal
Kontaktdaten:

Re: Parameter (z.B. Thermostat-Modus) per WebUI/Script änder

Beitrag von anli » 18.01.2011, 13:13

Hallo Olli,

weißt Du, wie ich auf die anderen Funktionen außerhalb des Interface-Namensraums per tcl zugreifen kann? Die Liste kriege ich ja unter http://[CCUIP]/api/homematic.cgi. Nur wie kann ich zum Beispiel Device.setName via tcl aufrufen?

Lieben Gruß,
anli
Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser

Benutzeravatar
owagner
(verstorben)
Beiträge: 1193
Registriert: 13.05.2008, 19:49
Danksagung erhalten: 1 Mal

Re: Parameter (z.B. Thermostat-Modus) per WebUI/Script änder

Beitrag von owagner » 18.01.2011, 14:20

Du meinst die JSON-Methoden. So direkt per TCL lassen sich diese nicht aufrufen. Eventuell könnte es funktionieren, /www/api/homematic.cgi aufzurufen und per STDIN einen Request zu schicken, aber einfache ist es m.E., einfach in die Implementierung der Methoden zu gucken, da kannst Du sehen, was passiert und kannst es ggf. übernehmen. In Deinem Beispiel also /www/api/methods/device/setname.tcl

Olli

SHP
Beiträge: 14
Registriert: 12.08.2011, 21:28

Re: Parameter (z.B. Thermostat-Modus) per WebUI/Script änder

Beitrag von SHP » 18.08.2011, 17:28

Hallo zusammen,
ich habe die hier beschriebenen Schritte durchgeführt, weil ich gerne den Einschaltpegel meines Dimmers (HM-LC-Dim1T-FM) manipulieren will.
Nach Expertenansicht im Gerät sollte es der Wert "SHORT_ON_LEVEL" sein.
Wenn ich das Script ausführe und mir danach die Einstellungen anschaue, hat sich nichts geändert. Auch sind die stdout und stderr Variablen null wenn ich sie mit WriteLine ausgeben will.

Ist der Wertname falsch, kann ich diesen nicht ändern, oder mache ich sonst einen Fehler?

Habe auch schon versucht den tclsh Befehl per Console abzuschicken:
tclsh /usr/local/setparam.tcl HEQXXXXXXXX:1 SHORT_ON_LEVEL int 10
Dabei bekomme ich folgendes zurück:
Fault received on xmlrpc call putParamset({"HEQXXXXXXXX:1","MASTER",[SHORT_ON_LEVEL:10]})
faultCode=-2
faultString=Unknown instance

Kann mir da jemand etwas zu erklären?

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“