Fehler bei EnumUsedIDs()

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

Moderator: Co-Administratoren

youngster91
Beiträge: 16
Registriert: 13.02.2015, 08:17

Fehler bei EnumUsedIDs()

Beitrag von youngster91 » 15.02.2016, 19:58

Hallo zusammen,
ich wollte letztens ein Skript für eines meiner Heizungssteuerung übernehmen und da nichts funktionierte, habe ich mich an die Fehlersuche gemacht. Dabei ist mir aufgefallen, dass es wohl an einem Befehl liegen müsste, jedoch weiß ich nicht warum.
Habe mal als ganz kurzes Beispiel aufgesetzt:

Code: Alles auswählen

var schlafen=dom.GetObject("Schlafzimmer");
var channel=schlafen.EnumUsedIDs();
dom.GetObject("BidCos-RF.MEQxxx:2.SETPOINT").State(20.0);
Ich weiß, dass das Programm nicht viel Sinn macht ich wollte lediglich gucken ob es ausgeführt wird und komischerweise wird die Temperatur nicht auf 20Grad gesetzt somit vermute ich, dass der Schritt nicht ausgeführt wird sondern das Skript vorher hängen bleibt.

Hat jemand eine Idee voran es liegen könnte oder hat jemand selber das Problem gehabt oder hat eine Idee wie ich weiter vorgehen/testen/ändern könnte?

Zur Hardware ich nutze eine CCU2 mit Firmware 2.15.5 mit einem Wandthermostat (HM-TC-IT-WM-W-EU) einem Heizungsaktor (HM-CC-RT-DN) und zwei Fensterkontakten (HM-Sec-RHS).

Falls ich etwas vergessen habe, bitte verzeiht mir und schreibt es einfach und ich werde mein bestmöglichstes geben es nachzureichen.

Schöne Grüße

Stefan

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Fehler bei EnumUsedIDs()

Beitrag von paul53 » 15.02.2016, 20:04

Der Sollwert wird nicht gesetzt, weil der Datenpunktname falsch ist:

Code: Alles auswählen

dom.GetObject("BidCos-RF.MEQ1234567:2.SET_TEMPERATURE").State(20.0);
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

youngster91
Beiträge: 16
Registriert: 13.02.2015, 08:17

Re: Fehler bei EnumUsedIDs()

Beitrag von youngster91 » 15.02.2016, 20:42

paul53 hat geschrieben:Der Sollwert wird nicht gesetzt, weil der Datenpunktname falsch ist:

Code: Alles auswählen

dom.GetObject("BidCos-RF.MEQ1234567:2.SET_TEMPERATURE").State(20.0);
Hatte es vorher sowohl mit SET_TEMPERATURE als auch mit SETPOINT probiert und ohne das EnumUsedIDs hat es mit SETPOINT geklappt (mit SET_TEMPERATURE nicht).

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Fehler bei EnumUsedIDs()

Beitrag von paul53 » 15.02.2016, 20:53

youngster91 hat geschrieben:Zur Hardware ich nutze eine CCU2 mit Firmware 2.15.5 mit einem Wandthermostat (HM-TC-IT-WM-W-EU)
Bei diesem ist laut eQ-3-Doku die Sollwert-ID "SET_TEMPERATURE". Beim alten WT HM-CC-TC war die Sollwert-ID "SETPOINT".
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

youngster91
Beiträge: 16
Registriert: 13.02.2015, 08:17

Re: Fehler bei EnumUsedIDs()

Beitrag von youngster91 » 16.02.2016, 20:36

paul53 hat geschrieben:
youngster91 hat geschrieben:Zur Hardware ich nutze eine CCU2 mit Firmware 2.15.5 mit einem Wandthermostat (HM-TC-IT-WM-W-EU)
Bei diesem ist laut eQ-3-Doku die Sollwert-ID "SET_TEMPERATURE". Beim alten WT HM-CC-TC war die Sollwert-ID "SETPOINT".

Funktioniert leider mit beiden Befehlen nicht, wenn EnumUsedID() vor den Befehlen steht.

BadenPower

Re: Fehler bei EnumUsedIDs()

Beitrag von BadenPower » 17.02.2016, 11:59

youngster91 hat geschrieben:Funktioniert leider mit beiden Befehlen nicht, wenn EnumUsedID() vor den Befehlen steht.
1.
Wie soll es denn auch funktionieren, wenn man den falschen Kanal wählt?
SET_TEMERATURE ist Kanal 1 und nicht 2.

2.

Code: Alles auswählen

var channel=schlafen.EnumUsedIDs();
Das geht auch nicht, denn hier stimmt die Syntax nicht und das Skript wird abgebrochen.


.
Zuletzt geändert von BadenPower am 17.02.2016, 13:07, insgesamt 1-mal geändert.

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Fehler bei EnumUsedIDs()

Beitrag von paul53 » 17.02.2016, 12:51

BadenPower hat geschrieben:Wie soll es denn auch funktionieren, wenn man den falschen Kanal wählt?
SET_TEMERATURE ist Kanal 1 und nicht 2.
Widerspruch: SET_TEMPERATURE ist Datenpunkt-ID von Kanal 2 (beim WT) bzw. Kanal 4 (beim HKT).
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

BadenPower

Re: Fehler bei EnumUsedIDs()

Beitrag von BadenPower » 17.02.2016, 13:06

paul53 hat geschrieben:Widerspruch: SET_TEMPERATURE ist Datenpunkt-ID von Kanal 2 (beim WT) bzw. Kanal 4 (beim HKT).
Ich dachte er hätte eine Heizungsgruppe.

youngster91
Beiträge: 16
Registriert: 13.02.2015, 08:17

Re: Fehler bei EnumUsedIDs()

Beitrag von youngster91 » 17.02.2016, 19:43

BadenPower hat geschrieben:
youngster91 hat geschrieben: 2.

Code: Alles auswählen

var channel=schlafen.EnumUsedIDs();
Das geht auch nicht, denn hier stimmt die Syntax nicht und das Skript wird abgebrochen.


.
Wieso funktioniert das nicht habe es aus der Homematic Doku
Bild

Und hatte auch mal das komplette Beispiel rauskopiert und er springt dann nicht weiter. Mein eigentliches Problem ist, dass ich über den Befehl in Zusammenhang mit einer foreach-Schleife nach Geräten in meinem Raum durchsuche, nur leider findet er anscheinend meine Geräte nicht und somit springt er auch nicht weiter und ich weiß auch nicht wieso. Vielleicht findet einer von euch ja den Fehler in dem Skript-Ausschnitt:

Code: Alles auswählen

myRaum = dom.GetObject(raum);

foreach(itemID, myRaum.EnumUsedIDs()) 
{
	item = dom.GetObject(itemID);
	
	! Nur Kanäle betrachten
	if (item.IsTypeOf(OT_CHANNEL)) {
		device = dom.GetObject(item.Device());


		! Wenn Raumthermostat gefunden wurde
		if ((device.HssType() == "HM-CC-TC") || (device.HssType() == "HM-TC-IT-WM-W-EU")){

			!  Gibt es den Datenpunkt "SET_TEMPERATURE" bzw. "SETPOINT"?
			if ( item.DPByHssDP("SET_TEMPERATURE") || item.DPByHssDP("SETPOINT") )
			{
				! dann aktuelle Solltemperatur auslesen
				if (device.HssType() == "HM-CC-TC") {
					regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SETPOINT");
				} else {
					regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SET_TEMPERATURE");
				}
				WT_soll_aktuell = regler.Value();
				
				!... und device merken
				devWandThermostat = device;
				reglerWandThermostat = regler;
				
				! ... und timestamp merken
				WT_timestamp = regler.Timestamp();
				
				if (debug >= 3) {
					dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.debug 'RT gemerkt itemID: " # itemID # ", Adresse: " # device.Address() # ", HssType: " # device.HssType() # "'");
				}
			}

		}
		else 
		{	
			! oder falls Heizungsthermostat gefunden wurde...
			if ((device.HssType() == "HM-CC-RT-DN"))
			{
			
				!  Gibt es den Datenpunkt "SET_TEMPERATURE"?
				if ( item.DPByHssDP("SET_TEMPERATURE"))
				{
					! ...dann aktuelle Solltemperatur auslesen.
					regler = dom.GetObject("BidCos-RF." # device.Address() # ":4.SET_TEMPERATURE");
					
					HT_soll_aktuell = regler.Value(); ! die Soll-Temperatur des zuletzt gefundenen Heizkoerperthermostats bleibt schlussendlich in der Variable
					
					!... und devices merken; max. 4 Heizkoerperthermostate pro Raum
					nrHT = nrHT +1;
					if (nrHT == 1) {devHeizkoerperT1 = device; reglerHeizkoerperT1 = regler; };
					if (nrHT == 2) {devHeizkoerperT2 = device; reglerHeizkoerperT2 = regler; };
					if (nrHT == 3) {devHeizkoerperT3 = device; reglerHeizkoerperT3 = regler; };
					if (nrHT == 4) {devHeizkoerperT4 = device; reglerHeizkoerperT4 = regler; };
					
					zw_timestamp = regler.Timestamp();
					if (zw_timestamp > HT_timestamp) { HT_timestamp = zw_timestamp; };
					
					if (debug >= 3) {
						dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("logger -t script -p user.debug 'HT " # nrHT # " gemerkt itemID: " # itemID # ", Adresse: " # device.Address() # ", HssType: " # device.HssType() # "'");
					}
				}
			}
			else 
			{
				! Pruefen, ob Verschluss offen
				! Testen, ob Fenster Dachluken, usw. offen sind. Diese müssen dem jeweiligen Raum und dem Gewerk "Verschluss" zugeordnet sein
				! Alle Gewerke dem Raum zugeordneten Geräte untersuchen
				! Andere als die aufgeführten Sensoren oder Aktoren, die als Verschluss dienen, einfach in nachfolgender IF-Anweisung ändern oder ergänzen.

				! 		Türfensterkontakte                 Jalousienaktor / Dachluken Funk         Jalousienaktor / Dachluken Wired      Schließerkontakt-Sensor Hutschienenmontage        Fenster-Drehgriffsensoren
				if ((device.HssType() == "HM-Sec-SC") || (device.HssType() == "HM-LC-Bl1-FM") || (device.HssType() == "HMW-LC-Bl1-DR")  || (device.HssType() == "HMW-Sen-SC-12-DR") || (device.HssType() == "HM-Sec-RHS")) {
					var myChannel = dom.GetObject(item);
					string id;
					foreach(id, myChannel.ChnFunction()) {
						var func = dom.GetObject(id);
						if (func.Name() == "Verschluss") {
							if (item.State() > 0) { offen = offen + 1.00; }
						}
					}
				}
			}
		}
	} ! if Kanal
} ! foreach

BadenPower

Re: Fehler bei EnumUsedIDs()

Beitrag von BadenPower » 17.02.2016, 20:53

youngster91 hat geschrieben:Wieso funktioniert das nicht habe es aus der Homematic Doku
Teste einmal :

Code: Alles auswählen

var schlafen = dom.GetObject("Schlafzimmer");
WriteLine(schlafen);
Ich wette mit Dir, dass die Ausgabe so lautet: null

Und auf "nichts" kann keine Methode angewendet werden. Darum bricht das Script ab.


.

Antworten

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