Handi hat geschrieben: ↑23.09.2018, 14:30
Alchy sagt: Achtung fehlerträchtig bei Namensgleichheit von Objekten
Was meinst damit?
Das was ich schrieb. Und wenn du mal die Suche benutzt dann wirst du reichlich Lesestoff dazu finden.
Kein Objekt darf heißen wie ein anderes.
Der Zugriff mittels Script auf ein Objekt in der CCU
dom.GetObject("Objektname").....
ist fehlerträchtig. Gibt es 2 oder mehr Objekte mit demselben Namen verringern sich die Chancen, das dein Script das macht, was du willst.
Das mag dir vielleicht bei einem Objeknamen wie T_aussen nicht gleich passieren, aber selbst den hattest du schon als Scriptvariable als auch als Objektnamen in deinem kurzen Script. (was zwar keine Dopplung im Sinne des Bugs ist) aber
Ich glaube kaum, das dir bewusst ist, wenn du eine Systemvariabe: Licht besitzt, ein Programm: Licht und ein Gewerk: Licht und einen Favoriten: Licht das es dann beim z.B. Zugriff mittels Script
dom.GetObject("Licht").....
für die CCU schwierig wird zu erraten, was du denn willst. Jetzt verstanden?
Handi hat geschrieben: ↑23.09.2018, 14:30
Kann ich einerseits nachvollziehen. Andererseits: was soll der Sensor sonst liefern?
Ich habe Zahlen
variable geschrieben. Du kannst ja den Wert des Sensors auch z.B. in einer Stringvariablen speichern, dann ist es eine Zeichenkette mit der man erstmal nicht rechnen kann. Nehmen wir die Feuchtewerte eines Sensors. Die haben den Typ Integer - und schon geht das Theater los.
Was ich also sagen wollte: Es erfolgt weder eine Prüfung auf Vorhandensein des Objekts, noch auf Korrektheit des Typs usw..
Es wird im Beispielscript nichts geprüft - kurzum - es funktioniert nur, wenn du Regeln beachtest und alles richtig machst.
Handi hat geschrieben: ↑23.09.2018, 14:30
Ich mache das mit der Variablen so, weil ich kein Meteorologe bin,
Mir wäre es absolut zu blöd, für meine in Summe ca. 15 Temperatursensoren jeweils eine Systemvariable für Temperatur und Luftfeuchtigkeit anzulegen damit ich dessen Werte stündlich loggen kann. Aber bitte - jedem Tierchen sein....
Handi hat geschrieben: ↑23.09.2018, 14:30
Hab ich mich dran versucht, aber außer der Temperatur bekomme ich in WebUI leider nix zu sehen (warum auch immer).
Dann hast du dabei einen Fehler gemacht. Statt diesen auszumerzen, wird eben irgendetwas anderes versucht.
(Aber ich würde auch nicht 15 virtuelle CUxD Geräte anlegen um die Werte für alle HM Sensoren bei mir zu haben
)
Handi hat geschrieben: ↑23.09.2018, 14:30
entstammt 1:1 dem stündlich laufenden Script für das Umkopieren der Sensordaten in die zu loggenden Variablen. Und da die Taupunktsberechnung ebenfalls stündlich laufen soll sind die beiden Zuweisungen natürlich schon vorhanden und werden dann eigentlich nur um die Umwandlung in real und die eigentliche Taupunktsberechnung ergänzt. Wenn man nur letzteres machen will dann sollte die direkte Nutzung der Sensorvariablen natürlich auch möglich sein. Nur weiß ich halt wieder nicht wie das genau geht.
In meiner Signatur sollten Links sein zur Scriptdoku. Die ist ein Anfang, wenn auch noch lange nicht das Ende.
Natürlich kannst du das so machen, wie du es willst.
Ein paar Sachen:
Die Wandlung des Wertes einer Systemvariabel vom Typ Zahl ist nicht nötig. Der Wert hat den Typ real.
Ebenso z.B. der Temperaturdatenpunkt eines Sensors. Feuchtewerte, siehe oben.
Und was die Nutzung von unterschiedlichen Objekten angeht.
Hier das Beispiel1 von oben
- du hast 2 Systemvariablen vom Typ Zahl angelegt, welche von wo auch immer ihre Werte für Temperatur und Feuchte stündlich erhalten. Nun willst du den Taupunkt daraus errechnen:
Code: Alles auswählen
! Objekte die Werte enthalten
object temperatur = dom.GetObject(ID_SYSTEM_VARIABLES).Get("T_aussen");
object feuchte = dom.GetObject(ID_SYSTEM_VARIABLES).Get("F_aussen");
! Werte auslesen und zur Berechnung zur Verfügung stellen
real rT = temperatur.Value();
real rF = feuchte.Value();
! Taupunktsberechnung
real Tp_aussen = 243.12*(((17.62*rT)/(243.12+rT))+((rF/100).Log()))/((4283.7744/(243.12+rT))-((rF/100).Log()));
!Ausgabe Ergebnis
WriteLine(rT);
WriteLine(rF);
WriteLine(Tp_aussen);
Die Werte sind natürlich eben genau so alt wie eben die Werte aus den Variablen. Aber es funktioniert, wie du willst.
Jetzt willst du aber nicht die Werte aus Systemvariablen lesen, sondern direkt die Werte aus deinem Sensor verwenden.
Nun könnte man auf die Idee kommen die Objekte, welche die Werte enthalten einfach auszutauschen
Code: Alles auswählen
! Objekte die Werte enthalten
object temperatur = dom.GetObject(ID_DATAPOINTS).Get("BidCos-RF.HEQ012345678:1.TEMPERATURE");
object feuchte = dom.GetObject(ID_DATAPOINTS).Get("BidCos-RF.HEQ012345678:1.HUMIDITY");
! Werte auslesen und zur Berechnung zur Verfügung stellen
real rT = temperatur.Value();
real rF = feuchte.Value();
! Taupunktsberechnung
real Tp_aussen = 243.12*(((17.62*rT)/(243.12+rT))+((rF/100).Log()))/((4283.7744/(243.12+rT))-((rF/100).Log()));
!Ausgabe Ergebnis
WriteLine(rT);
WriteLine(rF);
WriteLine(Tp_aussen);
Das wird aber nicht funktionieren.
Die Ausgabe sieht dann ungefähr so aus:
Der Grund ist, wie ich schon oben schrieb, das der Feuchtewert ein Integer Wert ist. Das man real davor schreibt interessiert erstmal wenig.
Klar, wandeln wir den Wert, wie du es oben gemacht hast mittels .ToFloat();
Auch dieses wird dich nicht weiterbringen (je nach Rega). Probier es aus.
Was auch immer, es ist doch aber mehr auf den Rücken durch die Brust ins Auge.
Ich kürze es ab:
Also suchen wir die Ursache oder beschreiten gleich einen anderen Weg zur Berechnung.
Nehmen wir also dieses:
Code: Alles auswählen
! Objekte die Werte enthalten
object temperatur = dom.GetObject(ID_DATAPOINTS).Get("BidCos-RF.HEQ0105626:1.TEMPERATURE");
object feuchte = dom.GetObject(ID_DATAPOINTS).Get("BidCos-RF.HEQ0105626:1.HUMIDITY");
! Werte auslesen und zur Berechnung zur Verfügung stellen
real rT = temperatur.Value();
real rF = feuchte.Value();
! Taupunktsberechnung
real Tp_aussen = 243.12*(((17.62*rT)/(243.12+rT))+((0.01*rF).Log()))/((4283.7744/(243.12+rT))-((0.01*rF).Log()));
!Ausgabe Ergebnis
WriteLine(rT);
WriteLine(rF);
WriteLine(Tp_aussen);
Werden wir annehmbare Werte erhalten.
Also nehmen wir dieselbe Berechnung auch bei den Systemvariablen:
Code: Alles auswählen
! Objekte die Werte enthalten
object temperatur = dom.GetObject(ID_SYSTEM_VARIABLES).Get("T_aussen");
object feuchte = dom.GetObject(ID_SYSTEM_VARIABLES).Get("F_aussen");
! Werte auslesen und zur Berechnung zur Verfügung stellen
real rT = temperatur.Value();
real rF = feuchte.Value();
! Taupunktsberechnung
real Tp_aussen = 243.12*(((17.62*rT)/(243.12+rT))+((0.01*rF).Log()))/((4283.7744/(243.12+rT))-((0.01*rF).Log()));
!Ausgabe Ergebnis
WriteLine(rT);
WriteLine(rF);
WriteLine(Tp_aussen);
Auch das sollte funktionieren. Langer Text - hoffe du konntest folgen.
Alchy