NEWS

Javascript zur Temperaturüberwachung [gelöst]


  • Hallo zusammen,

    ich möchte mich im Thema "Javascript" etwas fortbilden. Leider bin ich darin überhaupt nicht fit, um das gleich vorneweg zu sagen :=)

    Mein Ziel ist ein kleines Script, mit dem ich mehrere Datenpunkte überwachen kann. Beim über bzw. unterschreiten eines bestimmten Wertes, soll eine Email ausgelöst werden.

    Mein bisheriger Versuch (Code unten) funktioniert zwar, ist allerdings unfertig und etwas buggy. Kann mir jemand ein paar Wervolle Tipps geben? Folgendes möchte ich verändern:

    • Die Email soll mehrzeilig sein
    • Es wird aktuell nur der Datenpunkt "idTemp" überwacht. Ich würde gerne im gleichen Script mehrere Temperaturen prüfen und nicht für jedes ein separates Script erstellen
    • Die Email wird derzeit bei jeder Änderung der Temperatur ausgelöst. Ich hätte dies aber gerne nur bei überschreitung bzw. unterschreitung des Tresholds.
    var idTemp = "synology.0.DiskStationManager.hdd_info.laufwerk_1.temperature";
    var treshold = 36;
    
    on(idTemp, function(dp) { 
        if ( (getState(idTemp).val) >= treshold)
    {
      //Temp über Treshold
         msg = "Temperatur (" + idTemp + ") über Treshold (" + treshold + " °C)! Aktueller Wert: " + (getState(idTemp).val) + " °C";
              sendTo('email.0', msg);
        }
        if ( (getState(idTemp).val) <= treshold)
    {
      //Temp unter Treshold
        msg = "Temperatur (" + idTemp + ") unter Treshold (" + treshold + " °C)! Aktueller Wert: " + (getState(idTemp).val) + " °C";
            sendTo('email.0', msg);
      }      
    });
    

    Im Voraus besten Dank!

    Liebe Grüße
    Tomily


  • @tomily sagte:

    nur bei überschreitung bzw. unterschreitung des Tresholds.

    Mit Hysterese von 0,5 Grad:

    on(idTemp, function(dp) { 
        if (dp.state.val >= treshold && dp.oldState.val < treshold) {
        //Temp über Treshold
        } else if (dp.state.val <= treshold - 0.5 && dp.oldState.val > treshold - 0.5) {
        //Temp unter Treshold - 0,5 K
        }
    });
    

  • Danke für die schnelle Rückmeldung.

    Sehr cool. Das scheint schonmal zu funktionieren. Mails kommen nun wann sie sollen 🙂 Werde das mal weiter beobachten.

    Jetzt würde mich noch brennend interessieren, wie ich das Ganze sinnvoller weiße mit mehreren Werten machen kann, die auf gleiche Weiße überprüft werden sollen.

    Viele Grüße


  • @tomily sagte:

    mit mehreren Werten machen kann, die auf gleiche Weiße überprüft werden sollen.

    Mit dem gleichen Grenzwert ?


  • Ja, das wäre vollkommen ausreichend.

    Am elegantesten wäre es natürlich, wenn man oben die Datenpunkte in Variabeln schreiben könnte, die überwacht werden sollen. Ich habe aber keine Ahnung, wie ich diese dann weiter verarbeiten kann/soll.

    Sorry für die plumpe Fragen, bin wirklich ein Scripting-Anfänger!

    Beispiel:

    var idTemp1 = "synology.0.DiskStationManager.hdd_info.laufwerk_1.temperature";
    var idTemp2 = "synology.0.DiskStationManager.hdd_info.laufwerk_2.temperature";
    var idTemp3 = "synology.0.DiskStationManager.hdd_info.laufwerk_2.temperature";
    

  • @tomily
    Das geht mit einem Array im on().

    on([idTemp1, idTemp2, idTemp3], function(dp) {
    

    Wenn Du die ID an die Mail übergeben willst, dann verwende anstelle von idTemp dp.id oder den Namen dp.common.name. Den Wert enthält dp.state.val.


  • Geil! Danke! Bin begeistert von der schnellen und kompetenten Hilfe.
    Klappt super. Bin trotzdem frech und frage auch noch nach meiner dritten Frage:

    Hast du noch eine Idee, wie ich den Emailinhalt mehrzeilig und mit Betreff gestalten kann?

    Beim ausprobieren ist mir noch folgendes eingefallen:

    Von dp.id kommt nun natürlich "synology.0.DiskStationManager.hdd_info.laufwerk_1.temperature" zurück.
    Ich kann das lesen, da ich weiß was es bedeutet. Schöner wäre aber eine Beschriftung. Könnte ich der Variable auch einen Namen mit geben, der dann in die Email übergeben wird?
    Bespiel:

    var temp1 = "synology.0.DiskStationManager.hdd_info.laufwerk_1.temperature";
    var temp1-label = "HDD1"
    var temp2 = "synology.0.DiskStationManager.hdd_info.laufwerk_2.temperature";
    var temp2-label = "HDD2"
    
    // Beispiel "dp.id.label" .... stimmt natürlich nicht :=()
    msg = "Temperatur (" + dp.id.label + ") über Treshold (" + treshold + " °C)! Aktueller Wert: " + (dp.state.val) + " °C";
    
    

  • @tomily sagte:

    mehrzeilig

    Zeilenschaltung macht man gewöhnlich mit "\n".

    @tomily sagte in Javascript zur Temperaturüberwachung:

    mit Betreff

    sendTo('email.0', {
        subject: 'mein Betreff',
        text:    msg
    });
    

    @tomily sagte in Javascript zur Temperaturüberwachung:

    Könnte ich der Variable auch einen Namen mit geben, der dann in die Email übergeben wird?

    Der Name des Datenpunktes "synology.0.DiskStationManager.hdd_info.laufwerk_1.temperature" kann im Tab "Objekte" beliebig geändert werden, z.B. in "Temperatur HDD1".

    msg = dp.common.name + " über Treshold (" + treshold + " °C)!\nAktueller Wert: " + dp.state.val + " °C";
    
  • Developer

    @tomily sagte in Javascript zur Temperaturüberwachung:

    mehrzeilig

    z.B. mit Backticks, die können auch wunderbar Variablen enthalten:

    const wert = 25;
    const foo = `Dies
    ist
    ein mehrzeiliger
    String!
    Der Wert ist ${wert}.`;
    

    foo enthält den folgenden Text:

    Dies
    ist
    ein mehrzeiliger
    String!
    Der Wert ist 25.
    

  • @paul53

    Da hätte ich auch selbst drauf kommen können. Das funktioniert und wäre eine gute Lösund.
    Leider wird das Feld vom ioBroker-Adapter nach dem neu Laden wieder überschreiben mit einem default.
    Die Anpassung der Namensfelder und das verwenden von dp.common.name wäre super. Bekomme ich den Adapter dazu, das Feld nicht wieder zu überschreiben?

    Dafür ist "\n" perfekt für den Zeilenumbruch.

    @AlCalzone
    Danke auch für deinen Hinweis. Das wirkt als Skripting-Anfänger für mich recht mächtig, werde es aber auch ausprobieren 🙂

    Mercie


  • @tomily sagte:

    Leider wird das Feld vom ioBroker-Adapter nach dem neu Laden wieder überschreiben

    Vom Adapter ioBroker.synology ?
    Dann verwende common.desc (Beschreibung). Oder wird das auch überschrieben ?


  • So ein Mist. Leider wird das Feld genau so auf Default zurück gesetzt wie der Name 😕


  • @tomily sagte:

    Leider wird das Feld genau so auf Default zurück gesetzt wie der Name

    Dann probiere mal native.name.


  • DANKE! Ich danke euch vielmals. Habe viel dazu gelernt und nun funktioniert es genau so wie ich es wollte.
    Den native.name kannte ich noch nicht. Mir war nicht bewusst, dass man dort noch Felder hinzufügen kann. Diese werden nicht überschrieben und können verwendet werden.

    Hier mein Ergebnis:

    var temp1 = "synology.0.DiskStationManager.hdd_info.laufwerk_1.temperature";
    var temp2 = "synology.0.DiskStationManager.hdd_info.laufwerk_2.temperature";
    var temp3 = "synology.1.DiskStationManager.hdd_info.laufwerk_1.temperature";
    var temp4 = "synology.1.DiskStationManager.hdd_info.laufwerk_2.temperature";
    var temp5 = "synology.1.DiskStationManager.hdd_info.laufwerk_3.temperature";
    var temp6 = "synology.1.DiskStationManager.hdd_info.laufwerk_4.temperature";
    
    var threshold = 33;
    
    on([temp1, temp2, temp3, temp4, temp5, temp6], function(dp) {
         if (dp.state.val >= threshold && dp.oldState.val < threshold) {
                //Email Temperatur ÜBER Threshold
                sendTo("email", {
                        subject: ("Temperatur " + dp.native.name + " " + dp.state.val + " °C"),
                        text: dp.native.name + " ÜBER Threshold!\nThreshold: " + threshold + " °C\nAktueller Wert: " + (dp.state.val) + " °C"
                        })
            } else if ( dp.state.val <= threshold - 0.5 && dp.oldState.val > threshold - 0.5) {
                //Email Temperatur UNTER Threshold
                sendTo("email", {
                        subject: ("Temperatur " + dp.native.name + " " + dp.state.val + " °C"),
                        text: dp.native.name + " UNTER Threshold!\nThreshold: " + threshold + " °C\nAktueller Wert: " + (dp.state.val) + " °C"
                        })
            }   
        });
    

  • @tomily sagte:

    Den native.name kannte ich noch nicht.

    Den gibt es normalerweise auch nicht. Wenn aber common immer wieder vollständig überschrieben wird, kann man dahin ausweichen.
    Bitte das Thema in der Überschrift des ersten Beitrags als [gelöst] markieren.


  • Besten Dank und vorab ein schönes Wochenende.

    Kann den Betreff leider nicht mehr ändern. Wie macht Ihr das normal?


  • @tomily sagte:

    Kann den Betreff leider nicht mehr ändern.

    Im ersten Beitrag auf die 3 Punkte rechts unten: Bearbeiten auswählen. Dann die Überschrift editieren.


  • Versteck gefunden 🙂
    Mercie und schönes Wochenende!

Suggested Topics

1.9k
Online

38.4k
Users

43.8k
Topics

612.3k
Posts