Durch Drehen eines Heizkörperthermostat Systemvariable umsetzten

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

navino
Beiträge: 187
Registriert: 23.02.2015, 20:19

Re: Durch Drehen eines Heizkörperthermostat Systemvariable umsetzten

Beitrag von navino » 08.11.2018, 19:57

Doku habe ich gerade gefunden ;-)

twoxx
Beiträge: 534
Registriert: 16.03.2015, 18:57
Hat sich bedankt: 1 Mal
Danksagung erhalten: 26 Mal

Re: Durch Drehen eines Heizkörperthermostat Systemvariable umsetzten

Beitrag von twoxx » 08.11.2018, 21:36

navino hat geschrieben:
08.11.2018, 19:54
Hallo und danke für die Info's.
Bisher habe ich noch keine Scripte verwendet. Kannst du mir kurz erklären wo ich die Variablen
wie z.B. "EGDieleZaehler" herkommen?

Eigentlich würde mir von der Logik folgendes reichen:
int sollvorher = 10; Beispiel
int sollJetzt = 20; (am rad gedreht)

If sollvorher ungleich sollJetzt dann Sysvariable auf manu.

Gibt es da irgendwo eine Doku für die Scripte?
Hallo!
Was du bei Deiner Wunschlogik beschreibst ist mit meinem Scirpt 2 fast 1:1 identisch, nur das ich anstelle "Sysvariable auf manu"
eben Sysvariable "Solltempdiff" auf "true" oder "false" habe.


Ich benutze historisch bedingt in der CCU3 (vormals CCU2) nur Systemvariablen.
Es gab früher mal einen BUG in der CCU-Firmware in welcher eine Scriptvariable, wenn man sie mal
verwendet hat nach Beendigung des Scriptes nicht "gelöscht" bzw. auf Null gesetzt wurde.
Was bedeutete das man aufgrund der Firmware-Architektur nur insgesamt 99 Variablen verwenden konnte.
Sollte man irgendwo eine 100. Variable verwendet haben, dann ist sporadisch und zufällig IRGENDEIN CCU-Programm
plötzlich nicht mehr ausgeführt worden.

Ich ging damals den Weg, dass ich also immer Systemvariablen auch in den Scripten verwendete.
Die Systemvariablen haben auch den Vorteil, das die Werte erhalten bleiben wenn die CCU mal einen Stromausfall hat.
Sofern Du viele Dinge (wie ich) im Haus steuerst, muß also nicht bei einem Systemneustart erst gewartet werden, bis
die Scripte wieder durchgelaufen sind um den aktuellen Stand der Variablen wieder herzustellen und das Haus wieder zum laufen zu bringen.

Wie gesagt, du kannst das ganze auch per Scriptvariablen (was bei Deiner obigen Logik beispielsweise dem "int sollvorher = " entspricht)
umsetzen.
Das "Int Sollvorher" und "Int SollJetztr" entspricht bei mir im Script der Systemvariable "EGDieleSollAktual1" und "EGDieleSollAktual2".
Allerdings ABWECHSELND.

Ich gehe so vor das immer abwechselnd bei diesen beiden Variablen bei Aufruf des Programms und Scripts die aktuelle Soll-Temp
eingetragen wird. Das bedeutet das beim ersten Aufruf des Scripts die Solltemp in EGDieleSollAktual1 eingetragen wird.
beim nächsten Aufruf dann in EGDieleSollAktual2 beim nächsten Aufruf dann wieder in EGDieleSollAktual1 und so weiter.
Man benötigt keine Unterscheidung welche Temperatur "vorher" oder "nachher" passiert ist, denn wichtig ist ja ob die
beiden Temperaturen gleich oder ungleich sind. Denn das Script kann ja nicht in "vorher" oder "nachher" unterscheiden.
Das Script wird immer "JETZT" ausgeführt und es gilt nur eine Variable zu speichern. Es ist zu umständlich dem Script herausfinden zu lassen ob der aktuell festgestellte Wert nun die Solltemperatur "vorher" ist oder die Solltemperatur "jetzt".

Dadurch ist die "vorherige Solltemperatur" mal in EGDieleSollAktual1 und manchmal in EGDieleSollAktual2 und umgekehrt jeweils die
"Solltemperatur JETZT" in der jeweils entgegengesetzten Variable gespeichert.

Das Script 2 vergleicht dann gemäß Deiner Logik die beiden Variablen und stellt fest ob es einen Unterschied gibt (Solltemperatur hat sich verändert) oder ob die beiden Variablen gleich sind (Solltemperatur hat sich seit letzter Ausführung des Scriptes nicht geändert).

Die Systemvariable "EGDieleZaehler" ist nur eine Variable in der festgelegt wird, ob bei Ausführung des Scriptes nun die aktuell ausgelesene
Solltemperatur in Aktual1 oder Aktual2 geschrieben wird. Das Script muß ja feststellen ob es den Wert in Aktual1 oder in Aktual2
mit der aktuellen Solltemperatur überschreiben soll.

Sämtliche Systemvariablen werden in der CCU unter "Einstellungen" - "Systemvariablen" vorher erstellt und sind dann sowohl für
Programme als "Systemzustand" oder in Scripten per dom.GetObject("Systemvariable").State() oder dom.GetObject("Systemvariable").Value() etc.
wie Scriptvariable nutzbar.
Hier nochmal Script 2:

Code: Alles auswählen

if ((dom.GetObject("EGDieleSollAktual1").Value()) == (dom.GetObject("EGDieleSollAktual2").Value()))
{
WriteLine("keine Veränderung");dom.GetObject("EGDieleSolltempDiff").State(false);
}
else
{
WriteLine("Veränderung");dom.GetObject("EGDieleSolltempDiff").State(true);
}

Hier werden in Zeile 1 mit "IF" die beiden Werte (Value) der beiden Systemvariablen "Aktual 1" und "Aktual 2" miteinander
verglichen.

Falls die beiden Werte in den Variablen gleich (==) sind, dann wird die Aktion in der ersten Klammer ausgeführt (was in Deiner "IF-DANN-LOGIK" dem "dann" entspricht - bei dir fehlt jedoch ein "andernfalls" was dem "else" entspräche)
in der ersten Klammer wird der Status "false" in die Systemvariable "SolltempDiff" geschrieben (weil keine Temperaturveränderung der Solltemp
erfolgt ist)

... sofern die Bedingung bei "IF" (==) nicht erfüllt ist (also die Temperaturen abweichen) dann wird die Aktion in der zweiten Klammer bei "else" ausgeführt. Die Systemvariable "SolltempDiff" wird mit "true" gefüllt...... bei dir würde die Systemvariable hier auf "manu" gestellt.

Wenn Du eine Systemvariable auf "manu" stellen willst, dann mußt Du Dir bei Anlage der Systemvariable überlegen welche Art Variable Du verwenden willst. Wenn es bei der Systemvariable nur 2 entgegengesetzte Zustände gibt wie beispielsweise "manu" und "auto", dann könntest Du hierfür
eine Systemvariable "Logikwert" verwenden. Eine Systemvariable "Logikwert" hat immer den Zustand "wahr - true" oder "falsch - false". Diese beiden
Zustände kannst Du bei Anlage der Systemvariable in der WEBUI mit "manu" und "auto" überschreiben. Im Script wird jedoch immer noch mit "true" und "false" gearbeitet - in der übrigen WEBUI wird jedoch immer "manu" und "auto" stattdessen angezeigt werden.
Was Du bei der Belegung auch bedenkten solltest ist der "Leerzustand" der Variable. Nach Anlage der Systemvariable steht sie standardmäßig erst mal auf "false". Das gleiche passiert auch bei einem Neustart der CCU - sofern nicht durch einen anderen Einfluß der Wert vorher gespeichert wurde.

Eine Doku für die Scripte gibt es auf der eq-3 Seite. Dort ist ein ganzes Kompendium die die Scriptsprache erklärt und auch den Umgang mit den unterschiedlichen Variablenarten. Achtung! Die Rechenlogik der CCU ist eine andere als die mathematische Rechenlogik (auch je nachdem welche Logikschicht Du in der CCU eingestellt hast).
- Charly - Raspymatic mit Redmatic, 420 Systemvariablen, 440 Programmen, 101 Direktverknüpfungen, 121 Geräten
- CCU3- Raspymatic mit Redmatic und Verbindung zur PV-Anlage/Wechselrichter
- Charly - Raspymatic mit Redmatic und Sprachsteuerung per Alexa

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

Re: Durch Drehen eines Heizkörperthermostat Systemvariable umsetzten

Beitrag von Bratmaxe » 09.11.2018, 13:16

Gruß Carsten

navino
Beiträge: 187
Registriert: 23.02.2015, 20:19

Re: Durch Drehen eines Heizkörperthermostat Systemvariable umsetzten

Beitrag von navino » 10.11.2018, 17:07

!----- Raumreglerz identifizieren
string Raumreglerz = "BidCos-RF.xxxxxxxxxxxxxxx";

Eine Frage hierzu: Wo finde ich das BidCos-RF um meine Regler zu idendifizieren?

if ((dom.GetObject("EGDieleZaehler").Value()) == 0.0)

Ist EGDieleZaehler die Systemvariable?

twoxx
Beiträge: 534
Registriert: 16.03.2015, 18:57
Hat sich bedankt: 1 Mal
Danksagung erhalten: 26 Mal

Re: Durch Drehen eines Heizkörperthermostat Systemvariable umsetzten

Beitrag von twoxx » 12.11.2018, 20:55

navino hat geschrieben:
10.11.2018, 17:07
!----- Raumreglerz identifizieren
string Raumreglerz = "BidCos-RF.xxxxxxxxxxxxxxx";

Eine Frage hierzu: Wo finde ich das BidCos-RF um meine Regler zu idendifizieren?
====> Anstelle der xxxxx einfach die Seriennummer Deines Reglers eintragen. Die Seriennummer wird direkt auf "Einstellungen - Geräte" in einer extra Spalte angezeigt.
navino hat geschrieben:
10.11.2018, 17:07

if ((dom.GetObject("EGDieleZaehler").Value()) == 0.0)

Ist EGDieleZaehler die Systemvariable?
Ja "EGDieleZaehler" ist die Systemvariable. Bei mir rührt Sie daher, dass ich das Programm bei 14 verschiedenen Reglern einsetze und
hier ist es der Regler in der Diele vom Erdgeschoss.

Die Systemvariable ist hier Typ "Zahl".

Mit dom.GetObject("xxxxxxxx").Value() wird ausgedrückt, dass hier der WERT der in der Systemvariable gespeichert ist ausgelesen wird und dann geprüft wird ober mit dem Wert 0 identisch ist "== 0.0".

Das gleiche würdest Du mit dom.GetObject("xxxxxxxx").State() erreichen. Hier würde der STATUS der Systemvariable ausgelsen und dann
geprüft ob der Status mit dem Wert 0 identisch ist. Denn eine Systemvariable Typ Zahl kann als Status ja nur einen Zahlenwert haben.

Wenn Du eine Systemvariable (egal welcher Typ) mit einem Wert oder Status (true, false etc.) setzen willst, dann geht das ebenfalls mit
dom.GetObject("xxxxxxxx").State(yyyyyyyyyyyyyyyyyyyyy). Wobei hier dann der Wert/Status "y" in die Systemvariable mit dem Namen "x"
eingetragen wird.

"State" ist also sowohl zu auslesen der Variable (wenn Du die Klammern bei State einfach leer lässt), als auch zum beschreiben der Systemvariable (wenn Du den Wert oder Status zwischen die Klammern nach "State" reinschreibst).
- Charly - Raspymatic mit Redmatic, 420 Systemvariablen, 440 Programmen, 101 Direktverknüpfungen, 121 Geräten
- CCU3- Raspymatic mit Redmatic und Verbindung zur PV-Anlage/Wechselrichter
- Charly - Raspymatic mit Redmatic und Sprachsteuerung per Alexa

navino
Beiträge: 187
Registriert: 23.02.2015, 20:19

Re: Durch Drehen eines Heizkörperthermostat Systemvariable umsetzten

Beitrag von navino » 20.11.2018, 12:23

Danke für die ausführliche Erklärung,

aber ich komme damit noch nicht klar.

Wofür benötige ich die ganzen Variablen?

Meine Logik wäre folgende:
Wenn das Programm für die Automatik läuft, also die Systemvarianle auf true ist, wird innerhaln des Programms ganz am schluss die Variable auf true gesetzt. Also auch dann wenn die Solltemperatur sich ändert.

In allen anderen Fällen, also wenn sich die Sollemperatur ändert, wird die Systemvariable auf false gesetzt.
Ich bnötige dann doch nur eine zusätzliche Variable für die Solltemp vorher, die dann zu veränderenden müsste ich doch dann vom Regler bekommen, oder?

navino
Beiträge: 187
Registriert: 23.02.2015, 20:19

Re: Durch Drehen eines Heizkörperthermostat Systemvariable umsetzten

Beitrag von navino » 20.11.2018, 15:14

Ich versuche gerade an den Wert zukommen:

Aber bei dem Script ist die Ausgabe null

Code: Alles auswählen

!----- Raumreglerz identifizieren
string RaumreglerEssen = "BidCos-RF.MEQ1582548";

WriteLine(dom.GetObject(RaumreglerEssen#":2.SET_TEMPERATURE").Value());
Was mache ich falsch?
Zuletzt geändert von alchy am 20.11.2018, 16:29, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

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

Re: Durch Drehen eines Heizkörperthermostat Systemvariable umsetzten

Beitrag von Bratmaxe » 20.11.2018, 16:14

navino hat geschrieben:
20.11.2018, 15:14
Ich versuche gerade an den Wert zukommen:

Aber bei dem Script ist die Ausgabe null

!----- Raumreglerz identifizieren
string RaumreglerEssen = "BidCos-RF.MEQ1582548";

WriteLine(dom.GetObject(RaumreglerEssen#":2.SET_TEMPERATURE").Value());

Was mache ich falsch?
Aus dem Kopf meine ich, das der Parameter SET_TEMPERATURE auf den Kanal 4 Liegt, also

Code: Alles auswählen

WriteLine(dom.GetObject(RaumreglerEssen#":4.SET_TEMPERATURE").Value());
alternativ:

Code: Alles auswählen

dom.GetObject(ID_CHANNELS).Get(NAME_DES_AKTORS#":4").DPByHssDP("SET_TEMPERATURE").Value();
Gruß Carsten

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

Re: Durch Drehen eines Heizkörperthermostat Systemvariable umsetzten

Beitrag von alchy » 20.11.2018, 16:40

Bratmaxe hat geschrieben:
20.11.2018, 16:14
Aus dem Kopf meine ich
Es steht ja nirgends um welches Gerät es sich handelt. :roll:
2.SET_TEMPERATURE wäre z.B. für ein HM-TC-IT-WM-W-EU korrekt.
Allerdings habe ich auch nicht alles gelesen. Ist im Fall von navino für mich zu kompliziert.

Fakt ist ja, den Datenpunkt gibt es nicht, da ja null ausgegeben wird.

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.

navino
Beiträge: 187
Registriert: 23.02.2015, 20:19

Re: Durch Drehen eines Heizkörperthermostat Systemvariable umsetzten

Beitrag von navino » 20.11.2018, 17:11

Ja das war schon einmal die Lösung mit der 4 statt der 2.

Jetzt möchte ich eine Systemvaribale auslesen mit

Code: Alles auswählen

WriteLine(dom.GetObject("SollTemp1".Value()));
Auch hier kommt null. Die Variable gibt es und hat einen Wert von 18
Zuletzt geändert von alchy am 20.11.2018, 17:19, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

Antworten

Zurück zu „HomeMatic allgemein“