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
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
-
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:
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.
-
erik
- Beiträge: 776
- Registriert: 31.10.2007, 13:32
- Hat sich bedankt: 6 Mal
- Danksagung erhalten: 6 Mal
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
-
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:
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("-------");
}
}
}
}
-
erik
- Beiträge: 776
- Registriert: 31.10.2007, 13:32
- Hat sich bedankt: 6 Mal
- Danksagung erhalten: 6 Mal
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
-
helmi74
- Beiträge: 422
- Registriert: 03.06.2012, 13:49
- Danksagung erhalten: 1 Mal
Beitrag
von helmi74 » 07.10.2012, 09:21
Moin anli!
...war im Prinzip auch genau das was ich gesucht hab
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.
Das wäre dann für mich die richtige Ausgangsform
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
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
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
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
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