Lichtsteuerung bei Abwesenheit

Programmierung der HomeMatic CCU mittels contronics homeputer CL

Moderator: Co-Administratoren

Antworten
AFi
Beiträge: 166
Registriert: 14.12.2016, 20:44

Lichtsteuerung bei Abwesenheit

Beitrag von AFi » 19.11.2017, 10:26

Hi,

In meiner HPCL-Steuerung habe ich einen virtuellen Schalter, den ich auf Abwesend bzw. Anwesend umschalte. Bei Abwesend wird in einem Makro (Minuten) eine Lichtsteuerung nach vorgegebenen Zeiten aktiviert.
Lichtsteuerung1.PNG
Es soll hier für jeden Schalter 2 Zeiten ermöglicht werden, zum einen zeitverzögert zum Sonnenuntergang oder fixe Zeiten.

Der Test läuft derzeit im Wohnzimmer.

Über den virtuellen Schalter "Virt_SchalterAnwAbw" wird der Code aktiviert. Leider schaltet das Licht sofort ein bei Abwesend?
UPuScha.... = Unterputzschalter
Anz.......... = Eingabefelder der Zeiten

Code: Alles auswählen

//Wohnzimmer
//------------------------------------------------------------------------------------------------------------------------
//Schaltzeiten 1 variable Einschaltzeiten
Wenn Anz_LichtWohnz_Zeitverz1 <> "" dann
	Wenn (Uhrzeit zwischen (D_002AnzSonnenuntergang + Anz_LichtWohnz_Zeitverz1) und Anz_LichtWohnz_Aus1) und Virt_SchalterAnwAbw = 1 und UPuScha_EG_WZ_LichtFront = 0 dann
		UPuScha_EG_WZ_LichtFront := 1
	EndeWenn
	Wenn (Uhrzeit zwischen (Anz_LichtWohnz_Aus1+"00:01:00") und (Anz_LichtWohnz_Aus1+"00:03:00")) und Virt_SchalterAnwAbw =1 und UPuScha_EG_WZ_LichtFront = 1 dann
		UPuScha_EG_WZ_LichtFront := 0
	EndeWenn
EndeWenn
//Schaltzeiten 1 fixe Schaltzeite
Wenn Anz_LichtWohnz_Zeitverz1 = "" und Anz_LichtWohnz_Ein1 <> "" dann
	Wenn (Uhrzeit zwischen (Anz_LichtWohnz_Ein1) und Anz_LichtWohnz_Aus1) und Virt_SchalterAnwAbw = 1 und UPuScha_EG_WZ_LichtFront = 0 dann
		UPuScha_EG_WZ_LichtFront := 1
	EndeWenn
	Wenn (Uhrzeit zwischen (Anz_LichtWohnz_Aus1+"00:01:00") und (Anz_LichtWohnz_Aus1+"00:03:00")) und Virt_SchalterAnwAbw =1 und UPuScha_EG_WZ_LichtFront = 1 dann
		UPuScha_EG_WZ_LichtFront := 0
	EndeWenn
EndeWenn

//Schaltzeiten 2 variable Einschaltzeiten
Wenn Anz_LichtWohnz_Zeitverz2 <> "" dann
	Wenn (Uhrzeit zwischen (D_002AnzSonnenuntergang +Anz_LichtWohnz_Zeitverz2) und Anz_LichtWohnz_Aus2) und Virt_SchalterAnwAbw = 1 und UPuScha_EG_WZ_LichtFront = 0 dann
		UPuScha_EG_WZ_LichtFront := 1
	EndeWenn
	Wenn (Uhrzeit zwischen (Anz_LichtWohnz_Aus2+"00:01:00") und (Anz_LichtWohnz_Aus2+"00:03:00")) und Virt_SchalterAnwAbw =1 und UPuScha_EG_WZ_LichtFront = 1 dann
		UPuScha_EG_WZ_LichtFront := 0
	EndeWenn
EndeWenn
//Schaltzeiten 2 fixe Schaltzeite
Wenn Anz_LichtWohnz_Zeitverz2 = "" und Anz_LichtWohnz_Ein2 <> "" dann
	Wenn (Uhrzeit zwischen (Anz_LichtWohnz_Ein2) und Anz_LichtWohnz_Aus2) und Virt_SchalterAnwAbw = 1 und UPuScha_EG_WZ_LichtFront = 0 dann
		UPuScha_EG_WZ_LichtFront := 1
	EndeWenn
	Wenn (Uhrzeit zwischen (Anz_LichtWohnz_Aus2+"00:01:00") und (Anz_LichtWohnz_Aus2+"00:03:00")) und Virt_SchalterAnwAbw =1 und UPuScha_EG_WZ_LichtFront = 1 dann
		UPuScha_EG_WZ_LichtFront := 0
	EndeWenn
EndeWenn
Gruß Axel

AFi
Beiträge: 166
Registriert: 14.12.2016, 20:44

Re: Lichtsteuerung bei Abwesenheit

Beitrag von AFi » 20.11.2017, 08:09

Hi,

bin ein Stück weiter, konnte feststellen, dass die "Wenn-Abfragen" funktionieren, trotzdem schaltet das Licht sofort ein, wenn ich auf "Abwesenheit" schalte und auch
nicht mehr aus.

Bei weiterer Suche des Fehlers ist mir aufgefallen, dass in anderen Anwendungsbereichen die Zeit im Textfeld linksbündig geschrieben wird, jedoch hier zentriert. Beide Felder sind nach nochmaliger Prüfung gleich aufgebaut, als TEXT-Feld. Welche Bedeutung hat dies? Erkennt er die Uhrzeit nicht?

Gruß Axel

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

Re: Lichtsteuerung bei Abwesenheit

Beitrag von Familienvater » 20.11.2017, 09:46

Hi,

ich glaube nicht, das die wenn-Abfrage richtig funktioniert,
1. Du vertraust auf richtige, implizite Typumwandlungen zur Laufzeit, das ist bei HPCL riskant, und ich traue mich das nicht mehr, weil selbst, wenn ich es einmal "validiert" habe, könnte es nach dem nächsten Update schon nicht mehr funktionieren:
Wenn (Uhrzeit zwischen (D_002AnzSonnenuntergang + Anz_LichtWohnz_Zeitverz1) und Anz_LichtWohnz_Aus1) und Virt_SchalterAnwAbw = 1 und UPuScha_EG_WZ_LichtFront = 0 dann

Aus Deinem Benamsungs-Style würde ich tippen, das es beides Anzeige-Objekte sind, und die können eigentlich nur Text anzeigen, (Text+Text) -> ("TextsonneuntergangTextZeitverögerung") bzw. halt "18:05:0001:23:00"

da wahrscheinlich auch das zweite Kriterium des ZWISCHEN ein Text ist, der implizit gewandelt werden muss...
Besser:
Mach dir Hilfsvariablen vom Typ Uhrzeit, die vor der Abfrage "Step by Step" füllen, also erst den ersten Wert setzen, dann im nächsten Step den Offset addieren.
Das hat außerdem den Vorteil, das Du Dir sämtliche "Zwischenergebnisse" für die Fehlersuche ausschreiben lassen könntest, oder über die SPG-Tools/ExecCmd/wie auch immer abfragen könntest. Damit man nicht in jedem Objekt zig Hilfsvariablen für eine "Lebensdauer" von wenigen Zeilen braucht, habe ich dafür in einem globalen Makro diverse Hilfsvariablen mit unterschiedlichen Typen, die ich dafür nutze:

Code: Alles auswählen

tmp.uhrVar1:=D_002AnzSonnenuntergang
tmp.uhrVar1:=tmp.uhrVar1+Anz_LichtWohnz_Zeitverz1
tmp.uhrVar2:=Anz_LichtWohnz_Aus1
wenn (uhrzeit zwischen tmp.uhrVar1 und tmp.uhrVar2) und ....
Man muss nur aufpassen, das bei der Nutzung der Hilfsvariablen keine "Zeitverzögerung" (explizit warten, aber auch Dinge wie getsite) eintreten kann, sonst hat evtl. ein anderes Objekt in der Zwischenzeit die Werte verändert (und wenn man globale Hilfsvariablen nimmt, dann ist zumindest ein "späteres" externes Debuging mit SPG/ExecCmd/etc nicht möglich).

Auch beim Rechnen mit fixem Offset:
Es könnte sein, das ("00:01:00"+AnzIrgendwas) im Kontext eines ZWISCHEN eher richtig Typgewandelt werden würde, aber ich würde immer die Gefahr sehen, das es doch nur eine Stringaddition ist, die dann versucht wird, in Uhrzeit umzuwandeln (und dass könnten immer die ersten 8 Stellen des Strings sein), und nicht eine Typumwandlung jedes Wertes in Uhrzeit, und dann eine Uhrzeit-Addition stattfindet.

Der letzte Tipp:
Ich habe gar nicht versucht die Logik zu verstehen, aber wenn die Bedingungen nicht "eindeutig" sind, schaltest Du im dümmsten Fall Ein/Aus/Ein/Aus/Ein/Aus, weil jedes Wenn immer ausgewertet wird.
Es gibt den wunderbaren Befehl "VERLASSEN", den ich oft nutze, auch um nach einer "getroffenen Entscheidung" weitere unnötige Wenn's/Berechnungen/etc auszulassen.
Es gibt leider kein "SonstWenn", um auf der gleichen Ebene mehrere unterschiedliche Bedingungen/Aktionen zu trennen, da kann man sich zur Not mit einem häßlichen GEHEZU-Sprung retten, und zum nächsten "Anweisungs-Block" springen:

Code: Alles auswählen

wenn a=1 dann
  b:=1
  gehezu weiter
endewenn
wenn a=2 dann
  C:=1
  gehezu weiter
endewenn
wenn a=4 dann
  d:=1
  gehezu weiter
endewenn
Weiter:
Alternativ halt Kaskadieren:

Code: Alles auswählen

wenn a=1 dann
  b:=1
sonst
  wenn a=2 dann
    C:=1
  sonst
    wenn a=4 dann
      d:=1
    endewenn
  endewenn
endewenn
Der Familienvater

AFi
Beiträge: 166
Registriert: 14.12.2016, 20:44

Re: Lichtsteuerung bei Abwesenheit

Beitrag von AFi » 20.11.2017, 20:08

Hi Familienvater,

besten Dank für die Unterstützung, es war die Typenumwandlung.

Verstehen muss ich dies nicht warum Contronics nicht Eingabefelder vollumfänglich Typisieren lässt, man könnte dadurch auch Eingabemasken
besser definieren und solche Fehler würden weniger auftreten.

Gruß Axel

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

Re: Lichtsteuerung bei Abwesenheit

Beitrag von Familienvater » 20.11.2017, 20:32

Hi,

dazu fällt mir nur ein, weil die Visualisierung eine Visualisierung ist, und keine Eingabemaske. Für die Änderung von Schalt-Zeitpunkten in der Visu gibt es die rechte Maustaste, womit man die Zeittabelle editieren kann. Alles andere, was wir hier meistens machen, ist der Versuch, sich das Leben leicht zu machen, mit der Gefahr, dabei zu stolpern. Ich mache solche Zeitgeschichten mit Zahlenfeldern, die einen "Offset" in Minuten angeben, das versteht auch die Familie, und damit kann man zur Not auch in Bedingungen rechnen
2017-11-20_20h20_32.png
2017-11-20_20h20_32.png (19.65 KiB) 1715 mal betrachtet
und die Werte lassen sich "einfach" über das Webfrontend ändern, und die geänderte Uhrzeit erscheint auch sofort wieder (ist aber ein bisschen javascript-gepimmt).

Und in der Visu kann man das auch zur Not oder ganz gut einfach mit "Slidern" lösen, im Feld darüber wird dynamisch die geänderte Uhrzeit des Sliders beim Ziehen angezeigt:
2017-11-20_20h23_03.png
2017-11-20_20h23_03.png (10.42 KiB) 1715 mal betrachtet
Wobei die Icons nicht ganz vollständig sind,

eigentlich müsste das eher "so" aussehen, es gibt inzwischen 4-5 getrennte Betriebsarten jeweils für Hoch und runter
2017-11-20_20h25_04.png
2017-11-20_20h25_04.png (5.42 KiB) 1715 mal betrachtet
Aber es klumpt sich alles in der nicht benutzten Visu, weil da der virtuelle Rolladen ist, der echte Rolladen, plus der Drehgriffsensor, und an "gefährdeten" Stellen dann auch noch ein TFK zusätzlich, dazu bräuchte man entweder Iconsätze mit 2x5x3 Zuständen, oder es sieht halt so aus, wie es aussieht, wobei es je keiner sieht...

Der Familienvater

Antworten

Zurück zu „homeputer CL“