Zahlen runden

Programmierung der HomeMatic CCU mittels contronics homeputer CL

Moderator: Co-Administratoren

Antworten
Luckysnooze
Beiträge: 35
Registriert: 26.02.2016, 20:38

Zahlen runden

Beitrag von Luckysnooze » 06.03.2017, 13:13

Hallo,

gibt es in der Homeputer CL Studio Scriptsprache eine Funktion um Zahlen zu runden? Bei Homematic-Script gibt es ja die Funktion ToString(0). Bisher mache ich es immer so, dass ich z.B. bei drei Nachkommastellen 0,500 dazu addiere und die Zahl einer Variablen des Typs Ganzzahl zuweise.

Dank und Gruß
Luckysnooze

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Zahlen runden

Beitrag von Familienvater » 06.03.2017, 15:21

Hi,

das kommt darauf an, was Du mit der gerundeten Zahl anstellen willst. Wenn es nur um "optische" Gründe geht, dann kann man sich eine Variable mit der benötigten Anzahl Nachkommastellen anlegen, und den auszugebenden Wert dieser zuweisen, beim Rechnen muss man ggf. aufpassen, weil IIRC die Zahl intern mit der vollen Genauigkeit gespeichert bleibt, und man dann beim Rechnen damit nicht mit der gerundeten Zahl rechnet.

Eine direkte Funktion ist mir nicht bekannt, der von dir genutzte Weg ist ggf. der einzige, um "richtig" auf Ganzzahlen zu runden.

Aber mit mehr Infos zum warum gibt es evtl. auch mehr Ideen zum wie.

Der Familienvater

Luckysnooze
Beiträge: 35
Registriert: 26.02.2016, 20:38

Re: Zahlen runden

Beitrag von Luckysnooze » 06.03.2017, 20:22

Hallo Familienvater,

vielen Dank für Deine engagierte Mitarbeit hier. Zum Hintergrund:
Ich bin gerade dabei mein HomeMatic-Script viewtopic.php?f=19&t=17209&start=170#p270319 auf HPCL umzusetzen. In dem Programm gibt es u.A. die Umrechnung der Windrichtung von Grad auf Bezeichnung, wofür eine mathematisch korrekte Rundung und nicht ein reines Abschneiden von Stellen erforderlich ist. Soll heißen die Windrichtung in Grad wird durch 22.5 geteilt, gerundet und mit dem Ergebnis eine Himmelsrichtung aus einem Listen-String geholt:
Zw:=(Grad/22.5)+1,5
Windrichtung:=LESETEXTPAR(Liste,Zw,",")

Was ich auch schmerzlich vermisse, ist die Möglichkeit den Inhalt einer Variablen zu setzen, deren Namen ich aus einer anderen Variablen hole:

Variable:="Wetter";
dom.GetObject(Variable).State(WertA);

Hab aber hier schon gelesen, dass das wohl so nicht geht. Schade eigentlich, hatte ich mir von HPCL doch erhofft eine wesentlich umfangreichere Scriptsprache als bei HomeMatic zur Verfügung zu haben.

Dank und Gruß
Luckysnooze

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Zahlen runden

Beitrag von Familienvater » 07.03.2017, 00:01

Hi,

OK, Du willst also eine Windrichtung zu Text machen. Ja, der steinige Weg in HPCL geht ggf. über soetwas wie ein Select-Case (was es nicht gibt), oder über Deine Methode mit dem "runden", wenn ich lange genug darüber nachdenke, fallen mir wahrscheinlich noch 2 "umgekehrte" Indexfunktionen ein.

Es mag sein, das man weniger Codezeilen benötigt, wenn man rechnet/rundet und mit dem "Index" einen Wert aus einem Pseudo-Array rausholt. Ist vielleicht die "schönere" Variante, und zeugt von Ehrgeiz.
Ich will aber keine Programmierwettbewerbe gewinnen (und mich womöglich mit Rundungsfehlern oder soetwas rumschlagen), und mit ein bisschen Copy+Paste und/oder z.B. Excel, oder VBA oder sonst einem Werkzeug Deiner Wahl ist ratz-fatz so etwas wie unten generiert.

Aufwand für die Erzeugung der nachfolgenden Codebrocken ca. 1 min, sauberer wäre es, wenn man die Gradzahlen beim "zwischen" alle noch um -11,75 "korrigiert", damit der Wert auf jeden Fall in der Mitte liegt.

Code: Alles auswählen

Wenn Windrichtung=0 dann
  strWR:='N'
  gehezu ende
endewenn
Wenn Windrichtung=22,5 dann
  strWR:='NNO'
  gehezu ende
endewenn
Wenn Windrichtung=45 dann
  strWR:='NO'
  gehezu ende
endewenn
Wenn Windrichtung=67,5 dann
  strWR:='ONO'
  gehezu ende
endewenn
Wenn Windrichtung=90 dann
  strWR:='O'
  gehezu ende
endewenn
Wenn Windrichtung=112,5 dann
  strWR:='OSO'
  gehezu ende
endewenn
Wenn Windrichtung=135 dann
  strWR:='SO'
  gehezu ende
endewenn
Wenn Windrichtung=157,5 dann
  strWR:='SSO'
  gehezu ende
endewenn
Wenn Windrichtung=180 dann
  strWR:='S'
  gehezu ende
endewenn
Wenn Windrichtung=202,5 dann
  strWR:='SSW'
  gehezu ende
endewenn
Wenn Windrichtung=225 dann
  strWR:='SW'
  gehezu ende
endewenn
Wenn Windrichtung=247,5 dann
  strWR:='WSW'
  gehezu ende
endewenn
Wenn Windrichtung=270 dann
  strWR:='W'
  gehezu ende
endewenn
Wenn Windrichtung=292,5 dann
  strWR:='WNW'
  gehezu ende
endewenn
Wenn Windrichtung=315 dann
  strWR:='NW'
  gehezu ende
endewenn
Wenn Windrichtung=337,5 dann
  strWR:='NNW'
  gehezu ende
endewenn
ende:
Oder alternativ:

Code: Alles auswählen

Wenn Windrichtung zwischen 0 und 22,5 dann
  strWR:='N'
  gehezu ende
endewenn
Wenn Windrichtung zwischen 22,5 und 45 dann
  strWR:='NNO'
  gehezu ende
endewenn
Wenn Windrichtung zwischen 45 und 67,5 dann
  strWR:='NO'
  gehezu ende
endewenn
Wenn Windrichtung zwischen 67,5 und 90 dann
  strWR:='ONO'
  gehezu ende
endewenn
Wenn Windrichtung zwischen 90 und 112,5 dann
  strWR:='O'
  gehezu ende
endewenn
Wenn Windrichtung zwischen 112,5 und 135 dann
  strWR:='OSO'
  gehezu ende
endewenn
Wenn Windrichtung zwischen 135 und 157,5 dann
  strWR:='SO'
  gehezu ende
endewenn
Wenn Windrichtung zwischen 157,5 und 180 dann
  strWR:='SSO'
  gehezu ende
endewenn
Wenn Windrichtung zwischen 180 und 202,5 dann
  strWR:='S'
  gehezu ende
endewenn
Wenn Windrichtung zwischen 202,5 und 225 dann
  strWR:='SSW'
  gehezu ende
endewenn
Wenn Windrichtung zwischen 225 und 247,5 dann
  strWR:='SW'
  gehezu ende
endewenn
Wenn Windrichtung zwischen 247,5 und 270 dann
  strWR:='WSW'
  gehezu ende
endewenn
Wenn Windrichtung zwischen 270 und 292,5 dann
  strWR:='W'
  gehezu ende
endewenn
Wenn Windrichtung zwischen 292,5 und 315 dann
  strWR:='WNW'
  gehezu ende
endewenn
Wenn Windrichtung zwischen 315 und 337,5 dann
  strWR:='NW'
  gehezu ende
endewenn
Wenn Windrichtung zwischen 337,5 und 360 dann
  strWR:='NNW'
  gehezu ende
endewenn
ende:
Ja und Nein, aber:
Man kann es so machen, und es ist "einfach", und es ist für den Fall der Fälle auch von einem dritten nachvollziehbar, zumal ein "wunderbares Beispiel", wie man soetwas wie ein Select-Case umsetzen kann. Ich will keine Dämonen an die Wand malen, aber die Rechnerei ist evtl. nicht sofort nachvollziehbar, wie an anderer Stelle bemerkt, kann auch eine "komplexe" Funktion ihre versteckten Tücken haben.

HPCL ist aus meiner Sicht bei weitem nicht so leistungsfähig wie HM-Script, aber dafür ist es einfach. Ein "Low-Level" oder Experten-Zugriff auf manche Datenpunkte fehlt mir definitiv in HPCL, da liege ich RK auch immer mit in den Ohren, aber die Zielgruppe braucht ggf. den einfachen Lowlevel-Zugriff nicht.
Ja, ein einfacher Zugriff über den Namen als Zeichenkette auf Objekte/Variablen wäre nett, es geht aber, auf mindestens 2 verschiedene "umständliche Umwege", wenn man es braucht.
Theoretisch muss man aber bedenken, das HPCL eine Compiler-Sprache ist, und damit bereits bei der Compilierung eine "einfache" Typprüfung durchgeführt wird. Mit einem "dynamischen" Zugriff auf Objekte ist nicht mehr vorhersehbar, welche expliziten oder impliziten Typumwandlungen nötig wären, um z.B. ein zeitVar := valueByName("Objekt.strVar") "sicher" auszuführen, und wie will man mit Fehlern dabei umgehen? Fehlerhandling ist extrem wichtig, aber will ich in HPCL auch noch mit try/catch anfangen, weil vielleicht in strVar der 30.02.2017 steht, und welchen Wert würde man dann in der Zeitvariablen erwarten?
Ja, "einfache" Schleifenkonstrukte wie "foreach" fehlen mit auch, aber dann baut man das halt aus einer Gehezu-Schleife und z.B. LESETEXTPAR zusammen.

Mit ein paar mehr "Funktionen", wie sie jede Programmiersprache bietet, könnte ich wahrscheinlich mein Projekt von über 40.000 Codezeilen auf vielleicht 15.000 Codezeilen eindampfen, einfach mit ein bisschen "Objektorientierung", und Variablen, die "Objektreferenzen" könnten, aber wir sind ganz schnell beim Compiler, und der Typprüfung. Und bei all meinen Programmierkünsten, ich habe schon mal versucht, soetwas wie einen "Precompiler" gebaut, das ist alles andere als einfach, und es hat immerhin bei 95% des C-Codes nach Schema-F funktioniert, aber die restlichen 5% einzufangen, wäre wahnsinn gewesen.

Der Familienvater

Luckysnooze
Beiträge: 35
Registriert: 26.02.2016, 20:38

Re: Zahlen runden

Beitrag von Luckysnooze » 07.03.2017, 18:25

Hallo Familienvater,

vielen Dank für die Darstellung Deiner Sicht der Dinge. Ich selbst bin allerdings schon ein älteres Semester, der seine ersten Programmiererfahrungen auf einem Commodore VC 20 machte, dessen Einschaltbildschirm sich mit "3583 Bytes free" meldete. Damals kämpfte man halt um jedes Byte, das man einsparen konnte. Daher vielleicht der Tick Programme immer kurz und ohne Wiederholungen zu schreiben. Eventuell hab ich von HPCL auch eine falsche Vorstellung gehabt, dachte da mehr an eine Script-Sprache so in Richtung VB. Aber das geht schon etwas zu sehr OT. Egal, das was ich mit HPCL verwirklichen möchte, werde ich damit hinbekommen, auch wenn mir hier oder da etwas fehlt und es wird bestimmt nicht meine letzte Frage hier gewesen sein.

Dank und Gruß
Luckysnooze

Antworten

Zurück zu „homeputer CL“