Offene Fenster "ansagen"

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

Offene Fenster "ansagen"

Beitrag von joesch » 18.03.2017, 17:44

Hallo zusammen,

in Anlehnung an das "Uhrzeitansagesript" möchte ich offene Fenster ansagen. Das habe ich mir wie folgt gedacht:

Code: Alles auswählen

string ansage = "0.5,1,108000,1";
var fenster1 = dom.GetObject("Bidcos-RF.GEQ0000001:1");
var fenster2 = dom.GetObject("Bidcos-RF.GEQ0000002:1");

if (fenster1.State() > 0) {ansage = ansage # ",101";}
if (fenster2.State() > 0) {ansage = ansage # ",102";}

dom.GetObject("Signal-MP3 unten").DPByHssDP("SUBMIT").State(ansage);
Leider spielt das System nur die Datei "1" ab. Das Skript müsste m.E. bei offenen Tür-/Fensterkontakt bzw. Fensterdrehgriffkontakt (deshalb die Bedingung > 0) zusätzlich die Datei 101 bzw. 102 mit abspielen.

Vielen Dank dschon mal und VG,
joesch

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

Re: Offene Fenster "ansagen"

Beitrag von alchy » 18.03.2017, 21:16

Da es sich bei deinem Versuch ags. um eine Datenpunktabfrage mittels Adapter.Seriennummer:Kanal.DATEN
handelt, solltest du dich mit den Basics auseinandersetzen, sowie Schreibfehler korrigieren.
Hilfe findest du dabei, in dem du in meiner Signatur verlinkte Scriptdoku liest oder z.B. >> Abfrage von Datenpunkten per HM-Script <<
Funktionieren sollte es dann schon mal mit:

string ansage = "0.5,1,108000,1";
object fenster1 = dom.GetObject("BidCos-RF.GEQ0000001:1.STATE");
if (fenster1.Value()) {
ansage = ansage # ",101";}
dom.GetObject("Signal-MP3 unten").DPByHssDP("SUBMIT").State(ansage);

Dann wären da noch die fehlerträchtigen Zugriffe direkt auf dom.GetObject, was auch noch korrigiert werden sollte.


Sollte ich mich irren, und es handelt sich bei deinem Versuch nicht um eine versuchte Datenpunktabfrage sondern
bei Bidcos-RF.GEQ0000001:1 handelt es sich um den Kanalnamen, bitte ich vielmals um Entschuldigung.
Dann war meine Glaskugel zu dreckig.
Aber auch dann wird es so nichts werden, da du dann noch eine Methode .DPByHssDP() verwenden solltest, wie in der letzten Zeile.
Ich favorisiere bekanntermaßen erstere Methode.

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.

joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

Re: Offene Fenster "ansagen"

Beitrag von joesch » 20.03.2017, 09:26

Hallo alchy,

Vielen Dank für die Hinweise und Quellen :-)

Das Skript arbeitet nun wie es soll.

VG,
joesch

joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

Re: Offene Fenster "ansagen"

Beitrag von joesch » 22.03.2017, 07:20

Hallo zusammen!

Hier mein (auf der Basis des bereits im Forum veröffentlichten) fertiges Skript zum Ansagen der offenen Fenster.

Idee: Beim Ändern/Hinzufügen von Sensoren muss das Skript nicht angefasst werden. Beim reinen Zählen der offenern Fenster (siehe Ursprungsskript hier im Forum) war das auf Grund der kompletten Gewerkprüfung erst mal kein Problem. Mein Skript liest nun zusätzlich aus der Kanalbezeichnung des jeweiligen Sensors die Nummer der abzuspielenden MP3-Datei. Der Kanal 1 eines TFK hätte also z.B. die Bezeichnung "Fenster Küche (199)". Ist dieses Fenster offen, wird "109" extrahiert und dem Kanalaktionsstring hinzugefügt. Handelt es sich um einen Raum mit mehren Fenstern, denen die gleiche MP3-Datei zugeordnet ist, wird diese nur einmal in den Kanalaktionsstring aufgenommen.

Code: Alles auswählen

var myAssembly = dom.GetObject("Fenster"); !Gewerk, dessen Sensoren abgefragt werden
string itemID;
string ansageaktion = ""; !Zeichenkette, in der die Kanalaktion für den MP3-Gong zusammengestellt wird
integer zaehler = 0; !Zähler für die Anzahl der offenen Fenster

foreach(itemID, myAssembly.EnumUsedIDs())
 {
   var item = dom.GetObject(itemID);
   if (item.IsTypeOf(OT_CHANNEL))
   {
     var device = dom.GetObject(item.Device());
     if ( (device.HssType() == "HM-Sec-SC" ) || (device.HssType() == "HM-Sec-RHS" ) )
     {
       if (item.State() > 0)
       {
         string geraetename = item.Name(); !wenn Fenster geöffnet, Kanalbezeichnung laut WebUI ermitteln ...
         string dateinummer = geraetename.Substr(geraetename.Length()-4,3); !... Dateinnummer in Kanalbezeichnung ermitteln
         integer fundstelle = ansageaktion.Find(dateinummer); ! wenn -1, dann Dateinummer noch nicht enthalten
         if (fundstelle < 0) 
         {
          ansageaktion  = ansageaktion # "," # dateinummer; !wenn Dateinummer noch nicht enthalten, dann hinzufügen
          }
         zaehler = zaehler + 1.00;
        }
       }
      }
    }
if (zaehler > 0)
{
ansageaktion = "0.5,1,108000,1" # ansageaktion;
dom.GetObject("Signal-MP3").DPByHssDP("SUBMIT").State(ansageaktion);
}
Lautstärke, Anzahl des Abspielens sowie den allgemeinen Text "Es sind folgende Fenster offen" (bei mir Datei Nummer 1) habe ich hier fest codiert. Man könnte das sicher auch noch in entsprechende Variablen auslagern ... Auch wäre es sicher möglich, auf die Zählervariable zu verzichten ;-) und statt der Bedingung zaehler > 0 auf Zeichenkett ansageaktion ungleich leer zu prüfen.

VG,
joesch

IanS
Beiträge: 5
Registriert: 05.12.2016, 14:57
System: Alternative CCU (auf Basis OCCU)
Danksagung erhalten: 1 Mal

Re: Offene Fenster "ansagen"

Beitrag von IanS » 16.05.2017, 20:44

Hallo joesch,

ich hab gerade mal versucht dein Script bei mir anzuwenden.
Allerdings bekomme ich es nicht zum laufen.
Ich habe das Script angepasst, bekomme aber keine Ansage.
Könntest du mir vielleicht sagen was da noch falsch ist?!
Ich blick mit den Scripten noch nicht wirklich durch :roll: :cry:

Code: Alles auswählen

var myAssembly = dom.GetObject("TFK"); !Gewerk, dessen Sensoren abgefragt werden
string itemID;
string ansageaktion = ""; !Zeichenkette, in der die Kanalaktion für den MP3-Gong zusammengestellt wird
integer zaehler = 0; !Zähler für die Anzahl der offenen Fenster

foreach(itemID, myAssembly.EnumUsedIDs())
 {
   var item = dom.GetObject(itemID);
   if (item.IsTypeOf(OT_CHANNEL))
   {
     var device = dom.GetObject(item.Device());
     if ( (device.HssType() == "HM-Sec-SC" ) || (device.HssType() == "HM-Sec-RHS" ) )
     {
       if (item.State() > 0)
       {
         string geraetename = item.Name(); !wenn Fenster geöffnet, Kanalbezeichnung laut WebUI ermitteln ...
         string dateinummer = geraetename.Substr(geraetename.Length()-4,3); !... Dateinnummer in Kanalbezeichnung ermitteln
         integer fundstelle = ansageaktion.Find(dateinummer); ! wenn -1, dann Dateinummer noch nicht enthalten
         if (fundstelle < 0)
         {
          ansageaktion  = ansageaktion # "," # dateinummer; !wenn Dateinummer noch nicht enthalten, dann hinzufügen
          }
         zaehler = zaehler + 1.00;
        }
       }
      }
    }
if (zaehler > 0)
{
ansageaktion = "0.5,1,108000,99" # ansageaktion;
dom.GetObject("ELA").DPByHssDP("SUBMIT").State(ansageaktion);
}
Gibt es da auch noch eine Möglichkeit einer Ansage wenn alle Fenster geschlossen sind
und dazu noch die Änderung einer SysVar?

Gruß FloH

joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

Re: Offene Fenster "ansagen"

Beitrag von joesch » 21.05.2017, 23:32

Hast du die Dateinummer im Sensornamen hinterlegt? Gib mal bitte ein Beispiel für die Bezeichnung, die du für den Sensor und den Kanal 1 gewählt hast.

VG,
joesch
System: RaspberryMatic auf Raspberry Pi 3 Model B Rev 1.2 (rpi3) mit RPI-RF-MOD (4.4.22)

IanS
Beiträge: 5
Registriert: 05.12.2016, 14:57
System: Alternative CCU (auf Basis OCCU)
Danksagung erhalten: 1 Mal

Re: Offene Fenster "ansagen"

Beitrag von IanS » 22.05.2017, 12:04

Mahlzeit,

danke für deine Antwort. Benannt hab ich die TFKs so:

Sensor:
Fenster Schlafzimmer Garten

Kanal 1:
Fenster SZ G (100):1

Gehört die Nummer auch noch in den Sensornamen?

VG
FloH

joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

Re: Offene Fenster "ansagen"

Beitrag von joesch » 22.05.2017, 16:48

Das Skript ermittelt als Dateiname (mit dem die Dateibezeichnung des MP3-Files anfangen muss) die letzten 4 Zeichen der Kanalbezeichnung und nutzt davon die Zeichen ein bis drei (schneidet also die 4. Stelle schlicht ab).

Code: Alles auswählen

string dateinummer = geraetename.Substr(geraetename.Length()-4,3);
In deinem Fall

Code: Alles auswählen

Fenster SZ G (100):1
wird als Dateiname also "0):" ermittelt.
Benenne daher bitte die Bezeichnung des Kanal eins um in

Code: Alles auswählen

Fenster SZ G (100)
Oder ändere die vorgenannte Skriptzeile in

Code: Alles auswählen

string dateinummer = geraetename.Substr(geraetename.Length()-6,3);
Dann sollte es klappen.

VG,
joesch

IanS
Beiträge: 5
Registriert: 05.12.2016, 14:57
System: Alternative CCU (auf Basis OCCU)
Danksagung erhalten: 1 Mal

Re: Offene Fenster "ansagen"

Beitrag von IanS » 23.05.2017, 17:01

Hallo Joesch,

danke für deine Antwort.
hat leider nichts gebracht.....Hab die Kanalnamen angepasst
allerdings passiert immer noch nichts.

Im Anhang hab ich mal das Programm eingefügt.
Vielleicht hast du noch eine Idee

Gruß
FloH
Dateianhänge
Screenshot 2017-05-23 16.55.23.jpg

joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

Re: Offene Fenster "ansagen"

Beitrag von joesch » 24.05.2017, 06:44

Dann müssen wir weiter schauen:

Deine TFK's sind vom Typ HM-Sec-SC oder HM-Sec-RHS?
Du hast sie alle dem Gewerk mit der Bezeichnung "TFK" zugeordnet (oder einem anderen, dann musst du im Skript die entsprechende Bezeichnung ersetzen)?

VG,
joesch

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“