Variablen, die einem Kanal zugeordnet sind, ermitteln

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

Antworten
anderl1969
Beiträge: 167
Registriert: 15.10.2013, 20:15
Hat sich bedankt: 6 Mal
Danksagung erhalten: 5 Mal

Variablen, die einem Kanal zugeordnet sind, ermitteln

Beitrag von anderl1969 » 01.01.2017, 16:57

Ich hab folgendes Problem:

Ich hab allen meinen Fenster-Sensoren eine bestimmte System-Variable zugeordnet, also z.B.:
  • Variable "Fenster.A.Dummy" ist dem Kanal "Fenster A:1" zugeordnet
  • Variable "Fenster.B.Dummy" ist dem Kanal "Fenster B:1" zugeordnet
  • ...
In einem Script durchforste ich mit for-each das Gewerk "Verschluss" und erhalte so alle meine Fenster-Sensoren:

Code: Alles auswählen

var meineFenster = dom.GetObject("Verschluss");
string itemId;

foreach(itemId, meineFenster.EnumUsedIDs())
{
	var item = dom.GetObject(itemId);
	if (item.IsTypeOf(OT_CHANNEL))
	{
		var device = dom.GetObject(item.Device());

		! Gültige Geräte
		! HM-Sec-SC-2		Tür-/Fensterkontakt
		! HM-Sec-RHS		Fenster-Drehgriffkontakt
		! HM-Sec-SCo		Tür-/Fensterkontakt optisch
		!
		! Ungültige Geräte
		! HM-CC-VG-1		virtuelles Gerät bei Heizgruppen

		if ((device.HssType() == "HM-Sec-SC-2")  || (device.HssType() == "HM-Sec-RHS") || (device.HssType() == "HM-Sec-SCo"))
		{
			WriteLine("Name: " # device.Name());
			WriteLine("Typ: " # device.HssType());

			var dp_state = item.DPByHssDP("STATE");
			WriteLine("dp_state = " # dp_state.Value());
			WriteLine("dp_state Typ = " # dp_state.Value().VarType());

			! Unterschiedliche Rückgabewerte der einzelnen Geräte-Typen 
			! HM-Sec-SC-2		Typ 1 = boolean		false = geschlossen, true = offen
			! HM-Sec-SCo		 Typ 1 = boolean		false = geschlossen, true = offen
			! HM-Sec-RHS		 Typ 2 = integer		0 = geschlossen, 1 = gekippt, 2 = offen

		}
	}
}
Wie komme ich jetzt innerhalb der Schleife an die Variablen, die dem jeweiligen Kanal zugeordnet sind?
Ich möchte die Abfrage möglichst dynamisch halten. Das Script soll also nicht einen bestimmten Namen voraussetzen, sondern erstmal ermitteln, welche Variablen es gibt und sie auch ansprechen können.

Kann mir bitte jemand helfen, wie das geht?
CCU - RaspberryMatic 3.73.9.20231130 (OVA) / Proxmox VM + HB-RF-ETH + RPI-RF-MOD
LAN GW 1 - CCU2GW (CCU2)
LAN GW 2 - CCU2GW (CCU2)

LAN GW 3 - HmIP-HAP
LAN GW 4 - HmIP-HAP


BadenPower

Re: Variablen, die einem Kanal zugeordnet sind, ermitteln

Beitrag von BadenPower » 01.01.2017, 17:48

anderl1969 hat geschrieben:Wie komme ich jetzt innerhalb der Schleife an die Variablen, die dem jeweiligen Kanal zugeordnet sind?
Mit der Methode .DPs(), welche Du auf den Kanal anwendest, erhälst Du alle Datenpunkte als Liste. Danach mußt Du nur die Liste durchlaufen und die Systemvariablen anhand des Objekttypes (OT_VARDP) herausfiltern. Und schon hast Du deine Systemvariablen, welche dem Kanal zugeordnet sind.

.

anderl1969
Beiträge: 167
Registriert: 15.10.2013, 20:15
Hat sich bedankt: 6 Mal
Danksagung erhalten: 5 Mal

Re: Variablen, die einem Kanal zugeordnet sind, ermitteln

Beitrag von anderl1969 » 01.01.2017, 18:41

Danke Dir! Hast mich schon einen Schritt weiter gebracht...
CCU - RaspberryMatic 3.73.9.20231130 (OVA) / Proxmox VM + HB-RF-ETH + RPI-RF-MOD
LAN GW 1 - CCU2GW (CCU2)
LAN GW 2 - CCU2GW (CCU2)

LAN GW 3 - HmIP-HAP
LAN GW 4 - HmIP-HAP


Benutzeravatar
robbi77
Beiträge: 13906
Registriert: 19.01.2011, 19:15
System: CCU
Wohnort: Landau
Hat sich bedankt: 182 Mal
Danksagung erhalten: 747 Mal

Re: Variablen, die einem Kanal zugeordnet sind, ermitteln

Beitrag von robbi77 » 02.01.2017, 18:23

Gibts demnächst ne neue App? ;-)


Gruß
Roberto
Bei Risiken und Nebenwirkungen fragen Sie den Elektriker Ihres geringsten Mißtrauens!
http://www.eq-3.de/service/downloads.html
Tips und Tricks für Anfänger: viewtopic.php?t=22801
Programmlogik: viewtopic.php?f=31&t=4251
Webui-Handbuch: https://www.eq-3.de/downloads/download/ ... h_eQ-3.pdf
Script und Linksammlung: viewtopic.php?f=26&t=27907
Troll des Forums ...

anderl1969
Beiträge: 167
Registriert: 15.10.2013, 20:15
Hat sich bedankt: 6 Mal
Danksagung erhalten: 5 Mal

Re: Variablen, die einem Kanal zugeordnet sind, ermitteln

Beitrag von anderl1969 » 02.01.2017, 20:02

Ich kann gern mal aufzeigen, was ich umgesetzt habe. Für Anregungen bin ich immer offen.

Ich lasse bestimmte Fenster, die gern mal vergessen werden geschlossen zu werden, überwachen und dann soll eine Gong-Ansage darauf hinweisen.
Im EG sind es derzeit 3 Fenster, die überwacht werden:
EG Fenster.PNG
Hier sieht man auch, dass die Fenster jeweils eine Variable haben für die Dauer, seit sie offen sind, und dafür, ob sie geschlossen werden müssen (die offen.seit-Variable hat einen bestimmten, vom jeweiligen Fenster abhängigen Schwellwert überstiegen).
Wie diese Variablen gesetzt werden, spar ich mir an dieser Stelle.

Hier soll es darum gehen, wie der Gong ausgelöst wird:

Wenn eine der Fenster-Variablen Fenster.<Raum>.Schliessen.EG.<#> sich auf "Fenster SCHLIESSEN" ändert, dann wird ein Script ausgeführt, das den Gong steuert (siehe unten), ansonsten wird der Gong inkl. LED ausgemacht:
HM Alarm Gong.PNG
Hier das Script, das den Gong ansteuert. Auf der SD-Karte des Gongs sind Ansagen für jedes Fenster gespeichert, z.B. "Das Fenster im Arbeitszimmer ist offen". Zusätzlich gibt es noch die pauschale Ansage "Bitte schliessen". Das Script bastelt in Abhängigkeit der Varaiblen einen String für den Datenpunkt SUBMIT des Gongs zusammen. In Endergebnis ertönt zuerst das interne Signal des Gongs (Datei 0), gefolgt von einer oder mehreren Ansagen für jedes Fenster, das geschlossen werden muss und zum Abschluss die Aufforderung "Bitte schließen". Diese Ansage wiederholt sich, bis das letzte Fenster geschlossen ist.

Code: Alles auswählen

! Alarm Gong EG - DANN-Zweig
! 
! Steuert Gong-Ansage im EG 
!
! offene Fenster:
! Prüft, ob im EG ein Fenster geschlossen werden muss. Dazu werden alle Geräte
! und Kanäle aus dem Gewerk "Verschluss" überprüft
!
! Voraussetzung:
! Den überwachten Fenstern muss eine Systemvariable zugeordnet werden mit
! folgender Nomenklatur:
! Fenster.<Raum>.Schliessen.<Etage>.<#Sound>
!
! * Es werden nur die Kanäle/Geräte berücksichtigt, denen eine entsprechende
!   Variable zugeordnet ist
! * Filter: <Etage> = "EG" 
! * <#Sound> = Nummer zwischen 1 und 254; bestimmt das MP3-File auf SD-Karte
! * Der Wert der Variable gibt an, ob das zugehörige Fenster geschlossen
!   werden muss.
!
! Syntax MP3 Gong Sound-String
!
! vol, count, sec, file#1, file#2, ..., file#10 
! vol	= Lautstärke 0-100% als Dezimalzahl (z.B. 1.0 oder 0.8)
! count	= Wiederholungen (max. 255)
! sec	= Abspiellänge in Sekunden oder 108000 für Dateilänge
! file#1 = 1. von max 10 mp3 Files als Nummer
! 
! Beispiel:
! 0.8,255,108000,8, 8, 8, 8, 6, 7, 6, 7, 6, 7
! 0.4,255,108000,1,1,4,3,2
!
! 80% Lautstärke bei 255 Wiederholungen und Abspieldauer = Dateilänge
! gespielt werden 4x File #8 gefolgt von 3x File #6 und #7
!
! v0.1	01-01-2017
! - Gong-Ansage: offene Fenster

var meineFenster = dom.GetObject("Verschluss");
string itemId;
string dpId;
string dpName;
string kanalAktion = "0.4,255,108000,0,"; ! Lautstärke = 40%, 255 Wiederholungen, maximale Abspiellänge, Sound 0 = interner Gong
boolean ringTheBell = false;

foreach(itemId, meineFenster.EnumUsedIDs())
{
	var item = dom.GetObject(itemId);
	if (item.IsTypeOf(OT_CHANNEL))
	{
		var device = dom.GetObject(item.Device());
		var channel = item;

		! Gültige Geräte
		! HM-Sec-SC-2		Tür-/Fensterkontakt
		! HM-Sec-RHS		Fenster-Drehgriffkontakt
		! HM-Sec-SCo		Tür-/Fensterkontakt optisch
		!
		! Ungültige Geräte
		! HM-CC-VG-1		virtuelles Gerät bei Heizgruppen

		if ((device.HssType() == "HM-Sec-SC-2")  || (device.HssType() == "HM-Sec-RHS") || (device.HssType() == "HM-Sec-SCo"))
		{
			var dp_state = item.DPByHssDP("STATE");
			
			foreach(dpId, channel.DPs().EnumUsedIDs())
			{
				var dp = dom.GetObject(dpId);
				if (dp.IsTypeOf(OT_VARDP))
				{
					! Variable gefunden
					! Prüfen, ob Variable den Namenskonventionen entspricht:
					! Fenster.<Raum>.Schliessen.EG.<#Sound>
					
					dpName = dp.Name();
					if((dpName.StrValueByIndex(".", 0) == "Fenster") && (dpName.StrValueByIndex(".", 2) == "Schliessen") && (dpName.StrValueByIndex(".", 3) == "EG"))
					{
						! Richtige Variable gefunden
						if (dp.Value())
						{
							! Das Fenster muss geschlossen werden
							kanalAktion = kanalAktion # dpName.StrValueByIndex(".", 4) # ","; ! Der letzte Abschnitt des Variablen-Namen bestimmt das spezielle MP3-File
							ringTheBell = true;
						}
					}
				}
			}
		}
	}
}

var kanalGongSound = dom.GetObject("Gong EG:Sound");
var kanalGongLED = dom.GetObject("Gong EG:LED");
var dp_Sound_WORKING = kanalGongSound.DPByHssDP("WORKING");
var dp_Sound_SUBMIT = kanalGongSound.DPByHssDP("SUBMIT");
var dp_LED_WORKING = kanalGongLED.DPByHssDP("WORKING");

! Die if-Abfrage ist eigentlich überflüssig, weil dieses Script sowieso nur ausgeführt wird,
! wenn mindestens 1 überwachtes Fenster geschlossen werden muss.
! Aber sicher ist sicher ;-) 
if (ringTheBell)
{
	! Zum Abschluss das File#3 "Bitte schliessen" und #2 Stille (1,5sec) anfügen
	kanalAktion = kanalAktion # "3,2";
	
	! LED und Sound mit eigentlicher Aktion starten
	dp_Sound_SUBMIT.State(kanalAktion);
	kanalGongLED.State(true);
}
Schön an dem Script ist, dass es dyanmisch ist. Wenn ich ein zusätzliches Fenster in die Überwachung mit integrieren will, dann muss ich es nur mit einer entsprechenden Variablen Fenster.<Raum>.Schliessen.<Etage>.<#> versehen. Und in die WENN-Abfrage muss ich die neue Variabel natürlich integrieren.
CCU - RaspberryMatic 3.73.9.20231130 (OVA) / Proxmox VM + HB-RF-ETH + RPI-RF-MOD
LAN GW 1 - CCU2GW (CCU2)
LAN GW 2 - CCU2GW (CCU2)

LAN GW 3 - HmIP-HAP
LAN GW 4 - HmIP-HAP


Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“