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()
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);
Aber: Ich verstehe einige Zeilen nicht, und das wurmt mich.
Code: Alles auswählen
foreach(RaumID,Raum.EnumUsedIDs()) {
var item = dom.GetObject(RaumID);
Code: Alles auswählen
if(item.IsTypeOf(OT_CHANNEL)) {
Code: Alles auswählen
var dev=dom.GetObject(item.Device());
Code: Alles auswählen
if((dev.HssType()=="HMIP-SWDO")) {
var state=item.DPByHssDP("STATE");
a) Ermittelt die Bezeichnung des HomeMatic Gerätetyps.
b) Ermittelt einen Datenpunkt des Kanals anhand seines Namens
Code: Alles auswählen
if(state.Value())
Falls sich einer mit meinen Fragen auseinander setzen mag, wäre ich dafür sehr, sehr dankbar.
Viele Grüße,
SHC