Seite 1 von 4

Aktoren-Auslösung in Variable schreiben

Verfasst: 13.02.2018, 09:37
von Semmy
Hallo
Ich möchte immer wenn ein Aktor auslöst, eine Zahl in eine Variable geschrieben wird. Also Aktor 1 löst aus, Va. = 2, Aktor 1 löst nochmal aus, Va = 3 usw. Maximalwert in der Variable ist 4.
Wenn dann ein Aktor 2 auslöst, soll der Wert in der Va. jeweils nach unten zählen, also Aktor 2 löst aus, Va. = 3, Aktor 2 löst nochmal aus; Va. = 2, usw.
Variable soll die Werte 1-4 anzeigen.
Kann man dafür irgenwie ein Script erstellen und wie müsste das aussehen?

Viele Grüße
Semmy

Re: Aktoren-Auslösung in Variable schreiben

Verfasst: 13.02.2018, 09:52
von Sammy
Ich würde das einfach über 2 WebUI Programme machen. Du brauchst ja nur 4 Zahlenwerte.

WENN Aktor 1
UND Zahl = 1
DANN Zahl = 2
SONSTWENN Zahl = 2
DANN Zahl = 3
SONST Zahl = 4

WENN Aktor 2
UND Zahl = 4
DANN Zahl = 3
SONSTWENN Zahl = 3
DANN Zahl = 2
SONST Zahl = 1

Je nachdem was Du mit "Aktor löst aus" meinst, muss man ggfs. noch den Zustand des Aktors in die SONSTWENNs mit aufnehmen.

Gruß Sammy

Re: Aktoren-Auslösung in Variable schreiben

Verfasst: 13.02.2018, 10:01
von dtp
Ist eigentlich nicht weiter schwierig.

Du erzeugst ein Programm, dass bei Änderung oder Aktualisierung (je nachdem, was besser passt) von Aktor 1 das folgende Skript ausführt.

Code: Alles auswählen

! Zähler bei Skriptaufruf um eins erhöhen
! Version 1.0, Autor: dtp

! Namen der verwendeten Systemvariablen
string svCount = "SV Zähler"; ! Zähler, obligatorisch

! #####################################################################
! ##### ab hier bitte keine weiteren Einstellungen mehr vornehmen #####
! #####################################################################

! +++++ Variablendeklaration +++++
integer count;
object svObject; object svObjectList;

! +++++ Systemvariablen erzeugen bzw. falls vorhanden, auslesen +++++
if(!svCount){svCount = "SV Zähler";}
svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svCount);
if(!svObject){
  svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID());
  svObject.Name(svCount); svObject.DPInfo("Zähler"); svObject.Internal(false); svObject.Visible(true);
  svObject.ValueType(ivtString); svObject.ValueSubType(istChar8859); svObject.ValueUnit(""); dom.RTUpdate(true);
}

! +++++ Anzahl Einwürfe hochzählen +++++
count = (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svCount)).Value().ToInteger();
count = count + 1;
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svCount)).State(count).ToString(0);
Dieses Skript legt dir automatisch die Systemvariable "SV Zähler" an, die du auch nach Belieben anders nennen kannst, und zählt sie bei jedem Aufruf um eins hoch. Beim allerersten Aufruf des Skripts wird zunächst nur die Systemvariable angelegt. Daher fängt es erst danach an zu zählen. Also nicht wundern. 8)

Dann erzeugst du entweder noch ein weiteres Programm oder erstellst einen Sonst-Wenn-Zweig in dem obigen Programm, das bzw. der auf die Änderung bzw. Aktualisierung des zweiten Aktors reagiert. In dem Dann-Zweig fügst du das folgende Skript ein:

Code: Alles auswählen

! Zähler bei Skriptaufruf um eins verringern
! Version 1.0, Autor: dtp

! Namen der verwendeten Systemvariablen
string svCount = "SV Zähler"; ! Zähler, obligatorisch

! #####################################################################
! ##### ab hier bitte keine weiteren Einstellungen mehr vornehmen #####
! #####################################################################

! +++++ Variablendeklaration +++++
integer count;
object svObject; object svObjectList;

! +++++ Systemvariablen erzeugen bzw. falls vorhanden, auslesen +++++
if(!svCount){svCount = "SV Zähler";}
svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svCount);
if(!svObject){
  svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID());
  svObject.Name(svCount); svObject.DPInfo("Zähler"); svObject.Internal(false); svObject.Visible(true);
  svObject.ValueType(ivtString); svObject.ValueSubType(istChar8859); svObject.ValueUnit(""); dom.RTUpdate(true);
}

! +++++ Anzahl Einwürfe hochzählen +++++
count = (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svCount)).Value().ToInteger();
count = count - 1;
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svCount)).State(count).ToString(0);
Wichtig! Die Systemvariable muss in beiden Skripten denselben Namen erhalten. Benennst du sie unterschiedlich, wird die eine Systemvariable immer weiter hoch- und die andere immer weiter runtergezählt.

Wenn es noch wichtig ist, dass Werte über 4 und unter 0 vermieden werden sollen, dann kann man das auch recht einfach implementieren. Da hab ich aber jetzt erst mal drauf verzichtet.

Versuch's mal und berichte.

Das automatische Anlegen der Systemvariablen ist nicht zwingend notwendig, sondern soll dir ein wenig die Arbeit erleichtern. ;)

Gruß,

Thorsten

Re: Aktoren-Auslösung in Variable schreiben

Verfasst: 13.02.2018, 10:19
von Semmy
Hallo DTP
Das sieht schon mal gut aus. Ich möchte aber den Zähler hoch nur bis 4 und runter nur bis 1. Ist das noch möglich? Dann wäre es perfekt.

Viele Grüße
Semmy

Re: Aktoren-Auslösung in Variable schreiben

Verfasst: 13.02.2018, 10:33
von dtp
Ja, ist kein Problem.

Ersetze im ersten Skript die Zeile

Code: Alles auswählen

count = count + 1;
durch

Code: Alles auswählen

count = count + 1;
if(count >= 4){count = 4;}
und im zweiten Skript die Zeile

Code: Alles auswählen

count = count - 1;
durch

Code: Alles auswählen

count = count - 1;
if(count <= 1){count = 1;}
Gruß,

Thorsten

Re: Aktoren-Auslösung in Variable schreiben

Verfasst: 13.02.2018, 10:42
von Semmy
Hallo

Läuft perfekt.

Vielen Dank
Gruß
Semmy

Re: Aktoren-Auslösung in Variable schreiben

Verfasst: 13.02.2018, 12:13
von dtp
Freut mich.

Gruß,

Thorsten

Re: Aktoren-Auslösung in Variable schreiben

Verfasst: 05.05.2018, 16:58
von borschem
Hallo @DTP / Thorsten,

ich lese hier zwar schon einige Zeit mit, war aber bis zu deinem coolen Skript noch nicht aktiv bzw. angemeldet.
Zuerst habe ich mir eine HomematicIP mit Türsensor und Heizungsthermostat gekauft, aber sehr schnell gemerkt, dass man da technisch sehr eingeschränkt ist.
Deswegen kam mir noch eine CCU2 ins Haus wo ich u.a. Lampen, Sonos-Box, den Türsensor und jetzt kommt es neuerdings auch den Durchgangssensor verwende. Nun ja so gut ich es mit der Hilfe von solch begabten Personen, wie hier im Forum, schaffe.
Aktuell brauche ich irgendwie Hilfe.
Dein Skript läuft super ... nur passt es nicht ganz zu meiner Konfiguration:
Folgender Sachverhalt:

Wohnungseingangstür mit Homematic IP Türkontakt optisch
aus Platzmangel (Flur, der gleich ums Eck geht) kommt gleich wenn man zur Tür herein kommt auf der linken Seite der Durchgangssensor.
Kommen ist von links nach rechts
Gehen ist von rechts nach links

Personen Kommen/gehen soll nur gezählt werden, wenn die Eingangstür benutzt wird,
da auch noch eine Kommode in diesem Bereich steht an der man evtl auch ab und an vorbei läuft.
Dies habe ich mit dem Türkontakt optisch als erste Bedingung gelöst (Tür geöffnet - prüfen) alles andere passiert danach

Nun zur Anforderung
wenn ich nach Hause komme
Tür auf Bewegung links nach rechts
Person 1 Bewegung links nach rechts
Tür zu Bewegung rechts nach links

somit wären es bei einer Person 2 x kommen 1x gehen
evtl. könnten weitere Personen kommen ...

beim Gehen passiert es genauso nur mit den Personen umgekehrt (Bewegung rechts nach links)

Da also kommen und gehen in einem Vorgang abläuft bräuchte ich eine Lösung die dies berücksichtigt.
Ich habe jetzt schon 2 Tage gebastelt und komme an meine Grenzen :cry:

Ich habe versucht deine beiden Skripte in zwei Programmen zu benutzen.
Aber irgendwie reagieren beide Programme gleichzeitig weil die Aktoren bzw. die Auslöser auch beide jeweils reagieren.
(Bewegung von rechts nach links und links nach rechts) ...

Am Ende ist es wahrscheinlich auch noch nicht einmal so schwer ... nur schein ich dann doch irgendwie ein Brett vorm Kopf zu haben ... :roll:

Idee? :?:
Hilfe? ... :idea:
Antwort wäre super ......

Gruß Matthias

Re: Aktoren-Auslösung in Variable schreiben

Verfasst: 06.05.2018, 14:35
von borschem
Moin Zusammen,
ich glaube ich habe es einigermaßen hinbekommen.

Ich musste für den Durchgangssensor schon fast einen punktgenauen Platz sehr nah am Türrahmen finden,
damit nicht die Personen-Bewegung, die durch das öffnen der Tür entsteht (beim gehen Tür aufziehen) als Bewegung erkannt wird.

Zusätzlich musste ich ewig mit folgenden Geräteeinstellungen spielen
- Zeitspanne, bis die nächste Bewegung erkannt wird.
- Zeitspanne, in der beide Sensoren ausgelöst haben müssen, damit die Richtung bestimmt werden kann
- Sensorempfindlichkeit

irgendwie ganz schön mühsam ...

Dennoch wäre ein Skript super, das sowohl das kommen als auch das gehen in einem zusammen Skript zählt.

Re: Aktoren-Auslösung in Variable schreiben

Verfasst: 05.09.2018, 19:27
von Benso
Vielen Dank für das Skript. Genau das habe ich auch gesucht. Bei mir brauchte ich einfach einen Zähler, der mir die Anzahl für die Nachbefüllungen in der Zisterne liefert.