System.exec durch CuxD ersetzen

Anbindung von FS20-Komponenten, ELV-Wetterstationen, EnOcean und DMX an HomeMatic

Moderator: Co-Administratoren

matheversum
Beiträge: 287
Registriert: 27.04.2009, 13:46

Re: Sytem.exc durch CuxD ersetzen

Beitrag von matheversum » 24.10.2012, 08:10

Ich würde sagen beide, denn die shell soll ja die ' bekommen.
Aber ist die Verkettung in der Scriptspache nicht # statt +; ich meine mich zu erinnern, dass ich das auch (weil's so nach Java aussieht) mal verwechselt hatte, ging auch ne ganze Weile gut, bis ich mal zwei Zahlen verketten wollte und er hat sie addiert, zumal die Vorrangregeln der Operatoren ja nicht standard sind: Es sind alle gleichwertig und rechtsassoziativ, also der letzte zuerst: In deinem Beispiel würde also zuerst list + ' "gerechnet". Also dann so:

Code: Alles auswählen

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("/etc/config/addons/email/email 01 '" # list # "'");

grissli1
Beiträge: 2268
Registriert: 22.06.2012, 17:46
System: Alternative CCU (auf Basis OCCU)
Wohnort: Tirol/Austria
Hat sich bedankt: 13 Mal
Danksagung erhalten: 2 Mal

Re: Sytem.exc durch CuxD ersetzen

Beitrag von grissli1 » 24.10.2012, 16:52

Danke!
Komme heute wieder nach Hause und werde es gleich probieren.

Viele Grüße
Chris
System: RaspberryMatic 3.41.11.20190126 auf RPi3, ReverseProxy auf RPi3

Wildshunter
Beiträge: 98
Registriert: 10.09.2009, 22:10

Re: Sytem.exc durch CuxD ersetzen

Beitrag von Wildshunter » 18.01.2013, 23:28

Hallo !

jetzt habe ich auch mal CuxD installiert und moechte meine Emails jetzt durch CuxD versenden, nicht mehr ueber system.exec. Es kommt eine Email zwar an und zwar so:
Betreff ist ok, in der Msg nur: Prüfung des Ladezustandes der Batterien vom 18.2.2013, der Rest fehlt leider....Habt Ihr eine Idee? Danke!

Hier das Script, welches ich verwende:
----------------------------------------------------
! www.meine-homematic.de Beispiel Skript
! Warnung über niedrigen Batterie - Ladestand


! Anleitung
! 1. Ein Gewerk "Batterie betrieben" anlegen
! 2. Alle zu überwachenden Objekte dem Gewerk zuordnen
! 3. Folgendes Skript per Zeitmpodul 1x täglich ausführen


! Lösung basierend auf einem Skript von "saschahb"
! http://www.homematic-inside.de/tecbase. ... tem_id=138


var myAssembly = dom.GetObject("Batterie betrieben");
string itemID;
string text = "";
integer counter = 0;
foreach(itemID, myAssembly.EnumUsedIDs())
{
var item = dom.GetObject(itemID);
var device = dom.GetObject(item.Device());
var interface = dom.GetObject(item.Interface());
string interface_name = interface.Name();
string device_address = device.Address();
device_address = device_address.StrValueByIndex(":", 0);
string channel_name = interface_name # "." # device_address # ":0.LOWBAT";
var channel = dom.GetObject(channel_name);
if ( (channel.State() == true) && (channel.Value() == true) )
{
text = text # "- " # item.Name() # "\r\n";
counter = counter + 1;
}
}


if ( counter > 0 )
{
string MailEmpfaenger = "XXXXXXX@gmx.de";
string MailBetreff = "Homematicsystem: Batterie - Warnung";
string MailText;
string sDate = system.Date("%d.%m.%Y");
MailText = "Prüfung des Ladestandes der Batterien vom " # sDate # ".\r\n";
MailText = MailText # "Der Ladezustand folgender Batterien ist niedrig: \r\n\r\n" # text;
MailText = MailText # "\r\nBitte tauschen Sie die Batterien zeitnah aus.";
string stdout;
string stderr;
string teilstr;
string sendmail = "";
string sendbetreff = "";
string mailto = "";

foreach(teilstr, MailBetreff.Split(" "))
{
sendbetreff = sendbetreff # "+" # teilstr;
}

foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}

foreach(teilstr, MailEmpfaenger.Split(" "))
{
mailto = mailto # "+" # teilstr;
}

! system.Exec ("/bin/sh /etc/config/addons/mh/email.sh "# sendbetreff # " " # sendmail # " " mailto, &stdout, &stderr);
! naechsten zwei Zeilen eingefuegt im Austausch wegen cuxd - system.exec

dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("/bin/sh /etc/config/addons/mh/email.sh "# sendbetreff # " " # sendmail # " " # mailto #"'");

}

Benutzeravatar
JPS
Beiträge: 1093
Registriert: 07.08.2010, 22:51
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 8 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Sytem.exc durch CuxD ersetzen

Beitrag von JPS » 19.01.2013, 00:22

Wildshunter hat geschrieben:Hallo !

jetzt habe ich auch mal CuxD installiert und moechte meine Emails jetzt durch CuxD versenden, nicht mehr ueber system.exec. Es kommt eine Email zwar an und zwar so:
Betreff ist ok, in der Msg nur: Prüfung des Ladezustandes der Batterien vom 18.2.2013, der Rest fehlt leider....Habt Ihr eine Idee? Danke!
Das Problem kenne ich. Bei mir lassen sich auch keine HTML-Mails über CuxD und Meine-Homematic verschicken. "Normale" Mails funktionieren problemlos. Ich habe Scripts von Bekannten probiert, die dort liefen, bei mir - obwohl 1:1 übertragen - aber seltsamerweise nicht. Irgendwann war ich das Rumprobieren Leid und verschicke jetzt nur noch "normale" Mails über Meine-Homematic. Alles was HTML braucht mache ich mit Pushover... http://homematic-forum.de/forum/viewtop ... 31&t=11579. So komme ich jetzt endlich ohne SystemExec-Aufrufe aus.
Verwendung meiner Hinweise und Skripte auf eigenes Risiko | Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung

Wildshunter
Beiträge: 98
Registriert: 10.09.2009, 22:10

Re: Sytem.exc durch CuxD ersetzen

Beitrag von Wildshunter » 19.01.2013, 14:28

Hallo JPS,

Danke für die Rückmeldung, mit der "original Zeile mit system.exec Aufruf funktioniert alles problemlos seit einigen Monaten, habe nur die Zeile mit CuxD ausgetauscht, hm.... vielleicht hat noch jemand ein Tip....?!?
Ja, Pushover bin ich gerade ebenso am testen, habe aber auch noch ne Herausforderung. Über Email bekomme ich die Push Nachrichten auf mein Handy, ueber das dort beschriebene PHP Script (Webserver und PHP ist eingerichtet) passiert leider nichts... naja, eins nach dem anderen :=)
Gruesse!

Benutzeravatar
JPS
Beiträge: 1093
Registriert: 07.08.2010, 22:51
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 8 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Sytem.exc durch CuxD ersetzen

Beitrag von JPS » 19.01.2013, 15:46

Wildshunter hat geschrieben:mit der "original Zeile mit system.exec Aufruf funktioniert alles problemlos seit einigen Monaten, habe nur die Zeile mit CuxD ausgetauscht
Ja, genau so ist es auch bei mir und ich komme einfach nicht dahinter warum :roll:
Wildshunter hat geschrieben:ueber das dort beschriebene PHP Script (Webserver und PHP ist eingerichtet) passiert leider nichts
Den Tipp mit php über den Webserver habe ich spaßeshalber auch mal probiert, hat bei mir nicht funktioniert. Aber ich nutze ja ohnehin CURL (wie in dem anderen Beitrag beschrieben) das funktioniert tadellos.
Verwendung meiner Hinweise und Skripte auf eigenes Risiko | Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung

pix
Beiträge: 608
Registriert: 23.01.2012, 15:40
Danksagung erhalten: 1 Mal

Re: Sytem.exc durch CuxD ersetzen

Beitrag von pix » 20.01.2013, 19:22

Wildshunter hat geschrieben:Betreff ist ok, in der Msg nur: Prüfung des Ladezustandes der Batterien vom 18.2.2013, der Rest fehlt leider....Habt Ihr eine Idee? Danke!
Hallo Wildshunter,

ich habe das Skript ein wenig geändert un dnutze es jetzt so:

Code: Alles auswählen

! Email-Warnung über niedrigen Batterie - Ladestand
! www.meine-homematic.de Beispiel Skript
! Anleitung:
! Folgendes Skript per Zeitmpodul 1x täglich ausführen
! Lösung basierend auf einem Skript von "saschahb"
! http://www.homematic-inside.de/tecbase.html?view=item&item_id=138
! Dank auch an Marc Hoffmann für die Review des Skriptes
! Alle Batteriebetriebenen Geräte müssen in folgendem Gewerk sein:
var myAssembly = dom.GetObject("Batterie betrieben");
! Geändert für Email-Addon / CUXD / TCL von PIX

! Variablen initialisieren
string itemID;
string text = "";
integer counter = 0;
string cr2016 = "HM-RC-4\tHM-RC-4-B\tHM-RC-Sec3\tHM-RC-Sec3-B\tHM-RC-P1\tHM-RC-Key3\tHM-RC-Key3-B";
string cr2032 = "HM-PB-2-WM\tHM-SwI-3-FM\tHM-PBI-4-FM\tHM-Sec-TiS";
string lr44 = "HM-Sec-SC\tHM-Sec-RHS";
string lr6 = "HM-Sec-MDIR\tHM-CC-TC\tHM-WDS100-C6-O\tHM-WDS40-TH-I\tHM-WDS10-TH-O\tHM-WDS30-T-O\tHM-Sec-Key\tHM-Sec-SD\tHM-Sec-WDS";
string lr3 = "HM-RC-12\tHM-PB-4Dis-WM\tHM-Sen-EP";
string batlink;
string index;

! Durch alle angemeldeten Geräte iterieren
foreach(itemID, myAssembly.EnumUsedIDs()) {
    ! Gerätedetails & Schnittstelle holen
    var item = dom.GetObject(itemID);
    var device = dom.GetObject(item.Device());
    var interface = dom.GetObject(item.Interface());

    ! Name, Adresse und Kanal auslesen
    string interface_name = interface.Name();
    string device_address = device.Address();
    device_address = device_address.StrValueByIndex(":", 0);
    string channel_name = interface_name # "." # device_address # ":0.LOWBAT";
    var channel = dom.GetObject(channel_name);

    ! Batterie leer?
    if ( (channel.State() == true) && (channel.Value() == true) ) {
        ! Gerät enthält CR2016-Batterie?
        batlink = "unbekannt";
        foreach (index, cr2016) {
            if (index == device.HssType()) {
                batlink = "CR2016";
                }
            }

        ! Gerät enthält CR2032-Batterie?
        foreach (index, cr2032) {
            if (index == device.HssType()) {
                batlink = "CR2032";
                }
            }

        ! Gerät enthält LR44-Batterie?
        foreach (index, lr44) {
            if (index == device.HssType()) {
                batlink = "LR44";
                }
            }

        ! Gerät enthält LR6-Batterie?
        foreach (index, lr6) {
            if (index == device.HssType()) {
                batlink = "LR6";
                }
            }

        ! Gerät enthält LR3-Batterie?
        foreach (index, lr3) {
            if (index == device.HssType()) {
                batlink = "LR3";
                }
            }

        ! Text zusammensetzen
        text = text # "- " # item.Name() # " vom Typ " # batlink # " \r\n";

        ! Counter erhöhen (Anzahl leerer Batterien)
        counter = counter + 1;
        }
    }

! Mind. eine leere Batterie gefunden?
if ( counter > 0 ) {
    ! Mail-Text zusammensetzen
    string Nachricht;
    string sDate = system.Date("%d.%m.%Y");
    Nachricht = " \r\n Prüfung des Ladestandes der Batterien vom " # sDate # ". \r\n";
    Nachricht = Nachricht # "\r\n Der Ladezustand folgender Batterien ist niedrig: \r\n" # text;
    Nachricht = Nachricht # "\r\n Bitte tauschen Sie die Batterien zeitnah aus. ";

    ! Nachricht in Variable füllen und E-Mail absenden
    !--------------------------------------------------
    dom.GetObject("Mailtext").State(Nachricht);

    dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("/etc/config/addons/email/email Batteriemeldung");
    dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
    }
Die komplette Batteriemeldung wird dann an die Systemvariable "Mailtext" (string) gegegeben. Das Email Addon übernimmt den "Mailtext" und verschickt über das Template Batteriemeldung die Mail.
Bildschirmfoto 2013-01-20 um 19.15.56.jpg
EMail Addon
Im TCL Bereich des Addons steht

Code: Alles auswählen

load tclrega.so
array set werte [rega_script {
var emailtext_inhalt;
emailtext_inhalt = dom.GetObject("Mailtext").Value();
}]
set emailtext [encoding convertfrom utf-8 $werte(emailtext_inhalt)] 
Die Variable Mailtext / Emailtext läßt sich so auch für andere Nachrichten der CCU nutzen. Die Links zum Batteriekauf habe ich gekürzt.

Viele Grüße
Pix
150 Kanäle in 75 Geräten und 103 CUxD-Kanäle in 25 CUxD-Geräten (HomeMatic, FS20), CCU1 FW1.519, AddOns: CUxD 1.0, dropbear, E-Mail 1.2, ftp_server und regaWatchdog.
Logik und Visualisierung mit ioBroker auf Mac OS X Node.js. Eingebundene Systeme: Sonos, Rademacher Homepilot, Roomba, Network-OWL. Danke für das Homematic-Inventur-Skript von EnergyStar

WAdler 68
Beiträge: 1431
Registriert: 09.11.2008, 16:29
Hat sich bedankt: 2 Mal

Re: Sytem.exc durch CuxD ersetzen

Beitrag von WAdler 68 » 20.01.2013, 21:04

Ich gebe zu, ich lese mir jetzt nicht alles hier durch und sehe nur, das du eine Ausgabe auf der HM über Cux haben möchstest. Das du das nötige Plugin geladen hast, setze ich vorraus und dann geht es so:
string url=dom.GetObject("DCC_Text");
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("sh /etc/config/addons/lcd_msg/display_msg.sh '"#url.Value()#"'");

DCC_Text ist eine Text HM Variable in die alles das angezeigt werden soll rein kommt.

Tom
Beiträge: 10
Registriert: 21.05.2010, 12:36

Re: Sytem.exc durch CuxD ersetzen

Beitrag von Tom » 20.02.2013, 22:59

Kann mir jemand von Euch einen Hinweis geben, ich habe bisher keine Lösung meines Problemes finden können, ich nutze ein Script aus dem Forum als Heizungs-Watchdog:

! FBHz Monitor
real lastseen = 0.0 + system.Date(dom.GetObject("FBHz-WATCHDOG").Variable()).ToTime().ToInteger();
real now = 0.0 + system.Date("%F %T").ToTime().ToInteger();
real diff = (now - lastseen);
if ( diff > 120 ) {
string text = "Die Heizungssteuerung hat für " # diff # " Sekunden keine Aktion ausgeführt, bitte prüfen!";
dom.GetObject("CUxD.CUX2801111:1.CMD_EXEC").State("/etc/config/addons/email/email 07 '"+text+"'");
}

Wenn ich das so ausführe, versendet mir das Mail-Addon auch brav eine Mail, jedoch wird weder der Text noch die Variable
in die Mail übernommen...

pix
Beiträge: 608
Registriert: 23.01.2012, 15:40
Danksagung erhalten: 1 Mal

Re: Sytem.exc durch CuxD ersetzen

Beitrag von pix » 21.02.2013, 00:00

Hallo Tom,

auf die Schnelle würd ich sagen:
Die Übergabe der Variable text im Mail Template scheint nicht zu funktionieren wie beim display msg Addon. Versuch mal, "text" in eine Systemvariable zu schreiben (hab das weiter oben schon mal beschrieben). Diese kann dann im TCL Bereich des Mail Addon abgefragt werden.

Gruß
Pix
150 Kanäle in 75 Geräten und 103 CUxD-Kanäle in 25 CUxD-Geräten (HomeMatic, FS20), CCU1 FW1.519, AddOns: CUxD 1.0, dropbear, E-Mail 1.2, ftp_server und regaWatchdog.
Logik und Visualisierung mit ioBroker auf Mac OS X Node.js. Eingebundene Systeme: Sonos, Rademacher Homepilot, Roomba, Network-OWL. Danke für das Homematic-Inventur-Skript von EnergyStar

Antworten

Zurück zu „CUxD“