Wie kann ich zwei SV (Typ Zeichenkette) addieren und in neue SV (Typ Zeichenkette) schreiben.

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Benutzeravatar
Black
Beiträge: 5548
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 434 Mal
Danksagung erhalten: 1096 Mal
Kontaktdaten:

Re: Wie kann ich zwei SV (Typ Zeichenkette) addieren und in neue SV (Typ Zeichenkette) schreiben.

Beitrag von Black » 31.12.2023, 22:24

korrekt.

wobei ich trotzdem zu korrekten Typisieren der Variablen rate, Editoren können am Scriptende einen Typwechsel erkennen und dies auch entsprechend am Scriptende ausgeben, so hat man Ansatz zu entscheiden, ja, der Typwechsel ist ok und gewollt, oder ähm, da stimmt was nicht

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising


Xel66
Beiträge: 14263
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 597 Mal
Danksagung erhalten: 1525 Mal

Re: Wie kann ich zwei SV (Typ Zeichenkette) addieren und in neue SV (Typ Zeichenkette) schreiben.

Beitrag von Xel66 » 01.01.2024, 07:02

Roland M. hat geschrieben:
31.12.2023, 22:20
Weil es durch die dynamische Typendeklaration völlig egal ist, was du hinschreibst.
Ja, kenne ich. Aber ich sehe es pragmatisch. Wenn ich mit Werten rechnen will, deklariere ich sie im Vorfeld mit einem geeigneten Typ. Nenne mich altmodisch, aber ich erachte das als zielführend.

Ich halte es auch für wenig zielführend, solche Werte überhaupt als String (mit Einheit) in der CCU vorzuhalten. Damit schießt man sich schon für solche Tools wie Historian von vornherein ins Aus. Strings kann man nicht in Diagrammen anzeigen und auswerten. Die Werte kann man auch als Zahl definieren und in den Einstellungen eine Einheit zuweisen. Benötigt man unbedingt in einer Visu eine Maßeinheit, muss diese eben in der Bildschirmausgabe anhängen. Meiner unmaßgeblichen Meinung nach ergibt es nur so einen wirklich brauchbaren Sinn. Vor allem spart man sich irgendwelche nachträglichen Extraktionen von Werten für die Weiterverarbeitung. Das Problem beginnt also schon mit dem Auslesen der Werte und dem Schreiben in die CCU.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

Matsch
Beiträge: 5557
Registriert: 30.05.2019, 11:37
System: Alternative CCU (auf Basis OCCU)
Wohnort: Chemnitz
Hat sich bedankt: 120 Mal
Danksagung erhalten: 763 Mal

Re: Wie kann ich zwei SV (Typ Zeichenkette) addieren und in neue SV (Typ Zeichenkette) schreiben.

Beitrag von Matsch » 01.01.2024, 12:03

Ich bin auch sehr dafür, die Objekttypen klar zu benennen statt var. Eine solche Deklaration macht es später viel einfacher, die ehemalige Absicht nachvollziehen zu können. Auch wenn die Typkonvertierung trotzdem macht, was sie will.

Im übrigen braucht man manchmal halt Variablenfelder, die es nicht gibt. Die bilde ich auch auf Strings ab.

MichaelN
Beiträge: 9807
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 711 Mal
Danksagung erhalten: 1656 Mal

Re: Wie kann ich zwei SV (Typ Zeichenkette) addieren und in neue SV (Typ Zeichenkette) schreiben.

Beitrag von MichaelN » 01.01.2024, 12:49

Xel66 hat geschrieben:
01.01.2024, 07:02
Ich halte es auch für wenig zielführend, solche Werte überhaupt als String (mit Einheit) in der CCU vorzuhalten.
Bester Tipp bisher.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Benutzeravatar
Roland M.
Beiträge: 9895
Registriert: 08.12.2012, 15:53
System: CCU
Wohnort: Graz, Österreich
Hat sich bedankt: 256 Mal
Danksagung erhalten: 1411 Mal

Re: Wie kann ich zwei SV (Typ Zeichenkette) addieren und in neue SV (Typ Zeichenkette) schreiben.

Beitrag von Roland M. » 01.01.2024, 12:59

Hallo!
Xel66 hat geschrieben:
01.01.2024, 07:02
Ja, kenne ich. Aber ich sehe es pragmatisch. Wenn ich mit Werten rechnen will, deklariere ich sie im Vorfeld mit einem geeigneten Typ. Nenne mich altmodisch, aber ich erachte das als zielführend.
Ja, ich widerspreche dir gar nicht. Ich wollte nur hinweisen, dass eine Deklaration als var auch nicht falsch ist.

Persönlich verwende ich meist das var, weil in Verbindung mit einer gleichzeitigen Zuweisung (var x = domGetObject(...)) der Typ ohnehin deutlich ersichtlich ist.
Auch ist mir die Typenkonvertierung noch von COBOL (mit dem ich mir meine ersten eigenen Brötchen verdiente ;) ) in guter Erinnerung.
Mit einem VAR X PIC 999999 REDEFINE VAR Y PIC 'AAAAAA' (oder so ähnlich :roll: ) konnte man auch so manches Problem einfach und speichersparend lösen! :D

Ich halte es auch für wenig zielführend, solche Werte überhaupt als String (mit Einheit) in der CCU vorzuhalten. Damit schießt man sich schon für solche Tools wie Historian von vornherein ins Aus.
Da kann ich dir auch nur voll und ganz zustimmen!


Roland
Zur leichteren Hilfestellung bitte unbedingt beachten:
  • Bezeichnung (HM-... bzw. HmIP-...) der betroffenen Geräte angeben (nicht Artikelnummer)
  • Kurzbeschreibung des Soll-Zustandes (Was soll erreicht werden?)
  • Kurzbeschreibung des Ist-Zustandes (Was funktioniert nicht?)
  • Fehlermeldungen genau abschreiben, besser noch...
  • Screenshots von Programmen, Geräteeinstellungen und Fehlermeldungen (direkt als jpg/png) einstellen!

-----------------------------------------------------------------------
1. CCU2 mit ~100 Geräten (in Umstellung auf RaspberryMatic-OVA auf Proxmox-Server)
2. CCU2 per VPN mit ~50 Geräten (geplant: RaspberryMatic auf Charly)
3. CCU2 per VPN mit ~40 Geräten (geplant: RaspberryMatic auf CCU3)
CCU1, Test-CCU2, Raspi 1 mit kleinem Funkmodul, RaspberryMatic als VM unter Proxmox, Access Point,...

be.pe
Beiträge: 281
Registriert: 11.08.2019, 16:39

Re: Wie kann ich zwei SV (Typ Zeichenkette) addieren und in neue SV (Typ Zeichenkette) schreiben.

Beitrag von be.pe » 01.01.2024, 13:03

Hey,
euch allen Danke.
Das mit Float funktioniert einbahnfrei.

Matsch
Beiträge: 5557
Registriert: 30.05.2019, 11:37
System: Alternative CCU (auf Basis OCCU)
Wohnort: Chemnitz
Hat sich bedankt: 120 Mal
Danksagung erhalten: 763 Mal

Re: Wie kann ich zwei SV (Typ Zeichenkette) addieren und in neue SV (Typ Zeichenkette) schreiben.

Beitrag von Matsch » 01.01.2024, 13:38

Doch doch, das funktioniert damit nur in die eine Richtung.

Benutzeravatar
Henke
Beiträge: 1538
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 144 Mal
Danksagung erhalten: 313 Mal

Re: Wie kann ich zwei SV (Typ Zeichenkette) addieren und in neue SV (Typ Zeichenkette) schreiben.

Beitrag von Henke » 01.01.2024, 14:32

Xel66 hat geschrieben:
31.12.2023, 19:14
Wie wäre es mit ++? Zumindest würde die Scriptdoku das raten. Und warum deklariert Du als var und nicht als real?
Inkrement bei einem CCU Script? Das ist mir neu und in der Doku finde ich nichts. Lerne gerne und bitte um genaueren Bezug.

Da hier viel über wie sollte ein CCU Script aussehen, auch mal meinen Senf dazu.
Gegeben, so schön klein aber doch der eine oder andere suboptimale Ansatz:

Code: Alles auswählen

!Skript zur Berechnung Gesamterzeugung Solar

var solar1 = dom.GetObject("StromVorTageserzeugung PV");
var solar2 = dom.GetObject("Stromerzeugung SoBa gestern");
var gsolar = dom.GetObject("Gesamtsolarerzeugung");
gsolar.State((solar1.State() + solar2.State()).Round(2));
Die erste Zeile "!Script ...." ist sehr gut. Bei einen Runtime Fehler kommt das im Log und man muss nicht lange suchen um welches Script es sich handelt.

"var solar1 = dom.GetObject("StromVorTageserzeugung PV");"
Nope.
1. Nicht als String. Zahl mit einer angegebenen Maßeinheit ist besser. Einfacher bei der Berechnung und durch die Maßeinheit der Systemvariable bleibt auch die Darstellung gleich.
2. Da es eine Systemvariable ist, sollte mit "dom.GetObject(ID_SYSTEM_VARIABLES);" darauf zugegriffen werden.
3. Typenbezeichnung ist nicht object. Das hat zwar nur Auswirkungen wenn etwas wie Blacks genialer Editor verwendet wird, aber schadet auch nicht. Es hat also nur Vorteile.
4. Name der Variable "solar1" enthält nicht den Typ. Das ist bei größeren Scripten durchaus nützlich. bSchlagMichTot z.B. ist bei mir boolean, iBitteNicht integer und ratet mal, rDochStirb ist...
5. Name der Systemvariablen "StromVorTageserzeugung PV". Nun ja, es gibt einen Unterschied zwischen Strom (A) und Arbeit (kWh), aber noch mehr würde ich auf Leerzeichen, die Dinger sind unsichtbar, verzichten und mehr Struktur da rein bringen. Angelegt an andere objektorientierte Sprachen/Datendefinitionen sieht das eher so aus: "PV.VorTageserzeugung". Damit sind selbst bei der WebUI die Einträge gruppiert und können später in anderen Sprachen schnell in eine Struktur umgewandelt werden.

"gsolar.State((solar1.State() + solar2.State()).Round(2));"
Würde jetzt mit der Umwandlung als Sysvariable Zahl laufen. Schreibt man Scripts, die die Systemvariablen nicht automatisch anlegen, würde ich es wie folgt erledigen:
"gsolar.State(( 0.0 + solar1.State() + solar2.State()).Round(2));"
Das läuft auf einer CCU2 wenn die Systemvariable Zahl ist (Zahl.ToFloat() knallt wohl auf der CCU2) und auch beim Systemvariablen Typ String.

Klammern reduzieren, um es leserlicher zu gestalten. Debugmöglichkeit einbauen und...
Ergebnis:

Code: Alles auswählen

!Skript zur Berechnung Gesamterzeugung Solar

object oSysVar = dom.GetObject(ID_SYSTEM_VARIABLES);
object oPvVorTag = oSysVar.Get("Pv.VorTageserzeugung");
object oPvGestern = oSysVar.Get("Pv.SoBaGestern");
real rGes = 0.0 + oPvVorTag.State() + oPvGestern.State();
! WriteLine ( rGes );
oSysVar.Get("Pv.Gesamt").State(rGes.Round(2));
Zuletzt geändert von Henke am 01.01.2024, 18:07, insgesamt 2-mal geändert.

MichaelN
Beiträge: 9807
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 711 Mal
Danksagung erhalten: 1656 Mal

Re: Wie kann ich zwei SV (Typ Zeichenkette) addieren und in neue SV (Typ Zeichenkette) schreiben.

Beitrag von MichaelN » 01.01.2024, 15:33

Henke hat geschrieben:
01.01.2024, 14:32
oSchlagMichTot z.B. ist bei mir boolean,
Wegen dem b im Namen? SCNR :mrgreen:
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Antworten

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