while Schleife?

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Antworten
Spectrum1981
Beiträge: 10
Registriert: 09.06.2016, 14:18

while Schleife?

Beitrag von Spectrum1981 » 02.07.2016, 20:48

Hallo zusammen,

ich habe einen Aktor der im Grenzbereich hängt und nicht immer Befehle annimmt. Meine Gartenbewässerung sollte aber schon immer angehen. Kann man mit einer while Schleife nicht den Status des Aktors abfragen und solange der 0 ist soll er es immer wieder versuchen?!?

Mein aktuelles Skript sieht so aus:

Code: Alles auswählen

!Skript zur Steuerung der Gartenbewässerung.
		
		var W_Regenmenge = dom.GetObject("W_Regenmenge").State();
		var W_Tage_ohne_Regen = dom.GetObject("W_Tage_ohne_Regen").State();
		integer W_TempDayHigh = dom.GetObject("W_TempDayHigh").State();	
		
		!Setzen des Variablen für die letzte Bewässerung
		var obj = dom.GetObject("Letzte_Bewaesserung");
		string datzeit = system.Date("%d.%m.%Y %T");
				
		if (W_TempDayHigh < 20)
		{
		WriteLine("Die Bewässerung soll 30 Minuten dauern");	
		
		dom.GetObject("Zeit_Bewaesserung").State(1800);
		obj.State(datzeit);	
	
		}
		if ((W_TempDayHigh > 20) && (W_TempDayHigh < 25))
		{
		WriteLine("Die Bewässerung soll 40 Minuten dauern");	
		
		dom.GetObject("Zeit_Bewaesserung").State(2400);
		obj.State(datzeit);

		}
		
		if ((W_Tage_ohne_Regen <= 2) && (W_TempDayHigh >= 25))
		{
		WriteLine("Die Bewässerung soll 50 Minuten dauern");
		
		dom.GetObject("Zeit_Bewaesserung").State(3000);
		obj.State(datzeit);		

		}
		if ((W_Tage_ohne_Regen > 2) && (W_TempDayHigh >= 25))
		{
		WriteLine("Die Bewässerung soll 60 Minuten dauern");	
		
		dom.GetObject("Zeit_Bewaesserung").State(3600);
		obj.State(datzeit);

		}
				
		if (dom.GetObject("Zeit_Bewaesserung").State() > 0)
		{
		!Einschalten der Bewässerung wenn erforderlich
		!Setzen der Einschaltdauer für den Aktor
		dom.GetObject("BidCos-RF.MEQ1711606:1.ON_TIME").State(dom.GetObject("Zeit_Bewaesserung").State());
		
		!Einschalten der Bewässerung:
		dom.GetObject("BidCos-RF.MEQ1711606:1.STATE").State(1);
		}

Kann man das irgendwie so lösen? Nur leider funktioniert das nciht.

Code: Alles auswählen

if (dom.GetObject("Zeit_Bewaesserung").State() > 0)
		{
		
		while (dom.GetObject("BidCos-RF.MEQ1711606:1.STATE").State() = 0) 
		{	
		!Einschalten der Bewässerung wenn erforderlich
		!Setzen der Einschaltdauer für den Aktor
		dom.GetObject("BidCos-RF.MEQ1711606:1.ON_TIME").State(dom.GetObject("Zeit_Bewaesserung").State());
		
		!Einschalten der Bewässerung:
		dom.GetObject("BidCos-RF.MEQ1711606:1.STATE").State(1);
		
		}
		}

Vielen Dank für die Hilfe!

DrTob
Beiträge: 3426
Registriert: 29.10.2010, 08:24
Danksagung erhalten: 5 Mal

while Schleife?

Beitrag von DrTob » 02.07.2016, 21:57

Das so (in einer Schleife in einem Script) zu tun ist eine ganz schlechte Idee. Solange das Script läuft ist die CCU blockiert, ich bin mir nicht mal sicher ob die Schaltbefehle sofort gesendet werden. Zwischen den Sendeversuchen sollte ein paar Sekunden Pause sein. Z.B. ein Script, welches auf Aktualisierung einer Variable auslöst und sich selbst wieder aufruft.

Wenn sollzustandVentil = auf (auslösen bei Aktualisierung)
Und Ventil = zu
Dann
Sofort Ventil = auf
Verzögert um 5s sollzustandVentil = auf



Vor kurzem wurde hier auch mal eine Variante mit CUXD-Timer vorgestellt.

cmjay
Beiträge: 2386
Registriert: 19.09.2012, 10:53
System: CCU
Wohnort: Jottweedee
Hat sich bedankt: 250 Mal
Danksagung erhalten: 351 Mal

Re: while Schleife?

Beitrag von cmjay » 02.07.2016, 22:13

Und ausserdem gibt es da ja noch das berüchtigte 1% Sendezeitlimit ... Im ungünstigsten Fall legt die while-Schleife dadurch den gesamten Funkverkehr der CCU flach.
Vielleicht besser, die Gartenbewässerung einfach über einen zusätzlichen HM Repeater einzubinden.

Gruß
Michael
Es kann leider nicht ganz ausgeschlossen werden, dass ich mich irre.
HmIP muss leider draussen bleiben. in Ausnahmefällen erlaubt
ACHTUNG! Per Portweiterleitung aus dem Internet erreichbare CCU-WebUI ist unsicher! AUCH MIT PASSWORTSCHUTZ! Daher: Portweiterleitung deaktivieren!

Spectrum1981
Beiträge: 10
Registriert: 09.06.2016, 14:18

Re: while Schleife?

Beitrag von Spectrum1981 » 03.07.2016, 10:14

DrTob hat geschrieben:Das so (in einer Schleife in einem Script) zu tun ist eine ganz schlechte Idee. Solange das Script läuft ist die CCU blockiert, ich bin mir nicht mal sicher ob die Schaltbefehle sofort gesendet werden. Zwischen den Sendeversuchen sollte ein paar Sekunden Pause sein. Z.B. ein Script, welches auf Aktualisierung einer Variable auslöst und sich selbst wieder aufruft.

Wenn sollzustandVentil = auf (auslösen bei Aktualisierung)
Und Ventil = zu
Dann
Sofort Ventil = auf
Verzögert um 5s sollzustandVentil = auf



Vor kurzem wurde hier auch mal eine Variante mit CUXD-Timer vorgestellt.

Ok, habe ich verstanden. Aber in dem Script müsste dann ja auch wieder die Variable auf "sollzustandVentil " zu gesetzt werden.

Aber wenn der Aktor nicht antwortet wird die Variable trotzdem geändert und das Ventil geht nicht auf. Oder habe ich einen Gedankenfehler?

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

Re: while Schleife?

Beitrag von Familienvater » 03.07.2016, 10:29

Hi,

das gemeine an dem Bidirektionalen System ist, das der Aktor evtl. schon Munter den Garten bewässert, und nur die Quittung dauernd im "gefluteten" Garten versumpft.
Im schlimmsten Fall verwässerst Du also den Garten, obwohl Du es ja nur gut meinst.

Nächste bzw. sauberste Möglichkeit sollte sein, zuerst eine Kommunikationsstörung des Aktors abzufragen (STICKY_UNREACH), und dann evtl. mit State() den wahren Status des Aktors zu prüfen, und dann ggf. noch mal das ganze mit ON_TIME-Setzen und einschalten. Zwischen den Versuchen würde ich aber min. 5 Sekunden warten, mit steigender Tendenz (1. Versuch frühestens nach 5 Sekunden, 2. Versuch nach weiteren 15 Sekunden, 3. Versuch nach weiteren 45 Sekunden). Und dann auch irgendwann aufgeben, und das ganze nicht ewig versuchen, weil die CCU dadurch ans Sendelimit kommen könnte, und sei Dir sicher, auch der Aktor versucht seine Quittungen zu bekommen und versucht z.B. die Statusabfrage wiederholt zu beantworten, wenn er die Quittung von der CCU nicht bekommt, und auch der Aktor hat eine Sendezeitbegrenzung.

Grundsätzlich sollte man für solche Fälle schon mal einen Repeater versuchen, alternativ ein weiteres LAN-RF-Gateway, oder auch mal darüber nachdenken, die CCU mit einer besseren Antenne zu versorgen, alternativ auch die des Aktors.

Und Grundsätzlich hoffe ich, das es kein Batterieschaltaktor ist, den Du versuchst anzufunken (kein Burstsignal zum Aufwecken des Aktors notwendig), sonst würde ich das grundsätzlich überdenken.

Der Familienvater

Spectrum1981
Beiträge: 10
Registriert: 09.06.2016, 14:18

Re: while Schleife?

Beitrag von Spectrum1981 » 03.07.2016, 11:38

@Familienvater:

Klar habe ich an das "Der Aktor geht nicht aus" gedacht und setzte immer eine Einschaltdauer:

Code: Alles auswählen

!Setzen der Einschaltdauer für den Aktor
      dom.GetObject("BidCos-RF.MEQ1711606:1.ON_TIME").State(dom.GetObject("Zeit_Bewaesserung").State());[/code

Ich suche halt eine Möglichkeit (Script?) wo ich sicherstellen kann, dass der Aktor auch die Einschaltdauer und das Einschalten an sich auch umgesetzt worden sind. Egal ob mit oder ohne Repeater.

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

Re: while Schleife?

Beitrag von Familienvater » 03.07.2016, 11:55

Hi,

ja, Du setzt eine Einschaltdauer, das habe ich ja auch nicht in Abrede gestellt.
Aber Du schaltest den Aktor ggf. Immer und Immer wieder mit Einschaltdauer ein, der geht im schlimmsten Fall ggf. erst aus, wenn die CCU wegen DutyCycle verstummt, und keine neuen Einschalten für 30 Min mehr kommen.
Nochmal:
Es ist unwahrscheinlich das jede Quittung vom Aktor untergeht, aber es kann durchaus sein, das der Aktor die Funkpakete der CCU durchaus mitbekommt, und nur die CCU nichts von dem Aktor hört. Im Falle einer solchen unidirektionalen Kommunikation startest Du mit jedem Versuch eine neue Hardwaregetimerte Einschaltperiode, deswegen versumpft der Garten eben doch.
Und deswegen der Gutgemeinte Hinweis, es nach spätestens 3-5 Versuchen einfach aufzugeben.
Und wenn ich weiß, das es Probleme mit der Empfangssituation eines Aktors gibt, dann würde ich schauen, das ich dieses Problem in den Griff bekomme, und nicht mit Gewalt in der Gegend rumfunken, nur damit es vielleicht doch irgendwie funktioniert. Dabei passiert es nämlich, das man das Funkband "unbewusst" belegt, und die anderen HM-Geräte kommen auch einmal auch nicht mehr bis zur CCU durch, das gibt dann neue Kommunikationsstörungen, die vielleicht von einem Script im Hintergrund per "wir fragen einfach noch mal beim Aktor nach" noch mal extra Funkverkehr verursachen. Und plötzlich geht gar nichts mehr.

Der Familienvater

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

Re: while Schleife?

Beitrag von alchy » 03.07.2016, 12:04

Nur gut, das eine while schleife nach 5000 Iterationen aufhört. :lol:

Aus der Hüfte würde ich die Zeitstempel des Senders und des Aktors vergleichen.
und dann eventuell im Abstand von X' noch 2/3 mal nachsenden lassen.
Alles andere ist wahrscheinlich eher kontraproduktiv und widerstrebt meinem Ansinnen immer
an der Ursache des Ganzen zu arbeiten. Das hatten wir schon mal irgendwann, irgendwo....

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.

Antworten

Zurück zu „HomeMatic allgemein“