Homematic Script für „Dummies“ Teil 2 – Variablen richtig typisieren
In meinem ersten Beitrag zur Scriptsprache haben wir gelernt, wie einfach es ist, mit Variablen, Zahlen oder eben Kanälen zu rechnen.
Im zweiten Teil geht es darum, die Variablen, die wir in im ersten Teil erstellt haben, auch richtig zu typisieren. Die Bezeichnung „var“, die wir im ersten Teil verwendet haben, ist laut der Script Dokumentation (Seite 6) eine „untypisierte Variable“. Das kann (muss nicht) zu Fehlern führen.
Folgende Variablentypen gibt es. Die Auswahl ist überschaubar und sollte daher einfach zu verstehen sein. Ich gehe hier auf jede einzelne ein.
Wir nehmen wieder unser obiges Beispiel, welches in inzwischen etwas abgeändert habe. Bei mir werden aktuell die „POWER“ Kanäle aller Geräte addiert.
Wie zu sehen ist, habe ich einzelne Bereiche auskommentiert, sodass ich später noch weiß, was ich mir dabei gedacht habe.
Es gibt noch die Möglichkeit, alle Geräte mit „Power“ zusammenzufassen. Wie das geht, weiß ich aktuell noch nicht, werde es aber herausfinden. 🙂
! Der erste Block sind die NICHTIP Geraete var a = dom.GetObject("BidCos-RF.NEQ0117543:2.POWER").Value(); var b = dom.GetObject("BidCos-RF.NEQ0115493:2.POWER").Value(); var c = dom.GetObject("BidCos-RF.LTK0123287:2.POWER").Value(); var d = dom.GetObject("BidCos-RF.NEQ0399248:2.POWER").Value(); var e = dom.GetObject("BidCos-RF.OEQ0022831:2.POWER").Value(); var f = dom.GetObject("BidCos-RF.MEQ0487515:2.POWER").Value(); var g = dom.GetObject("BidCos-RF.OEQ0769707:2.POWER").Value(); var h = dom.GetObject("BidCos-RF.NEQ1662548:2.POWER").Value(); ! Ab hier fangen die Homematic IP Geraete an. var i = dom.GetObject("HmIP-RF.0001D569A581D8:6.POWER").Value(); var j = dom.GetObject("HmIP-RF.000213C98DDBB3:6.POWER").Value(); var k = dom.GetObject("HmIP-RF.000213C98DDBB3:6.POWER").Value(); var l = dom.GetObject("HmIP-RF.0001D3C990BFD2:6.POWER").Value(); var m = dom.GetObject("HmIP-RF.0001D3C98DD6F7:6.POWER").Value(); var n = dom.GetObject("HmIP-RF.0001D3C98DD6F7:6.POWER").Value(); var o = dom.GetObject("HmIP-RF.0001D569A581EA:6.POWER").Value(); var p = dom.GetObject("HmIP-RF.0001D3C990BBB7:6.POWER").Value(); ! Ab hier die Lichtschalter var q = dom.GetObject("HmIP-RF.000855699C57F9:7.POWER").Value(); var r = dom.GetObject("HmIP-RF.000855699C57B8:7.POWER").Value(); ! Hier werden die einzelnen Variablen addiert. var z = a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + 150 + 20; ! manuelle Zahlen: 150=PC, 20=Kühlschrank dom.GetObject("Strom_summiert").State(z);
Wir möchten also den Typ „var“ ersetzen, durch einen Typ aus der obigen Liste. In diesem Script verwenden wir die Messwertkanäle der Aktoren. Die Ausgabe der Leistung ist ja üblicherweise eine Zahl. Also kommen als mögliche Typen nur noch „integer“ oder „real“ in Frage.
Wir testen beide! Um nicht jede einzelne Zeile manuell zu ändern, kopieren wir das Script in den Editor von Windows. Unter „Bearbeiten“ – „ersetzen“ ersetzen wir einfach den Typ „var“ gegen „real“.
Nun sollte das geänderte Script geprüft werden. Der Button „Fehlerprüfung“ offenbart „kein Fehler“, was schon mal ein gutes Zeichen ist.
Nun machen wir das Ganze noch mit „integer“.
! Der erste Block sind die NICHTIP Geraete integer a = dom.GetObject("BidCos-RF.NEQ0117543:2.POWER").Value(); integer b = dom.GetObject("BidCos-RF.NEQ0115493:2.POWER").Value(); integer c = dom.GetObject("BidCos-RF.LTK0123287:2.POWER").Value(); integer d = dom.GetObject("BidCos-RF.NEQ0399248:2.POWER").Value(); integer e = dom.GetObject("BidCos-RF.OEQ0022831:2.POWER").Value(); integer f = dom.GetObject("BidCos-RF.MEQ0487515:2.POWER").Value(); integer g = dom.GetObject("BidCos-RF.OEQ0769707:2.POWER").Value(); integer h = dom.GetObject("BidCos-RF.NEQ1662548:2.POWER").Value(); ! Ab hier fangen die Homematic IP Geraete an. integer i = dom.GetObject("HmIP-RF.0001D569A581D8:6.POWER").Value(); integer j = dom.GetObject("HmIP-RF.000213C98DDBB3:6.POWER").Value(); integer k = dom.GetObject("HmIP-RF.000213C98DDBB3:6.POWER").Value(); integer l = dom.GetObject("HmIP-RF.0001D3C990BFD2:6.POWER").Value(); integer m = dom.GetObject("HmIP-RF.0001D3C98DD6F7:6.POWER").Value(); integer n = dom.GetObject("HmIP-RF.0001D3C98DD6F7:6.POWER").Value(); integer o = dom.GetObject("HmIP-RF.0001D569A581EA:6.POWER").Value(); integer p = dom.GetObject("HmIP-RF.0001D3C990BBB7:6.POWER").Value(); ! Ab hier die Lichtschalter integer q = dom.GetObject("HmIP-RF.000855699C57F9:7.POWER").Value(); integer r = dom.GetObject("HmIP-RF.000855699C57B8:7.POWER").Value(); ! Hier werden die einzelnen integeriablen addiert. integer z = a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + 150 + 20; ! manuelle Zahlen: 150=PC, 20=Kühlschrank dom.GetObject("Strom_summiert").State(z);
Auch mit diesem Variablentyp funktioniert das Script einwandfrei. (Nicht vergessen, wenn der Wert von „z“ angezeigt werden soll, muss ganz unten noch Writeline(z)
rein. Dann kann mit dem Button „Ausführen“ das Ergebnis ausgegeben werden.
Im Prinzip kann und sollten für die Berechnung diese Variablentypen verwendet werden. Allerdings sieht das Ergebnis dann nicht so schön aus.
In meinem Fall kommt 1486.830000
raus. Das ganze kann nun noch in einen weiteren Variablentyp umgewandelt werden.
Als sichtbares Ergebnis wird mit der Zeile „Writeline() das Ergebnis „1486.830000“ ausgegeben. Um daraus eine Ganzzahl zu machen, ändern wir den Variablentyp auf „Integer“. Das funktioniert, indem man die zu ändernde Variable um den „neuen“ Typ ergänzt.
Vorher:
dom.GetObject("Strom_summiert").State(z); WriteLine(z);
Nachher:
dom.GetObject("Strom_summiert").State(z.ToInteger()); WriteLine(z.ToInteger());
Es genügt ein „.“ zur Abtrennung und anschließend der neue Variablentyp, in diesem Fall „integer“.
Das ganze können wir noch dem „String“ Typ machen. Hier kann die Anzahl der Nachkommastellen in der Klammer definiert werden. Das System ist das selbe. Eine „.“ dazwischen und dann „ToString(1)“.
dom.GetObject("Strom_summiert").State(z.ToString(1)); WriteLine(z.ToString(1));
Das ergibt bei mir dann „1486.8“. Das sieht doch schon mal schöner aus.
Da der Wert ja nicht „Äpfel und Birnen“ sind, (das hat mein Mathelehrer früher immer gesagt) sollten wir dem Kind noch einen Namen geben. In diesem Fall sind das „Watt“.
Wer sich mit Excel etwas auskennt, weiß dass ein Text immer in Anführungsstrichen stehen muss. Das ist hier auch nicht anders. Also ist der Text dahinter “ Watt“. Um den Text mit der Variablen zu „verbinden“ nimmt TCL hier nicht das „&“ wie bei Excel, sondern die Raute „#“. Fertig sieht das also so aus:
dom.GetObject("Strom_summiert").State(z.ToString(0)#" Watt"); WriteLine(z.ToString(0)#" Watt");
Das Ergebnis sind dann „1486 Watt“.
Wer jetzt nicht das ganze Tutorial mitgemacht hat, wird feststellen, dass die Bezeichnung „Watt“ nur bei dem Typ „var“ oder „string“ funktioniert. Da „Watt“ ja ein Text ist, ist das Ergebnis keine Zahl mehr, sondern eine Zeichenkette (String). Daher sollte man den Typ „String“ nur verwenden, wenn der Wert nicht weiterverarbeitet wird. Es würde also nicht funktionieren, wenn man im nächsten Teil mit der Zeichenkette rechnen möchte. Buchstaben kann man nicht miteinander verrechnen, aber als optische Ausgabe genügt das.
Ich hoffe dir hat dieser Teil gefallen und freue mich über ein „Like“.
Hi,
erst mal danke für diese Wirklich guten Anleitungen. Ich hatte schon immer Bock selber kleine Scripte zu entwickeln, aber nie die Geduld und den Eifer mich durch die Skriptdokumentation zu wühlen.
Das hier ist ein richtig guter einstieg.
Man müsste aber hier dann noch erwähnen das in der Variable „Strom_summiert“ nicht der gerundete Wert mit der Bezeichnung Watt steht. Das steht nämlich nur in der Ausgabe im Skript Test Fenster.
Und wenn ich das, so weit richtig Verstanden habe, müsste das daran liegen das „Strom_summiert“ ja in der CCU als Zahl angelegt wurde und das wird dem Anschein nach Grundlegend vom System mit mit 2 Nachkommastellen und der Dort angegeben Einheit angezeigt.