Seite 6 von 10

Re: Alle Lichter an bzw. ausschalten (Je Raum)

Verfasst: 30.03.2017, 16:32
von dtp
alchy hat geschrieben: Nö, hätte es nicht. :roll:
Es hätte *IMHO* einen SyntaxError geworfen und fertig.
Hast natürlich Recht. Man sollte nicht mehrere Dinge parallel machen. :roll:

Re: Alle Lichter an bzw. ausschalten (Je Raum)

Verfasst: 30.03.2017, 17:07
von nicolas-eric
Danke Jungs!
Auf Euch ist echt Verlass. :D
Da wäre ich niemals darauf gekommen, dass es intern einen anderen Namen für das Gewerk gibt, als der mir im WebUI angezeigte.
Wie kann man sowas nur programmieren, das verwirrt die User doch nur unnütz.

Hat sich das mit den Namen denn geändert in letzter Zeit?
Bei der alten CCU, die ich Ende 2015 am alten Wohnort gelassen hatte, funktionierte es, die standardmässigen Gewerke mit dem im WebUI angezeigten Namen abzufragen, da gab es keine unterschiedlichen Namen.

Re: Alle Lichter an bzw. ausschalten (Je Raum)

Verfasst: 30.03.2017, 17:22
von alchy
Das Problem taucht hier immer wieder mal auf. Irgendwo hab ich das schon mal ausführlich beschrieben. Es macht Sinn die Listen immer mal zu checken und ggf. Wie beschrieben zu überarbeiten.

Was da das ursächliche Problem ist, hab ich noch nicht untersucht. Geschuldet der Tatsache, daß ich es bei mir nicht habe.
Ich denke das kam mit der Umstellung der Űbersetzung auf mehrere Dateien verteilt. Ist aber schon ne Weile her.

Alchy

Re: Alle Lichter an bzw. ausschalten (Je Raum)

Verfasst: 02.04.2017, 13:00
von dtp
Hi,

ich habe das Skript noch mal ein wenig an meine Bedürfnisse angepasst, da ich es eigentlich nur für das Ausschalten beim Abschließen brauche, aber einige Verbraucher, wie die Waschmaschine und den Trockner vom automatischen Ausschalten ausschließen wollte. Am Ende des Skripts lasse ich mir noch eine Push-Nachricht aller ausgeschalteten Kanäle schicken.

Code: Alles auswählen

! Aktoren für bestimmte Gewerke und Räume bei Abwesenheit ausschalten
! Version 1.2, Autor: dtp 

string tradeList = "Licht\tVerbraucher"; ! Liste der Gewerke (trennen mit "\t", alle Gewerke: "alle")   
string roomList = "alle"; ! Liste der Räume (trennen mit "\t", alle Räume: "alle")
string exList = "DG Schlafzimmer Dimmer Kanal 2\tUG Hobbyraum Dimmer Kanal 2\tUG HWR Waschmaschine Schalter\tUG HWR Trockner Schalter"; ! Liste der Kanäle, die nicht ausgeschaltet werden dürfen (trennen mit "\t")

! +++++ Variablendeklaration +++++
string tradeIndex; string roomIndex; string channelIndex; string functionIndex; string device;
string list = ""; string message;
var channel;

! +++++ Setzen der Priorität für die Push-Nachricht +++++
dom.GetObject("CCU SV Push Prio").State("-1");

! +++++ Sound für Pushover-Nachricht +++++
if(dom.GetObject("CCU SV Pushover Sound")){dom.GetObject("CCU SV Pushover Sound").State("none");}

! +++++ Skriptkern +++++
if(roomList == "alle"){roomList = dom.GetObject(ID_ROOMS).EnumNames();}
if(tradeList == "alle"){tradeList = dom.GetObject(ID_FUNCTIONS).EnumNames();}

foreach(tradeIndex, tradeList){
  foreach(roomIndex, roomList){
    if((dom.GetObject(tradeIndex)) && (dom.GetObject(roomIndex))){
      foreach(channelIndex, dom.GetObject(roomIndex).EnumUsedIDs()){
        channel = dom.GetObject(channelIndex);
        device = dom.GetObject(channel.Device());
        foreach(functionIndex, channel.ChnFunction()){
          if(dom.GetObject(functionIndex).Name() == tradeIndex){
            if((exList.Find(channel.Name())).ToInteger() == -1){
              if(channel.DPByHssDP("STATE").Value()){channel.DPByHssDP("STATE").State(0); list = list#"\n"#channel.Name();}
              if(channel.DPByHssDP("LEVEL").Value()){channel.DPByHssDP("LEVEL").State(0.0); list = list#"\n"#channel.Name();}
            }
          }
        }
      }
    }
  }
}

! +++++ Erzeugen der Nachricht +++++
message = "Geräte-Kanäle bei Abwesenheit ausgeschaltet!";

if(list != ""){
  message = message#list;

  ! +++++ Programm "CCU PRG Push-Nachrichten" ausführen +++++
  dom.GetObject("CCU SV Push Text").State(message);
  dom.GetObject("CCU PRG Push-Nachrichten").ProgramExecute();
}
Und hier das zugehörige Programm.
2017-04-02_17h14_17.png
Den zugehörigen CUxD-Timer starte und stoppe ich übrigens mit folgendem Programm. Dies nur der Vollständigkeit halber. ;)
2017-04-02_17h16_10.png
Gruß,

Thorsten

Re: Alle Lichter an bzw. ausschalten (Je Raum)

Verfasst: 02.05.2017, 18:29
von Karlinho
Hallo Zusammen,

seit dem Wochenende (evtl. nach Neustart) werden meine Osram Lampen (A60 RGBW und FLEX RGBW) nicht mehr über das Skript ausgeschaltet.

Code: Alles auswählen

    ! Aktoren für bestimmte Gewerke und Räume bei Abwesenheit ausschalten
    ! Version 1.2, Autor: dtp

    string tradeList = "Licht\tVerbraucher"; ! Liste der Gewerke (trennen mit "\t", alle Gewerke: "alle")   
    string roomList = "alle"; ! Liste der Räume (trennen mit "\t", alle Räume: "alle")
    string exList = "Wohnzimmer Funk-Schaltaktor Tablet 1\tArbeitszimmer Funk-Schaltaktor DiskStation 1"; ! Liste der Kanäle, die nicht ausgeschaltet werden dürfen (trennen mit "\t")

    ! +++++ Variablendeklaration +++++
    string tradeIndex; string roomIndex; string channelIndex; string functionIndex; string device;
    string list = ""; string message;
    var channel;

    ! +++++ Setzen der Priorität für die Push-Nachricht +++++
    dom.GetObject("CCU SV Push Prio").State("-1");

    ! +++++ Sound für Pushover-Nachricht +++++
    if(dom.GetObject("CCU SV Pushover Sound")){dom.GetObject("CCU SV Pushover Sound").State("none");}

    ! +++++ Skriptkern +++++
    if(roomList == "alle"){roomList = dom.GetObject(ID_ROOMS).EnumNames();}
    if(tradeList == "alle"){tradeList = dom.GetObject(ID_FUNCTIONS).EnumNames();}

    foreach(tradeIndex, tradeList){
      foreach(roomIndex, roomList){
        if((dom.GetObject(tradeIndex)) && (dom.GetObject(roomIndex))){
          foreach(channelIndex, dom.GetObject(roomIndex).EnumUsedIDs()){
            channel = dom.GetObject(channelIndex);
            device = dom.GetObject(channel.Device());
            foreach(functionIndex, channel.ChnFunction()){
              if(dom.GetObject(functionIndex).Name() == tradeIndex){
                if((exList.Find(channel.Name())).ToInteger() == -1){
                  if(channel.DPByHssDP("STATE").Value()){channel.DPByHssDP("STATE").State(0); list = list#"\n"#channel.Name();}
                  if(channel.DPByHssDP("LEVEL").Value()){channel.DPByHssDP("LEVEL").State(0.0); list = list#"\n"#channel.Name();}
                }
              }
            }
          }
        }
      }
    }

    ! +++++ Erzeugen der Nachricht +++++
    message = "Geräte-Kanäle bei Abwesenheit ausgeschaltet!";

    if(list != ""){
      message = message#list;

      ! +++++ Programm "CCU PRG Push-Nachrichten" ausführen +++++
      dom.GetObject("CCU SV Push Text").State(message);
      dom.GetObject("CCU PRG Push-Nachrichten").ProgramExecute();
    }
Jemand eine Idee woran es liegen kann?

Gruß Karl

Re: Alle Lichter an bzw. ausschalten (Je Raum)

Verfasst: 02.01.2018, 17:59
von joni-blue
Hallo Alchy,

Fragt dieses Script die Aktoren aktiv ab oder schaut es nach dem letzten bekannten Wert in der CCU um das Sendeaufkommen zu minimieren?

Lg aus Hannover

Re: Alle Lichter an bzw. ausschalten (Je Raum)

Verfasst: 02.01.2018, 18:05
von alchy
die Scripte verwerten den der CCU bekannten Status.

Alchy

Re: Alle Lichter an bzw. ausschalten (Je Raum)

Verfasst: 18.02.2018, 08:21
von greatone1
Hallo Alchy,

ich wollte mich nur für Deine immense Unterstützung der Homematic User hier im Forum bedanken. Dein Script hier zum Ein-/und Ausschalten ist große Klasse. Es hat mir viel Arbeit und Zeit gespart direkt auf so eine tolle Resource zurückgreifen zu können. Vielen Dank für Deine Zeit die Du hier spendierst, Deine absolut professionelle Arbeit und Deine schier unendliche Geduld!

Ewald

Re: Alle Lichter an bzw. ausschalten (Je Raum)

Verfasst: 19.02.2018, 10:12
von FraKo
Moin Moin,

ich bin gerade auf der Suche nach einem Script, das alle Lampen aus den Gewerk "Licht_Innen" und "Licht_Außen" einfach nur ausschaltet. Ich hätte nun das hier von Alchy genommen:


Nun meine Frage(n): Fragt dieser Script die Aktoren nach deren aktuellen Status direkt ab oder schaut es nur in die CCU? Und wie sieht es hier mit der "Funkpflege" aus? Normalerweise lasse ich in meinen Programmen, wenn ich mehrere Aktoren schalten möchte (wie meine 11 Rollläden), immer 2-3 Sekunden Pause, damit auch wirklich alle Aktoren reagieren. Wie kann eine solche Zeitverzögerung in einem Script realisiert werden? Oder muss man beim schalten mehrerer Aktoren eines Gwerkes über Scripte keine Funkpflege beachten? Neben den ganz normalen HM-Schaltaktoren, habe ich auch noch 3 HMIP-BSM Schalt-Mess-Aktoren die Lichter aus und ein schalten. Die müssen ja sicherlich ob im Code auch noch aufgenommen werden, oder?

Fragen über Fragen :?

Ich würde mich sehr über eine kurz Rückantwort freuen.

Munter
Frank

Re: Alle Lichter an bzw. ausschalten (Je Raum)

Verfasst: 19.02.2018, 10:23
von alchy
Bitte immer >> H I E R << nach der aktuellen Version des Scriptes schauen.

Und bitte immer lieber das Script verlinken, als es als Copy irgendwo zu posten. Ich lösche solche Scriptcopys immer im Forum.


Alchy