Schreiben in Systemvariablen klappt nicht

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Rollaktor
Beiträge: 6
Registriert: 06.08.2017, 13:13
Hat sich bedankt: 1 Mal

Schreiben in Systemvariablen klappt nicht

Beitrag von Rollaktor » 06.08.2017, 22:24

Hallo Forum,
mein erster Eintrag, hoffentlich an der richtigen Stelle! Ich betreibe seit einigen Wochen ein einfaches Setup aus einem Lichtsensor (HM-Sen-LI-O), einem Rollladenaktor (HM-LC-Bl1PBU-FM) und einer CCU2. Nachdem ich die Doku von EQ3, die Tipps für Anfänger und etliche Foreneinträge gelesen habe, scheitere ich doch an einer scheinbar einfachen Aufgabe: Den Mittelwert von einigen Messwerten in eine Systemvariable zu schreiben. Als Ausgangspunkt habe ich ein Programm aus der EQ3-Doku genommen, das aus Messwerten einen Maximalwert ermittelt. Das funktioniert auch. Die Abänderung auf einen Mittelwert scheitert ohne für mich erkennbaren Grund. In der Systemvariablen kommt nichts an.
Die Systemvariable „hell_mittel“ existiert und wurde einmalig mit einem Wert von 99.00 Lux vorbelegt. Erwartet hätte ich, dass bei einem manuellen Aufruft des Skriptes dort der Wert der aktuellen Helligkeit landet und bei der Aktualisierung über einen neuen Messwert, sich ein Wert zwischen dem Messwert und 99 einstellt. Stat dessen bleibt die Variable immer auf 99.00 stehen.
An Zusatztools habe mittlerweile CUxD 1.10a, cuxchart 1.4.5, HQWebUI 2.5.4 und einen scriptparser von anli installiert. Das Programm mit Kommentaren füge ich bei, in der CCU2 habe ich es ohne Kommentare eingegeben. Leider habe ich noch nicht herausgefunden, wie man die separaten Codefenster befüllt….
Danke für Tipps

Code: Alles auswählen

! gewichteter Mittelwert über 6 Werte
real    m;
! Mittelwert
real    n = 6;
! Anzahl der Mittelwerte
var source  = dom.GetObject("$src$");
! Wird das Programm durch eingehende Wetterdaten angestoßen, so ist dessen Quelle ($src$) definiert.
var mittelHell = dom.GetObject("hell_mittel");
! hell_mittel ist eine Systemvariabel
 if (source)
! Wenn keine Quelle existiert, liefert der Aufruf von „dom.GetObject($src$)“  „null“.
! Das ist der Fall bei manuellem Aufruf
 {
   m = dom.GetObject("hell_mittel").Value();
   ! Mittelwert in die lokale Variable einlesen
   m = ((m*(n-1)) +  dom.GetObject("Terasse(A4).Helligkeit").DPByHssDP("LUX").Value())/n;
   ! Berechnung Mittelwert
   dom.GetObject("hell_mittel").State(m);
    ! In Systemvariable schreiben
 }
else
! keine Quelle für das Skript
  {
    var lichtsensor = dom.GetObject("Terasse(A4).Helligkeit");
    ! Lichtsensor holen
    var curHell = lichtsensor.DPByHssDP("LUX");
    ! Helligkeit ist im Datenpunkt „LUX“, am einzigen Kanal des Lichtsensors.
    ! Methode DPByHssDP liest den Wert
    mittelHell.Variable(curHell.Value());
    ! mittelHell wird mit aktueller Helligkeit initialisert
  }
Zuletzt geändert von alchy am 09.08.2017, 08:53, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

Gerti
Beiträge: 3027
Registriert: 28.01.2016, 18:06
System: CCU
Wohnort: Hürth
Hat sich bedankt: 16 Mal
Danksagung erhalten: 268 Mal

Re: Schreiben in Systemvariablen klappt nicht

Beitrag von Gerti » 06.08.2017, 23:06

Hi!

Versuch mal
dom.GetObject(mittelHell).State(curHell.Value());

Gruß
Gerti

Rollaktor
Beiträge: 6
Registriert: 06.08.2017, 13:13
Hat sich bedankt: 1 Mal

Re: Schreiben in Systemvariablen klappt nicht

Beitrag von Rollaktor » 08.08.2017, 20:43

Hallo Gerti,

vielen Dank für die schnelle Antwort. Irgendetwas hat sich verändert, beim Testen hat sich nichts getan, aber übernacht wurde die Variable beschrieben. It's a kind of magic.
Ich werde es mal weiter beobachten.

Bratmaxe
Beiträge: 1573
Registriert: 28.05.2015, 12:48
Wohnort: Willich
Hat sich bedankt: 4 Mal
Danksagung erhalten: 10 Mal

Re: Schreiben in Systemvariablen klappt nicht

Beitrag von Bratmaxe » 09.08.2017, 09:09

Hallo
ich hab das mal kurz getestet. Ich vermute das Problem liegt bei " if (source)" wenn source hier null ist, dann könnte die ReGaHss schon ein Problem bekommen, da if (null) nicht ausführbar ist.

Versuchs mal hiermit:

Code: Alles auswählen

! gewichteter Mittelwert über 6 Werte
var AnzahlWerte = 6; ! Anzahl der Mittelwerte
if (dom.GetObject("$src$") == null)
{
	dom.GetObject("hell_mittel").Variable(dom.GetObject("Terasse(A4).Helligkeit").DPByHssDP("LUX").Value());
}
else
{
	! In Systemvariable schreiben
	dom.GetObject("hell_mittel").State(((dom.GetObject("hell_mittel").Value()*(AnzahlWerte-1)) + dom.GetObject("Terasse(A4).Helligkeit").DPByHssDP("LUX").Value())/AnzahlWerte);
}
In der Zeile "dom.GetObject("hell_mittel").Variable(dom.GetObject("Terasse(A4).Helligkeit").DPByHssDP("LUX").Value());"
schreibst du den Wert über ".Variable" in die Systemvariable rein. Ich bin davon ausgegangen, das dies Absicht ist. Hier wird auch bei Änderung kein Programm angestoßen!Mit ".State" statt ".Variable" reagieren Programme dann auch auf diese Änderung!

Gruß Carsten
Gruß Carsten

Rollaktor
Beiträge: 6
Registriert: 06.08.2017, 13:13
Hat sich bedankt: 1 Mal

Re: Schreiben in Systemvariablen klappt nicht

Beitrag von Rollaktor » 09.08.2017, 20:59

Ich finde das richtig nett, dass du dir Code angeschaut hast. Besten Dank für die beiden Hinweise, ich werde dem nachgehen, wenn die Zeit passt.

Hubiherzog
Beiträge: 143
Registriert: 15.10.2014, 20:04

Re: Schreiben in Systemvariablen klappt nicht

Beitrag von Hubiherzog » 15.08.2017, 12:06

Hallo, Forum,
Habe einen Lichtsensor HM-Sen-LI-O installiert und dieser läuft im Rolloprogramm.
Nun möchte ich die Helligkeit im e-Mail Addon in einer e-mail anzeigen.
In der Mail werden einige Zustände schon erfolgreich angezeigt. Also da gibt es keine Fehler

Habe momentan folgendes in TCL geschrieben:

Code: Alles auswählen

var vLux = dom.GetObject("BidCos-RF.NEQ1358298:1").State();
vLux = vLux.ToString(0)#" Lux";
Der TCL-Script wird auch vom Programm nicht bemängelt.
nun wird aber in der e-mail nur "Null" ausgegeben - kein aktueller Lux-Wert

Was habe ich falsch gemacht ? Oder gibt es eine andere Lösung, den Helligkeitswert zu ermittel. In HM wird die Lux-Zahl unter Geräte richtig angezeigt. Kann man das evt. zur ANzeige in der Mail nutzen.

Vielen Dank
Hubiherzog
Zuletzt geändert von alchy am 16.08.2017, 08:55, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

Hubiherzog
Beiträge: 143
Registriert: 15.10.2014, 20:04

Re: Schreiben in Systemvariablen klappt nicht

Beitrag von Hubiherzog » 15.08.2017, 14:53

Hallo,
Frage konnte ich selbst klären durch probieren.
TCL muß richtig heißen:

Code: Alles auswählen

var vLux = dom.GetObject("Lichtsensor:1").State();
vLux = vLux.ToString(0)#" Lux";
Gruß
Hubiherzog
Zuletzt geändert von alchy am 16.08.2017, 08:55, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

DrTob
Beiträge: 3426
Registriert: 29.10.2010, 08:24
Danksagung erhalten: 5 Mal

Re: Schreiben in Systemvariablen klappt nicht

Beitrag von DrTob » 15.08.2017, 15:25

Das ist kein TCL!

Bratmaxe
Beiträge: 1573
Registriert: 28.05.2015, 12:48
Wohnort: Willich
Hat sich bedankt: 4 Mal
Danksagung erhalten: 10 Mal

Re: Schreiben in Systemvariablen klappt nicht

Beitrag von Bratmaxe » 16.08.2017, 08:47

Gemeint sind sicherlich die Eintragungen im E-Mail Addon, was ebenfalls mit TCL gekennzeichnet ist.

funktionieren muss es aber auch über die Seriennummer, allerdings hat hier der Datenpunkt gefehlt:

Code: Alles auswählen

var vLux = dom.GetObject("BidCos-RF.NEQ1358298:1.LUX").State().ToString(0)#" Lux";
Wenn du den Namen "Lichtsensor:1" benutzt, hat dies allerdings den Vorteil, das auch nach einem Austausch des Sensors über die CCU Funktion, das das Skript direkt wieder funktioniert und nicht erneut auf die neue Seriennummer angepasst werden muss.

Gruß Carsten
Gruß Carsten

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

Re: Schreiben in Systemvariablen klappt nicht

Beitrag von alchy » 16.08.2017, 09:37

Bratmaxe hat geschrieben:Gemeint sind sicherlich die Eintragungen im E-Mail Addon, was ebenfalls mit TCL gekennzeichnet ist.
Nö, oder selbst wenn. Es ist trotzdem ist es kein TCL. ggf. hat er nur vergessen den Code drumherum mitzuposten.
Aber so ist es kein TCL.
u.U. Klugscheißermodus, aber auch die Fragenden dürfen sich Gedanken machen, was sie wie posten.
Bratmaxe hat geschrieben: funktionieren muss es aber auch über die Seriennummer, allerdings hat hier der Datenpunkt gefehlt:

Code: Alles auswählen

var vLux = dom.GetObject("BidCos-RF.NEQ1358298:1.LUX").State().ToString(0)#" Lux";
das ist soweit fast korrekt, wobei ich .State() vielleicht besser durch .Value() ersetzt hätte. :wink:
Bratmaxe hat geschrieben: Wenn du den Namen "Lichtsensor:1" benutzt, hat dies allerdings den Vorteil, das auch nach einem Austausch des Sensors über die CCU Funktion, das das Skript direkt wieder funktioniert und nicht erneut auf die neue Seriennummer angepasst werden muss.
und da triften wir wieder auseinander. :mrgreen:
Wenn man aber den Kanalnamen umbenennt, funktioniert plötzlich die Abfrage über den Kanalnamen nicht mehr, das mit der Seriennummer schon.
Nun kommt es wieder darauf an, was passiert eher, Austausch eines Sensors oder Umbenennen eines Kanales....
Hat also alles seine Vor und Nachteile und ist grundsätzlich jedem selbst überlassen.

ABER was nicht jedem überlassen ist:
Wenn man den Kanalnamen verwendet, dann bitte nicht so wie gepostet. :!:

Zusammenfassender Vorschlag, auch wenn direkt auf dom.GetObject an sich schon "fragwürdig" werden kann
und ohne "Fehlerhandling" als HM Script, was dann im TCL Reiter in den entsprechenden TCL Code eingebettet werden kann.

Über die Seriennummer:

Code: Alles auswählen

string vLux = (dom.GetObject("BidCos-RF.NEQ1358298:1.LUX").Value()).ToString(0)#" Lux";
Über den Kanalnamen:

Code: Alles auswählen

string vLux = (dom.GetObject("Lichtsensor:1").DPByHssDP("LUX").Value()).ToString(0)#" Lux";
Dabei gehe ich natürlich davon aus, das die Seriennummer und der Kanalname vom Kanal 1 des Sensors stimmen.

Alchy

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.

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“