Hilfe mit schleife in meinem Skript

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

hirrsson
Beiträge: 45
Registriert: 14.10.2016, 08:14
Hat sich bedankt: 8 Mal
Danksagung erhalten: 1 Mal

Hilfe mit schleife in meinem Skript

Beitrag von hirrsson » 26.06.2022, 15:42

Hallo,

ich möchte meinem Stromverbrauch für jede Monat in einem Systemvariable abspeichern. Kam auf der Idee mit ";" seperated Liste.

Leider habe ich es nicht hinbekommen, eine schöne schliefe zu machen (damit ich den Code nicht immer wiederholen muss).
Hat jemand ein Tipp, wie ich meinem Code einfacher (mit einer schliefe o.ä.) machen kann?
Ich möchte nur 1 Wert in die Liste ändern! Und wenn ich es als Schleife mache, dann kann ich nicht der Variabel dynamisch ändern. (mit Dynamisch meine ich: den Wert von "VerbrauchX" zu ändern.

Code: Alles auswählen

! Hole der Wert und parse damit ich Wert jede Monat bekomme
string str = dom.GetObject("Stomverbrauch per Monat 2022").Value();

integer verbrauch1 = str.StrValueByIndex(";", 0).ToInteger();
integer verbrauch2 = str.StrValueByIndex(";", 1).ToInteger();
integer verbrauch3 = str.StrValueByIndex(";", 2).ToInteger();
integer verbrauch4 = str.StrValueByIndex(";", 3).ToInteger();
integer verbrauch5 = str.StrValueByIndex(";", 4).ToInteger();
integer verbrauch6 = str.StrValueByIndex(";", 5).ToInteger();
integer verbrauch7 = str.StrValueByIndex(";", 6).ToInteger();
integer verbrauch8 = str.StrValueByIndex(";", 7).ToInteger();
integer verbrauch9 = str.StrValueByIndex(";", 8).ToInteger();
integer verbrauch10 = str.StrValueByIndex(";", 9).ToInteger();
integer verbrauch11 = str.StrValueByIndex(";", 10).ToInteger();
integer verbrauch12 = str.StrValueByIndex(";", 11).ToInteger();

!Frage welchen Monat wir heute haben
integer aktuellesMonat = system.Date("%m").ToInteger();

!Ändere der Wert für nur für diese Monat
if ( aktuellesMonat == 1 )
	{ verbrauch1 = verbrauch1 + zaehlerDifferenz;
	}elseif ( aktuellesMonat == 2 ) 
	{ verbrauch2 = verbrauch2 + zaehlerDifferenz;
	}elseif ( aktuellesMonat == 3 )
	{ verbrauch3 = verbrauch3 + zaehlerDifferenz;
	}elseif ( aktuellesMonat == 4 )
	{ verbrauch4 = verbrauch4 + zaehlerDifferenz;
	}elseif ( aktuellesMonat == 5 )
	{ verbrauch5 = verbrauch5 + zaehlerDifferenz;
	}elseif ( aktuellesMonat == 6 )
	{ verbrauch6 = verbrauch6 + zaehlerDifferenz;
	}elseif ( aktuellesMonat == 7 )
	{ verbrauch7 = verbrauch7 + zaehlerDifferenz;
	}elseif ( aktuellesMonat == 8 )
	{ verbrauch8 = verbrauch8 + zaehlerDifferenz;
	}elseif ( aktuellesMonat == 9 )
	{ verbrauch9 = verbrauch9 + zaehlerDifferenz;
	}elseif ( aktuellesMonat == 10 )
	{ verbrauch10 = verbrauch10 + zaehlerDifferenz;
	}elseif ( aktuellesMonat == 11 )
	{ verbrauch11 = verbrauch11 + zaehlerDifferenz;
	}elseif ( aktuellesMonat == 12 )
	{ verbrauch12 = verbrauch12 + zaehlerDifferenz;
	}

!setze der Systemvariabel nochmal
dom.GetObject(stromVerbrauchMonat).State(verbrauch1#";"#verbrauch2#";"#verbrauch3#";"#verbrauch4#";"#verbrauch5#";"#verbrauch6#";"#verbrauch7#";"#verbrauch8#";"#verbrauch9#";"#verbrauch10#";"#verbrauch11#";"#verbrauch12);
Zuletzt geändert von hirrsson am 26.06.2022, 16:50, insgesamt 1-mal geändert.

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Hilfe mit schleife in meinem Skript

Beitrag von MichaelN » 26.06.2022, 16:42

Ich bin ziemlich sicher das die Schleifen sogar in der offiziellen Skript Dokumentation erklärt sind. Ein paar weitere Tipps findest du in meiner Signatur.

Btw : Code bitte in Code-Tags posten
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 +++

hirrsson
Beiträge: 45
Registriert: 14.10.2016, 08:14
Hat sich bedankt: 8 Mal
Danksagung erhalten: 1 Mal

Re: Hilfe mit schleife in meinem Skript

Beitrag von hirrsson » 26.06.2022, 16:48

MichaelN hat geschrieben:
26.06.2022, 16:42
Ich bin ziemlich sicher das die Schleifen sogar in der offiziellen Skript Dokumentation erklärt sind.
Stimmt. Aber ich kriege es nicht hin.

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Hilfe mit schleife in meinem Skript

Beitrag von MichaelN » 26.06.2022, 17:01

Das heißt du suchst keine Idee, sondern jemanden der dir die Hand führt?
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 +++

Tyfys
Beiträge: 531
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 26 Mal
Danksagung erhalten: 121 Mal

Re: Hilfe mit schleife in meinem Skript

Beitrag von Tyfys » 26.06.2022, 17:04

mein Vorschlag :

Code: Alles auswählen

integer aktuellerMonat = system.Date("%m").ToInteger() - 1; !als Index  Minus 1
integer zaehlerDifferenz =  4;  !muss irgendwo berechnet werden  ???

! Hole der Wert und parse damit ich Wert jede Monat bekomme
!string monatswerte = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Stomverbrauch per Monat 2022").Value();
string monatswerte = "11;22;13;24;25;16;27;18;19;20;31;32";  !!nur zum Test - kann später gelöscht werden
string monatswerte_neu ;

!alten Monatsverbrauch auslesen
integer verbrauch = (monatswerte.StrValueByIndex(";", aktuellerMonat )).ToInteger();

!neuen Verbrauch berechnen
integer verbrauch_neu = verbrauch + zaehlerDifferenz; 

!neuen Verbrauch an die richtige Postion im String 
string index;
foreach(index, system.GenerateEnum(0, 11)) {
    if (index.ToInteger() <> aktuellerMonat) {
        monatswerte_neu = monatswerte_neu # ";" # monatswerte.StrValueByIndex(";", index.ToInteger());
    } else {
        monatswerte_neu = monatswerte_neu # ";" # verbrauch_neu.ToString(0);
    }
}

!überzählige Trennzeichen ";" entfernen
monatswerte_neu = monatswerte_neu.Trim(";");

!Kontrollausgaben -können gelöscht werden
WriteLine("alte Werte: " # monatswerte);
WriteLine("neue Werte:"#monatswerte_neu);

!Systemvariable mit den geänderten Werten schreiben
!dom.GetObject(ID_SYSTEM_VARIABLES).Get("Stomverbrauch per Monat 2022").State(monatswerte_neu);

Gruß
Harry

hirrsson
Beiträge: 45
Registriert: 14.10.2016, 08:14
Hat sich bedankt: 8 Mal
Danksagung erhalten: 1 Mal

Re: Hilfe mit schleife in meinem Skript

Beitrag von hirrsson » 27.06.2022, 19:06

es funktioniert! und viel schööööner!!!

DANKE!!!!!

hirrsson
Beiträge: 45
Registriert: 14.10.2016, 08:14
Hat sich bedankt: 8 Mal
Danksagung erhalten: 1 Mal

Re: Hilfe mit schleife in meinem Skript

Beitrag von hirrsson » 27.06.2022, 19:13

Tyfys hat geschrieben:
26.06.2022, 17:04

Code: Alles auswählen

string monatswerte = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Stomverbrauch per Monat 2022").Value();
Frage: Ich hole immer die Variablen wie folgt:

Code: Alles auswählen

dom.GetObject("Stomverbrauch per Monat 2022").Value();
Spielt es eine Rolle, oder ist es egal?

DANKE

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

Re: Hilfe mit schleife in meinem Skript

Beitrag von Matsch » 27.06.2022, 19:25

Ja und nein.

Tyfys Methode spezifiziert genau den Objekttyp, so dass der Befehl nie schiefgehen kann, wenn es noch andere Objekte mit gleichem Namen gibt (z.B. Programme, Räume, Gewerke usw.).

Mit deiner (vereinfachten) Methode muß gesichert sein, dass Objektnamen nicht doppelt vergeben sind, der Interpreter kann sie nicht unterscheiden.

Zugegeben, die vollständige, saubere Adressierung ist selbst in den Script-Dokumenten von eQ-3 mit keinem Wort erwähnt ...

Tyfys
Beiträge: 531
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 26 Mal
Danksagung erhalten: 121 Mal

Re: Hilfe mit schleife in meinem Skript

Beitrag von Tyfys » 27.06.2022, 19:41

Diese Methode stellt sicher, daß man auch tatsächlich die Daten der Systemvariablen ausliest:

Code: Alles auswählen

string monatswerte = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Stomverbrauch per Monat 2022").Value();
Anmerkung aus der Skrip-Doku:
Achtung!
Die HomeMatic Zentrale erlaubt, dass Objekte verschiedener Typen dieselbe
Bezeichnung tragen. So kann man ein Gerät mit dem Namen „Funk-Kombisensor“
anlegen und dessen Kanal ebenfalls „Funk-Kombisensor“ nennen.
.....
Die Methode „GetObject“ liefert stets das erste gefundene Objekt des angegebenen Namens zurück


Daher könntest du mit :

Code: Alles auswählen

dom.GetObject("Stomverbrauch per Monat 2022").Value();
zum Beispiel die Daten von einem Programm erhalten, wenn es den gleichen Namen hat.

Ich war zu langsam - Matsch war schneller
Gruß
Harry

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

Re: Hilfe mit schleife in meinem Skript

Beitrag von Matsch » 27.06.2022, 19:45

Tschuldige!
Dafür warst du ausführlicher

Antworten

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