Alarmmeldungen auslesen =>Mail versenden.

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

erik
Beiträge: 776
Registriert: 31.10.2007, 13:32
Hat sich bedankt: 6 Mal
Danksagung erhalten: 6 Mal

Alarmmeldungen auslesen =>Mail versenden.

Beitrag von erik » 06.10.2012, 21:32

Hallo,

möchte gerne die Alarmmeldungen auslesen und diese per Mail verschicken.
Habe mit

Code: Alles auswählen

string test = dom.GetObject('Alarmmeldungen').Value();
die Anzahl der Alarmmeldungen abgefragt - können diese auch mehr als 1 sein?

Ich möchte gerne den Auslöser abfragen und dann anschließend per Mail verschicken. wie bekomme ich den Auslöser abgefragt?

Hat jemand dazu schon was geschrieben / Erstellt? Wenn ich den auslöser ermittelt bekomme, kann ich damit weiter arbeiten - aber wie komme ich daran?

Grüße

Erik

Benutzeravatar
anli
Beiträge: 4326
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 23 Mal
Kontaktdaten:

Re: Alarmmeldungen auslesen =>Mail versenden.

Beitrag von anli » 06.10.2012, 23:09

Hallo.

Ja, eine erste Hilfestellung gibt es ein paar Threads unter diesem - leider unter einer nicht passenden Überschrift ;)

http://homematic-forum.de/forum/viewtop ... 26&t=10215

Für Mailversand gibt es unterschiedliche Module, u. a. auch auf homematic-inside.de, einfach mal reinlesen und bei Bedarf wieder Fragen stellen.
Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser

erik
Beiträge: 776
Registriert: 31.10.2007, 13:32
Hat sich bedankt: 6 Mal
Danksagung erhalten: 6 Mal

Re: Alarmmeldungen auslesen =>Mail versenden.

Beitrag von erik » 06.10.2012, 23:39

Hi Anli,

Danke für die Antwort.
Den Thread hate ich gefunden, nur komme ich damit nicht weiter.

Mailversand ist kein Problem, bekomme nur nichtden auslösenden Aktor von der Alarmmeldung ausgelesen - weiß nicht, ob ich das per Script hinbekomme oder dafür TCL und Systemexec her halten muß.

Erik

Benutzeravatar
anli
Beiträge: 4326
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 23 Mal
Kontaktdaten:

Re: Alarmmeldungen auslesen =>Mail versenden.

Beitrag von anli » 06.10.2012, 23:59

Das geht per Skript, zum Beispiel so:

Code: Alles auswählen

object oTmpArray = dom.GetObject( ID_SYSTEM_VARIABLES );
if( oTmpArray )
{
  string sTmp;
  foreach(sTmp,oTmpArray.EnumIDs())
  {
    object oTmp = dom.GetObject( sTmp );
    if( oTmp )
    {
      if( oTmp.IsTypeOf( OT_ALARMDP ) && ( oTmp.AlState() == asOncoming ) )
      {
		    object oSV = oTmp;
	      WriteLine("Ausloesung: " # oSV.AlOccurrenceTime());
	     	WriteLine("Zeitpunkt: " # oSV.Timestamp());
	      object oDestDP = dom.GetObject( oSV.AlDestMapDP() );
	      string sDestDPName = "";
	      if( oDestDP )
	      {
	        sDestDPName = oDestDP.Name();
	      }
	      else
	      {
	        sDestDPName = "kein Datenpunkt";
	      }
	      WriteLine("Datenpunkt: " # sDestDPName);
	      
	      string sAlarmName = oSV.Name();
	      if( !sAlarmName.Length() )
	      {
	        sAlarmName = "ohne Namen";
	      }
	      WriteLine("Name: " # sAlarmName);
	      
	      string sAlarmDescription = oSV.DPInfo();
	      if( !sAlarmDescription.Length() )
	      {
	        sAlarmDescription = "ohne Beschreibung";
	      }
	      WriteLine("Beschreibung: " # sAlarmDescription);
	      
	      string sRoom = "";
	      string sLastTriggerName = "";
	      string sLastTriggerMessage = "";
	      string sLastTriggerKey = "";
	      integer iTmpTriggerID = oSV.LastTriggerID();
	      if( iTmpTriggerID == ID_ERROR )
	      {
	        iTmpTriggerID = oSV.AlTriggerDP();
	      }
	
	      string sAlarmMessage = "";
	      string sChannelName = "";
	      string sRooms = "";
	      string roomIDs = "";
	      object oLastTrigger = dom.GetObject( iTmpTriggerID );
	      if( oLastTrigger )
	      {           
	        object oLastTriggerChannel = dom.GetObject( oLastTrigger.Channel() );
	        if( oLastTriggerChannel )
	        {
	          sChannelName = oLastTriggerChannel.Name();
	          string sLastTriggerName = sChannelName;
	          string sRID;
	          foreach( sRID, oLastTriggerChannel.ChnRoom() )
	          {
	            object oRoom = dom.GetObject( sRID );
	            if( oRoom )
	            {
	              sRooms = sRooms#"<br />"#oRoom.Name();
	              roomIDs = roomIDs#sRID# "\t";
	            }
	          }
	          
	          if( oLastTrigger.IsTypeOf( OT_HSSDP ) )
	          {
	            string sLongKey = oLastTriggerChannel.ChnLabel()#"|"#oLastTrigger.HSSID();
	            string sShortKey = oLastTrigger.HSSID();
	            if( (oLastTrigger.ValueType() == ivtInteger) && (oLastTrigger.ValueSubType() == istEnum) )
	            {
	              sLongKey = sLongKey#"="#web.webGetValueFromList( oLastTrigger.ValueList(), oSV.Value() );
	              sShortKey = sShortKey#"="#web.webGetValueFromList( oLastTrigger.ValueList(), oSV.Value() );
	            }
	            sAlarmMessage = web.webKeyFromStringTable( sLongKey );
	            if( !sAlarmMessage.Length() )
	            {
	              sAlarmMessage = web.webKeyFromStringTable( sShortKey );
	              if( !sAlarmMessage.Length() )
	              {
	                sAlarmMessage = "unbekannte Meldung ("#sShortKey#")";
	              }
	            }
	          }
	        }
	      }
	      else
	      {
	        if (oSV.IsTypeOf(OT_ALARMDP)) 
	        {
	          if ((oSV.Value() == false) || (oSV.Value() == "")) {
	            sAlarmMessage = oSV.ValueName0();
	          }
	          else {
	            sAlarmMessage = oSV.ValueName1();
	          }
	        }
	      }
	      
	      WriteLine("Alarmmeldung: " # sAlarmMessage);
	      WriteLine("Raum: " # sRooms);
	      WriteLine("Kanal: " # sChannelName);
	      WriteLine("-------");
      }
    }
  }
}

Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser

erik
Beiträge: 776
Registriert: 31.10.2007, 13:32
Hat sich bedankt: 6 Mal
Danksagung erhalten: 6 Mal

Re: Alarmmeldungen auslesen =>Mail versenden.

Beitrag von erik » 07.10.2012, 00:46

Hi anli,

Cool, genau das, was ich gesucht habe. In eine Mail bekomme ich das nun verpackt.

Güße

Erik

Benutzeravatar
helmi74
Beiträge: 422
Registriert: 03.06.2012, 13:49
Danksagung erhalten: 1 Mal

Re: Alarmmeldungen auslesen =>Mail versenden.

Beitrag von helmi74 » 07.10.2012, 09:21

Moin anli!

...war im Prinzip auch genau das was ich gesucht hab :D

Kannst Du mir viellicht nochmal Hilfe geben wie dein Alarm-Auslese-Script aussehen muss
wenn man es auf ein Minimum reduziert, so daß nur der auslösende Kanal in eine lokale Variable
"list" geschrieben wird. :cry:

Das wäre dann für mich die richtige Ausgangsform :wink:

Dann könnte ich mein bereits bestehendes und funktionierendes push-Script ranhängen und die "Gewerke-auslesen-Geschichte" vergessen...

if(list!="")
{
string stdout;
string stderr;
system.Exec("wget -q -O /dev/null 'http://prowl.weks.net/publicapi/add?api ... nbruch:%20"# list #" '", &stdout, &stderr);
}

erik
Beiträge: 776
Registriert: 31.10.2007, 13:32
Hat sich bedankt: 6 Mal
Danksagung erhalten: 6 Mal

Re: Alarmmeldungen auslesen =>Mail versenden.

Beitrag von erik » 07.10.2012, 15:15

denke das suchst Du:

Code: Alles auswählen

  string list;
  list = "Kanal: " # sChannelName # " Alarmmeldung: " # sAlarmMessage # " Zeitpunkt: " # oSV.Timestamp();
  string stdout;
  string stderr;
  system.Exec("/etc/config/addons/email/email 10 '"+list+"'",&stdout,&stderr);

Benny
Beiträge: 250
Registriert: 19.11.2012, 08:20

Re: Alarmmeldungen auslesen =>Mail versenden.

Beitrag von Benny » 23.12.2012, 21:09

anli hat geschrieben:Das geht per Skript, zum Beispiel so:

Code: Alles auswählen

object oTmpArray = dom.GetObject( ID_SYSTEM_VARIABLES );
if( oTmpArray )
{
  string sTmp;
  foreach(sTmp,oTmpArray.EnumIDs())
  {
    object oTmp = dom.GetObject( sTmp );
    if( oTmp )
    {
      if( oTmp.IsTypeOf( OT_ALARMDP ) && ( oTmp.AlState() == asOncoming ) )
      {
		    object oSV = oTmp;
	      WriteLine("Ausloesung: " # oSV.AlOccurrenceTime());
	     	WriteLine("Zeitpunkt: " # oSV.Timestamp());
	      object oDestDP = dom.GetObject( oSV.AlDestMapDP() );
	      string sDestDPName = "";
	      if( oDestDP )
	      {
	        sDestDPName = oDestDP.Name();
	      }
	      else
	      {
	        sDestDPName = "kein Datenpunkt";
	      }
	      WriteLine("Datenpunkt: " # sDestDPName);
	      
	      string sAlarmName = oSV.Name();
	      if( !sAlarmName.Length() )
	      {
	        sAlarmName = "ohne Namen";
	      }
	      WriteLine("Name: " # sAlarmName);
	      
	      string sAlarmDescription = oSV.DPInfo();
	      if( !sAlarmDescription.Length() )
	      {
	        sAlarmDescription = "ohne Beschreibung";
	      }
	      WriteLine("Beschreibung: " # sAlarmDescription);
	      
	      string sRoom = "";
	      string sLastTriggerName = "";
	      string sLastTriggerMessage = "";
	      string sLastTriggerKey = "";
	      integer iTmpTriggerID = oSV.LastTriggerID();
	      if( iTmpTriggerID == ID_ERROR )
	      {
	        iTmpTriggerID = oSV.AlTriggerDP();
	      }
	
	      string sAlarmMessage = "";
	      string sChannelName = "";
	      string sRooms = "";
	      string roomIDs = "";
	      object oLastTrigger = dom.GetObject( iTmpTriggerID );
	      if( oLastTrigger )
	      {           
	        object oLastTriggerChannel = dom.GetObject( oLastTrigger.Channel() );
	        if( oLastTriggerChannel )
	        {
	          sChannelName = oLastTriggerChannel.Name();
	          string sLastTriggerName = sChannelName;
	          string sRID;
	          foreach( sRID, oLastTriggerChannel.ChnRoom() )
	          {
	            object oRoom = dom.GetObject( sRID );
	            if( oRoom )
	            {
	              sRooms = sRooms#"<br />"#oRoom.Name();
	              roomIDs = roomIDs#sRID# "\t";
	            }
	          }
	          
	          if( oLastTrigger.IsTypeOf( OT_HSSDP ) )
	          {
	            string sLongKey = oLastTriggerChannel.ChnLabel()#"|"#oLastTrigger.HSSID();
	            string sShortKey = oLastTrigger.HSSID();
	            if( (oLastTrigger.ValueType() == ivtInteger) && (oLastTrigger.ValueSubType() == istEnum) )
	            {
	              sLongKey = sLongKey#"="#web.webGetValueFromList( oLastTrigger.ValueList(), oSV.Value() );
	              sShortKey = sShortKey#"="#web.webGetValueFromList( oLastTrigger.ValueList(), oSV.Value() );
	            }
	            sAlarmMessage = web.webKeyFromStringTable( sLongKey );
	            if( !sAlarmMessage.Length() )
	            {
	              sAlarmMessage = web.webKeyFromStringTable( sShortKey );
	              if( !sAlarmMessage.Length() )
	              {
	                sAlarmMessage = "unbekannte Meldung ("#sShortKey#")";
	              }
	            }
	          }
	        }
	      }
	      else
	      {
	        if (oSV.IsTypeOf(OT_ALARMDP)) 
	        {
	          if ((oSV.Value() == false) || (oSV.Value() == "")) {
	            sAlarmMessage = oSV.ValueName0();
	          }
	          else {
	            sAlarmMessage = oSV.ValueName1();
	          }
	        }
	      }
	      
	      WriteLine("Alarmmeldung: " # sAlarmMessage);
	      WriteLine("Raum: " # sRooms);
	      WriteLine("Kanal: " # sChannelName);
	      WriteLine("-------");
      }
    }
  }
}

Hi,

genau das Skript brauche ich als E-Mail ausgegeben, über das E-Mail Addon. Wie muss ich das einbauen? Wäre super, wenn mir das jemand umgebaut schicken kann, ich nutze hierfür z.B. E-Mail Vorlage 10 ... was muss ich bei TCL bzw. in den Text der Mail als Variable setzen?

Danke und Gruß, Benny

ThomasVIE
Beiträge: 7
Registriert: 17.03.2016, 09:57

Re: Alarmmeldungen auslesen =>Mail versenden.

Beitrag von ThomasVIE » 17.03.2016, 10:03

anli hat geschrieben:Das geht per Skript, zum Beispiel so:

Code: Alles auswählen

object oTmpArray = dom.GetObject( ID_SYSTEM_VARIABLES );
if( oTmpArray )
{
  string sTmp;
  foreach(sTmp,oTmpArray.EnumIDs())
  {
    object oTmp = dom.GetObject( sTmp );
    if( oTmp )
    {
      if( oTmp.IsTypeOf( OT_ALARMDP ) && ( oTmp.AlState() == asOncoming ) )
      {
		    object oSV = oTmp;
	      WriteLine("Ausloesung: " # oSV.AlOccurrenceTime());
	     	WriteLine("Zeitpunkt: " # oSV.Timestamp());
	      object oDestDP = dom.GetObject( oSV.AlDestMapDP() );
	      string sDestDPName = "";
	      if( oDestDP )
	      {
	        sDestDPName = oDestDP.Name();
	      }
	      else
	      {
	        sDestDPName = "kein Datenpunkt";
	      }
	      WriteLine("Datenpunkt: " # sDestDPName);
	      
	      string sAlarmName = oSV.Name();
	      if( !sAlarmName.Length() )
	      {
	        sAlarmName = "ohne Namen";
	      }
	      WriteLine("Name: " # sAlarmName);
	      
	      string sAlarmDescription = oSV.DPInfo();
	      if( !sAlarmDescription.Length() )
	      {
	        sAlarmDescription = "ohne Beschreibung";
	      }
	      WriteLine("Beschreibung: " # sAlarmDescription);
	      
	      string sRoom = "";
	      string sLastTriggerName = "";
	      string sLastTriggerMessage = "";
	      string sLastTriggerKey = "";
	      integer iTmpTriggerID = oSV.LastTriggerID();
	      if( iTmpTriggerID == ID_ERROR )
	      {
	        iTmpTriggerID = oSV.AlTriggerDP();
	      }
	
	      string sAlarmMessage = "";
	      string sChannelName = "";
	      string sRooms = "";
	      string roomIDs = "";
	      object oLastTrigger = dom.GetObject( iTmpTriggerID );
	      if( oLastTrigger )
	      {           
	        object oLastTriggerChannel = dom.GetObject( oLastTrigger.Channel() );
	        if( oLastTriggerChannel )
	        {
	          sChannelName = oLastTriggerChannel.Name();
	          string sLastTriggerName = sChannelName;
	          string sRID;
	          foreach( sRID, oLastTriggerChannel.ChnRoom() )
	          {
	            object oRoom = dom.GetObject( sRID );
	            if( oRoom )
	            {
	              sRooms = sRooms#"<br />"#oRoom.Name();
	              roomIDs = roomIDs#sRID# "\t";
	            }
	          }
	          
	          if( oLastTrigger.IsTypeOf( OT_HSSDP ) )
	          {
	            string sLongKey = oLastTriggerChannel.ChnLabel()#"|"#oLastTrigger.HSSID();
	            string sShortKey = oLastTrigger.HSSID();
	            if( (oLastTrigger.ValueType() == ivtInteger) && (oLastTrigger.ValueSubType() == istEnum) )
	            {
	              sLongKey = sLongKey#"="#web.webGetValueFromList( oLastTrigger.ValueList(), oSV.Value() );
	              sShortKey = sShortKey#"="#web.webGetValueFromList( oLastTrigger.ValueList(), oSV.Value() );
	            }
	            sAlarmMessage = web.webKeyFromStringTable( sLongKey );
	            if( !sAlarmMessage.Length() )
	            {
	              sAlarmMessage = web.webKeyFromStringTable( sShortKey );
	              if( !sAlarmMessage.Length() )
	              {
	                sAlarmMessage = "unbekannte Meldung ("#sShortKey#")";
	              }
	            }
	          }
	        }
	      }
	      else
	      {
	        if (oSV.IsTypeOf(OT_ALARMDP)) 
	        {
	          if ((oSV.Value() == false) || (oSV.Value() == "")) {
	            sAlarmMessage = oSV.ValueName0();
	          }
	          else {
	            sAlarmMessage = oSV.ValueName1();
	          }
	        }
	      }
	      
	      WriteLine("Alarmmeldung: " # sAlarmMessage);
	      WriteLine("Raum: " # sRooms);
	      WriteLine("Kanal: " # sChannelName);
	      WriteLine("-------");
      }
    }
  }
}

Welche Variable muss ich bei diesem Script dann fürs eMail nehmen?

Hab aktuell das hier und das eMail ist leer.

Code: Alles auswählen

string stdout;
string stderr;
system.Exec("/etc/config/addons/email/email 11", &stdout, &stderr);

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

Re: Alarmmeldungen auslesen =>Mail versenden.

Beitrag von alchy » 17.03.2016, 13:43

Darf ich fragen, was du bitte genau erreichen willst?
Augenscheinlich möchtest du:
eine Mail erhalten, wenn eine Alarmvariable wahr wird?

Was soll in der Mail alles drin stehen?

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 Zentrale (CCU / CCU2 / CCU3 / Charly)“