Name oder Adresse eines HmIP-Fenstersensors herausfinden

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Antworten
Benutzeravatar
SHC
Beiträge: 202
Registriert: 24.10.2007, 13:57

Name oder Adresse eines HmIP-Fenstersensors herausfinden

Beitrag von SHC » 27.12.2023, 20:27

Hallo,

ich nutze die CCU2 und CCU3 seit vielen Jahren und steuere darüber meine Heizkörper und Rolladen in insgesamt 10 Räumen zzgl. einiger Anwendungen im Keller (Entfeuchter schalten). Dafür habe ich auch etliche Scripte angelegt, die ich mir durch fleißiges Lesen hier im Forum erarbeitet habe. Eine goldene Regel dabei war immer, dass ich nur Script-Zeilen einsetze, die ich auch verstehe. Programmieren kann ich leider nicht und so beschränkt sich mein Wissen auf etwas Powershell, CMD und eben ein wenig HM Script.

Nun bin ich aber an meine Grenze gekommen und bitte Euch um Hilfe. Der eine oder andere wird vielleicht sagen, "das hatten wir schon", aber leider konnte ich aus den Beispielen keine funktionierende Lösung ableiten. Meine Familie hat mir nun die rote Karte gezeigt, da ich schon über eine Woche daran herum bastel', "Zeit vertrödel" und es immer noch nicht funktioniert.

Im Kern geht es darum, dass ich für jeden Raum Heizgruppen mit BidCos-RF-Geräten gebildet habe (Thermostat(e), Wandthermostat, Fenstersensor(en)) und nun sind zwei Fenstersensoren "HM-Sec-SCo" defekt. Diese könnte ich zwar auf dem Gebrauchtmarkt finden, aber hier habe ich auch schon Pech gehabt. Ich habe mir daher einen HmIP-Fenstersensor "HmIP-SWDO" gekauft. Da man BidCos-RF und HmIP-RF nicht in Heizgruppen mischen kann, habe ich meine Heizungsscript entsprechend umgeschrieben: Es wird jetzt entweder die Information aus der Heizgruppe ausgewertet:

Code: Alles auswählen

dom.GetObject("VirtualDevices.Seriennummer:2.STATE").Value()
oder der entsprechende Wert aus dem HmIP-SWDO:

Code: Alles auswählen

dom.GetObject("HmIP-RF.Seriennummer:1.STATE").Value()

Ich scheitere nun aber daran, die Seriennummer oder den Namen der im Raum befindlichen "HmIP-SWDO" heraus zu finden. Im Moment habe ich mich damit beholfen, dass ich diese manuell ins Script schreibe, aber falls ich noch mehr Geräte ersetzen muss, wäre natürlich eine automatische Lösung sinnvoller. In der Theorie weiß ich, dass ich innerhalb des Raumes das Gewerk "Verschluss" finden muss und dann nach "HmIP-SWDO" filtern muss. Das Ganze soll dann in einer verschachtelten foreach-Schleife laufen, damit auch evtl. mehrere Fenstersensoren erkannt werden. Sobald einer der IP-Sensoren offen geschaltet ist, wird die Temperatur abgesenkt, da dies nicht automatisiert in der Heizgruppe passiert (bzw. passieren kann).

Über verschiedene Scripte zum Durchlaufen von Räumen/Gewerken hier aus dem Forum habe ich mich versucht anzunähern, aber ich bin kläglich daran gescheitert die Seriennummer oder den Namen ausgeben zu lassen. Könnte mir hier nochmal jemand einen Schubser in die richtige Richtung geben? Dafür wäre ich wirklich sehr dankbar.

Ich wünsche allen hier im Forum ein friedliches und ruhiges Jahresende und einen guten Start in das neue Jahr!


Viele Grüße,
SHC

Edit 01:
Das erste Problem habe ich lösen können. Meine Gewerke waren nicht im Klarnamen abgelegt, sondern durch die CCU verändert. Dadurch funktionierte eine foreach durch das Gewerk nicht. (vergl. >Link<)


Edit 02:
Ich habe nun einen Ansatz, der sogar funktioniert, nur leider...
> weiß ich nicht, wie er funktioniert
> schaffe ich es nicht das Gewerk mit einzubeziehen
(bzw. ich kann entweder durch alle Gewerke der CCU iterieren, oder durch einen Raum. Hier stellt sich aber die rechnerische Frage, ob der zusätzliche Aufwand lohnt, oder ob es gar nichts bringt, da es pro Raum nicht so viele Kanäle gibt. Dennoch würde ich gerne lernen, wie es gehen würde.)

Einen großen Teil des Codes habe ich >hier< entliehen.

Code: Alles auswählen

var Gewerk = dom.GetObject("Verschluss"); ! Im Moment nicht in Verwendung
string GewID; ! Im Moment nicht in Verwendung
var Raum   = dom.GetObject("EG_AZ");
string RaumID;
boolean Fenster_offen = false;


foreach(RaumID,Raum.EnumUsedIDs()) {
	var item = dom.GetObject(RaumID);
	if(item.IsTypeOf(OT_CHANNEL)) {
		var dev=dom.GetObject(item.Device());
    		if((dev.HssType()=="HMIP-SWDO")) {
       			var state=item.DPByHssDP("STATE");
       			if(state.Value()) {
        			Fenster_offen = true;
				}
			}
		}
	}

WriteLine(Fenster_offen);
Im Moment kann ich das nur mit einem Fensterkontakt testen, aber theoretisch müsste das auch bei mehreren Kontakten klappen. Für die Heizungsabsenkung ist nur wichtig, dass ein Fenster geöffnet ist. Die Anzahl ist unwichtig.

Aber: Ich verstehe einige Zeilen nicht, und das wurmt mich.

Code: Alles auswählen

foreach(RaumID,Raum.EnumUsedIDs()) {
	var item = dom.GetObject(RaumID);
=> Das ist so weit klar: Ich gehe durch den vorgegebenen Raum und es werden alle IDs ausgelesen und an die Schleife nacheinander weiter gegeben.

Code: Alles auswählen

if(item.IsTypeOf(OT_CHANNEL)) {
=> Warum wird hier auf die Verfügbarkeit eines Kanals geprüft?

Code: Alles auswählen

var dev=dom.GetObject(item.Device());
=> Hier ist mir die Verwendung von "Device()" völlig unklar. Dazu habe ich nichts finden können.

Code: Alles auswählen

if((dev.HssType()=="HMIP-SWDO")) {
var state=item.DPByHssDP("STATE");
=> Das ist so weit klar:
a) Ermittelt die Bezeichnung des HomeMatic Gerätetyps.
b) Ermittelt einen Datenpunkt des Kanals anhand seines Namens

Code: Alles auswählen

if(state.Value())
=> Das lässt mich wieder verzweifeln: Der Wert ist ja 0 (geschlossen), oder 1 (geöffnet), oder? Aber hier wird ja nur geprüft, ob ein Wert vorhanden ist. Zählt die Null dann wie "Kein Wert"?


Falls sich einer mit meinen Fragen auseinander setzen mag, wäre ich dafür sehr, sehr dankbar.


Viele Grüße,
SHC

Benutzeravatar
Baxxy
Beiträge: 10967
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 622 Mal
Danksagung erhalten: 2260 Mal

Re: Name oder Adresse eines HmIP-Fenstersensors herausfinden

Beitrag von Baxxy » 28.12.2023, 13:48

Du kommst der Sache näher...

Aber, was willst du denn mit dem Namen oder der Adresse der Sensoren?

Relevant (für ein "Heizungsscript") ist doch eigentlich nur die Information ob ein (oder mehrere) Fenster (im Raum/Gewerk) offen sind.

Das Prozedere ist immer gleich...
Ein Raum/Gewerk anlegen (bspw. Gewerk: 'TFKs Wohnzimmer') und die Statuskanäle (:1) aller "Wohnzimmer TFKs" reinpacken.
Per Script über Raum/Gewerk iterieren und dabei den "Wert" des STATE - Datenpunktes herauspicken.

Beispiel mit Gewerk 'TFKs Wohnzimmer':
(als Kurzfassung ohne große Fehlerbehandlung)

Code: Alles auswählen

string sGewerk = "TFKs Wohnzimmer";
string sChnID;
object oChn;
integer iCntOpen;

foreach (sChnID, dom.GetObject (ID_FUNCTIONS).Get (sGewerk).EnumIDs()) {
         oChn = dom.GetObject(sChnID);
         if (oChn.DPByHssDP ("STATE").Value()) {
             iCntOpen = iCntOpen + 1;
             WriteLine(oChn.Name()# ": "#oChn.DPByHssDP ("STATE").Value());
         }
}
WriteLine("Anzahl nicht geschlossener TFKs: "#iCntOpen);
Das meiste aus deinen Beispielen ist für dein Vorhaben nicht relevant, daher gehe ich da jetzt nicht drauf ein.
Wenn du wie oben erwähnt ein eigenes Gewerk für die TFK's (pro "Raum") anlegst und diszipliniert nur die Statuskanäle reinpackst dann brauchst du keine Prüfungen (ob es ein TFK ist usw.).

Code: Alles auswählen

if(state.Value())
SHC hat geschrieben:
27.12.2023, 20:27
=> Das lässt mich wieder verzweifeln: Der Wert ist ja 0 (geschlossen), oder 1 (geöffnet), oder? Aber hier wird ja nur geprüft, ob ein Wert vorhanden ist. Zählt die Null dann wie "Kein Wert"?
Ja, kann man so sehen. Die if-Bedingung ist FALSCH wenn der Wert false, 0 , null oder auch 1970-01-01 01:00:00 ist.
Die Langfassung für ungeübte sähe z.B. so aus:

Code: Alles auswählen

if(state.Value() == true)

Benutzeravatar
SHC
Beiträge: 202
Registriert: 24.10.2007, 13:57

Re: Name oder Adresse eines HmIP-Fenstersensors herausfinden

Beitrag von SHC » 28.12.2023, 14:15

Hallo Baxxy,
vielen Dank für Deine Antwort! :)
Baxxy hat geschrieben:
28.12.2023, 13:48
Du kommst der Sache näher...
Aber, was willst du denn mit dem Namen oder der Adresse der Sensoren?
Da stimme ich Dir inzwischen zu. Das Ganze ist ein (Denk-)Prozess, er einem Ungeübten wie mir nicht zur schwer fällt, sondern auch seine Zeit braucht.

> Anfangs war ich aufgrund meines funktionierenden Heizungsscriptes auf der Suche nach der Adresse des HmIP-Fenstersensors, um ihn auslesen zu können.
> Inzwischen habe ich auch gemerkt, dass ich es anders lösen kann und die Adresse nicht benötige. ;)

Deinen Denkanstoß werde ich mir jetzt genauer ansehen und melde mich dann zurück!


Vielen Dank,
SHC

alchy
Beiträge: 10758
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 674 Mal

Re: Name oder Adresse eines HmIP-Fenstersensors herausfinden

Beitrag von alchy » 31.12.2023, 11:22


Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Benutzeravatar
SHC
Beiträge: 202
Registriert: 24.10.2007, 13:57

Re: Name oder Adresse eines HmIP-Fenstersensors herausfinden

Beitrag von SHC » 31.12.2023, 14:21

Hallo,

ich habe ein paar Tage benötigt, aber jetzt läuft es wie gewünscht. Vielen Dank an Baxxy und Alchy für die Denkanstöße und Erklärungen. Das hat mir sehr geholfen.

Diesen Code-Schnipsel habe ich in mein Heizungsscript eingebaut und es prüft nun zusätzlich zu den Fenstern innerhalb der Heizgruppe auch einen 'eigenständigen' HmIP-TFK und stellt dann entsprechend die Temperatur ein. Damit ich mich später an alles erinnern kann, habe ich noch einige Erklärungen eingebaut (die ich hier nicht mit einkopiert habe) und die Variablennamen verlängert. ;-)
Der "Raumname" wird im echten Script durch "TFK_" # Name # "_IP" ersetzt, wobei "Name" jeweils ganz oben deklariert wird.

Code: Alles auswählen

string sGewerk = "TFK_Raumname_IP"; 
string sChannelID;
object oChannel;
integer iCountOpen;
boolean bFensterIP_offen = false;

foreach (sChannelID, dom.GetObject(ID_FUNCTIONS).Get(sGewerk).EnumIDs()) {
         oChannel = dom.GetObject(sChannelID);
         if (oChannel.DPByHssDP("STATE").Value()==true) {
             bFensterIP_offen = true;            
         }
}

Vielen Dank an Euch und einen tollen Start in das neue Jahr!
SHC

Antworten

Zurück zu „HomeMatic allgemein“