Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. the-masterplan

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Profile
    • Following 0
    • Followers 0
    • Topics 1
    • Posts 54
    • Best 8
    • Groups 1

    the-masterplan

    @the-masterplan

    Starter

    8
    Reputation
    22
    Profile views
    54
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    the-masterplan Follow
    Starter

    Best posts made by the-masterplan

    • RE: [Showcase] Jarvis - just another remarkable vis

      Ich habe nun endlich auch mal ein paar Tabs fertig 😎
      Macht schon Spaß wie einfach und intuitiv das alles so geht. Nur für Sonos musste ich noch etwas in VIS basteln.

      Übersicht.png Screenshot 2021-03-21 235405.png Screenshot 2021-03-21 234917.png Musik.png Licht.png

      posted in Visualisierung
      the-masterplan
      the-masterplan
    • RE: jarvis v3.0.0 - just another remarkable vis

      @joshude

      Mit DisplayImage hatte ich es unter v2 nicht hinbekommen. Nur mit CustomHTML., was unter v3 jetzt StateHTML heißt. Ich hatte das einmal hier beschrieben für v2:


      @maximilian-garbe said in [Showcase] Jarvis - just another remarkable vis:

      @hansi1234

      Einfach einen Zeichenketten-Datenpunkt anlegen und folgenden Code verwenden:

      <html>
      <head>
      <meta charset=utf-8 />
      <title>Your title</title>
        <link href="https://unpkg.com/video.js/dist/video-js.css" rel="stylesheet">
        <script src="https://unpkg.com/video.js/dist/video.js"></script>
        <script src="https://unpkg.com/@videojs/http-streaming/dist/videojs-http-streaming.js"></script>
         
      </head>
      <body>
        <video height="500" id="Hier_Beliebige_Bezeichnung_eintragen" class="video-js vjs-fluid vjs-default-skin" controls preload="auto"
        data-setup='{}'>
          <source src="Hier_Link_vom_Stream_eintragen" type="application/x-mpegURL">
        </video>
        
      <script>
      var player = videojs('my_video_1');
      player.play();
      </script>
        
      </body>
      </html>
      

      Dort dann unter src und id die EInträge anpassen und im Custom-HTML Widget in Jarvis den Datenpunkt auswählen. Ist fix gemacht.

      Bei mir sind es Netatmo-Kameras, die einen m3u8-Stream haben. Müsstest halt gucken, ob das dann auch mit deinen Kameras und dem von diesen verwendeten Format funktioniert.

      posted in Tester
      the-masterplan
      the-masterplan
    • RE: Jarvis erkennt shelly 2.5 nur als steckdose

      @zefau
      Vielen Dank für die schnelle Rückmeldung. Habe es gleich mal installiert und getestet. Für meine Rollladen hat es geklappt. für die Lampen leider nicht. Stehlampe und Deckenlampe waren wohl bei den Keywords nicht dabei 😉 Ich habe die Geräte in enums der Gruppe enum.functions.light zugeordnet. Kann man das vielleicht irgendwie auslesen?

      posted in Visualisierung
      the-masterplan
      the-masterplan
    • RE: jarvis v2.2.0 - just another remarkable vis

      @zefau said in jarvis v2.1.0 - just another remarkable vis:

      @maximilian-garbe sagte in jarvis v2.1.0 - just another remarkable vis:

      Nevermind ich habe es hinbekommen. Sorry

      Sag uns gerne, wie du es eingestellt hast, dann kann ich es im FAQ aufnehmen.

      BROLL.JPG

      Es war tatsächlich recht einfach. Und zwar habe ich für den LevelBody die Schrittweite auf 0.1 gestellt. zusammen mit {"min":1,"max":0} in den Datenpunkteigenschaften und Anpassung der Grenzen für das Icon bin ich soweit von der Funktion her sehr zufrieden und auch der LevelBody tut was er soll. Einzig die Anzeige des aktuellen Öffnungslevels im Zahlenformat geht aktuell nicht, da dieses ja nur von 0 bis 1 geht und ich es Jarvis nicht in eine Prozentzahl umwandeln kann. Somit wird in Jarvis bei geschlossen 1% angezeigt und bei geöffnet 0%. Aber aktuell kann ich auch auf die Anzeige verzichten.

      Ich hatte zunächst angefangen über den Alias- bzw. Devices-Adapter einen Klon zu generieren, der die Werte umrechnet. Das ist mir allerdings deutlich zu viel Aufwand für alle Rollläden. Da warte ich lieber bis es eine Möglichkeit zur Umrechnung oder Formatierung in Jarvis gibt 😉
      Wie gesagt geht es hier um BROLL eingebunden über den AccessPoint von Homematic IP.

      Ich habe es tatsächlich auch heute hinbekommen die Livestreams von meiner Netatmo Presence in Jarvis einzubinden. Grandios, dass das geht! Ich stehe noch ganz am Anfang und bin gespannt was noch so alles geht 🙂

      posted in Tester
      the-masterplan
      the-masterplan
    • RE: [Showcase] Jarvis - just another remarkable vis

      @hansi1234

      Einfach einen Zeichenketten-Datenpunkt anlegen und folgenden Code verwenden:

      <html>
      <head>
      <meta charset=utf-8 />
      <title>Your title</title>
        <link href="https://unpkg.com/video.js/dist/video-js.css" rel="stylesheet">
        <script src="https://unpkg.com/video.js/dist/video.js"></script>
        <script src="https://unpkg.com/@videojs/http-streaming/dist/videojs-http-streaming.js"></script>
         
      </head>
      <body>
        <video height="500" id="Hier_Beliebige_Bezeichnung_eintragen" class="video-js vjs-fluid vjs-default-skin" controls preload="auto"
        data-setup='{}'>
          <source src="Hier_Link_vom_Stream_eintragen" type="application/x-mpegURL">
        </video>
        
      <script>
      var player = videojs('my_video_1');
      player.play();
      </script>
        
      </body>
      </html>
      

      Dort dann unter src und id die EInträge anpassen und im Custom-HTML Widget in Jarvis den Datenpunkt auswählen. Ist fix gemacht.

      Bei mir sind es Netatmo-Kameras, die einen m3u8-Stream haben. Müsstest halt gucken, ob das dann auch mit deinen Kameras und dem von diesen verwendeten Format funktioniert.

      posted in Visualisierung
      the-masterplan
      the-masterplan
    • RE: jarvis v2.2.0 - just another remarkable vis

      @schaxxe said in jarvis v2.1.0 - just another remarkable vis:

      Entweder hab ich es überlesen oder nicht gefunden: Gibt es einen Trick, wie man Jarvis beibringen kann iFrames oder auch das Wetter auf die Ganze Breite eines iPads anzuzeigen? Bei mir wird das immer gequtescht und ich verliere Platz...Beim Wetter könnte ich auf Vollbild gehen, dann kann ich aber aufgrund des DarkMode nix mehr lesen.
      Bei meiner Stauansicht von Google Maps sehe ich auch nur ein kleines Fenster, das vielleicht 25% des Bildschirms nutzt..Wetter.jpg
      Maps.jpg

      Ich habe jetzt auch eine Zeit lang mit der vernünftigen Einbindung von Google-Maps-Routen gehadert, habe es jetzt aber hinbekommen. Hatte es zunächst über iFrame eingebunden, aber dann wurde es wie bei dir nur in einem kleinen Mini-Streifen angezeigt. Dabei waren auch teilweise die Zeiten nicht zu sehen. Dann habe ich es über Custom-HTML versucht mit einem Datenpunkt, der den iframe aus google-maps enthält. Damit war dann die Anzeige super, aber bei Custom-HTML kann man leider keinen automatischen Refresh einstellen und somit musste man den Browser immer Refreshen, um die aktuellen Verkehrsdaten zu bekommen. Dann habe ich es noch einmal mit dem iframe probiert und alle möglichen Kombinationen ausprobiert und nun funktioniert es endlich wie ich es wollte inklusive Zoomen etc.:
      Dazu muss man unter Mindesthöhe eine feste Pixel-Anzahl eintragen. Die relative Festlegung der Höhe mit vh funktioniert hier irgendwie nicht und es wird immer nur dieser schmale Streifen einblendet, egal wie hoch das Widget selbst auch ist:
      Unbenannt2.JPG
      So sieht das Ganze nun aus:
      Unbenannt.png
      Vielleicht hilft es ja jemandem, der wie ich fast dran verzewifelt wäre 🙂

      posted in Tester
      the-masterplan
      the-masterplan
    • RE: jarvis v3.0.0 - just another remarkable vis

      @joshude
      Autoplay geht auch. Dafür dann einmal den player um {autoplay: 'any'} ergänzen:

      var player = videojs('Stellplatz', {autoplay: 'any'});
      

      Wichtig ist dabei, dass der Name des Videos im HTML-Body mit dem im Video übereinstimmt:

      <video height="500" id="Stellplatz" class="video-js vjs-fluid vjs-default-skin" controls preload="auto"
        data-setup='{}'>
      

      In meinem Fall also Stellplatz

      posted in Tester
      the-masterplan
      the-masterplan
    • RE: jarvis v3.0.0 - just another remarkable vis

      @mcu
      Besten Dank! (Generell auch für deine super Unterstützung hier)
      Eine weitere Frage ist gerade noch aufgekommen:
      Ich wollte in meiner zweiten Instanz eine Ansicht für ein vertikal aufgehängtes Tablet erstellen. Leider kriege ich auf dem Tablet in vertikaler Ausrichtung die Widgets immer in zwei Spalten angezeigt, obwohl die Widgets im Layout auf die komplette Seitenbreite definiert sind. Instanz ist komplett frisch und ich habe keine Seiteneinstellungen angepasst. Was mache ich falsch?
      Screenshots:


      acc4f006-eb56-4802-ab6e-36401626ec77-image.png
      cbf9c5f6-127c-4e8b-9d9f-f1b4775b3095-image.png

      posted in Tester
      the-masterplan
      the-masterplan

    Latest posts made by the-masterplan

    • RE: jarvis v3.0.0 - just another remarkable vis

      @MCU

      Das hat leider nicht geholfen. Fehlermeldungen sind weiterhin die gleichen.

      posted in Tester
      the-masterplan
      the-masterplan
    • RE: jarvis v3.0.0 - just another remarkable vis

      Habe gerade meine gesamte iOBroker Installation neu aufgesetzt und bin vom raspberry auf einen proxmox lxc mit Ubuntu umgezogen. Hatte gehofft, dass mit einer frischen Installation einige Fehler der Vergangenheit angehören. Bei der alten Installation wie auch bei der neuen habe ich folgende Fehler in der Konsole:
      e6d5ebe1-574c-42d7-83d0-1fe64c85a39b-image.png
      Diese Fehler kommen auch bei einer frischen Instanz, direkt wenn ich das erste mal auf die Seite gehe.
      Wenn ich mir z.B. den woff2 Font in der Konsole anschaue, dann sieht das ganze so aus:

      98eec676-7a5f-439c-99a0-b9ec9c4323ac-image.png

      Hat jemand eine Idee woran das liegt und was ich dagegen tun kann?

      posted in Tester
      the-masterplan
      the-masterplan
    • RE: jarvis v3.0.0 - just another remarkable vis

      Bei mir aktualisiert sich sowohl das Wetter- als auch das Kalender Widget nicht dynamisch, sondern erst, wenn die Seite im Browser komplett neu geladen wird. Dies führt dazu, dass an meinem Tablet an der Wand häufig 2 Tage alte Termine und das Wetter von vorgestern angezeigt werden. Gibt es eine Möglichkeit die so zu konfigurieren, dass diese genau wie das DateTime Widget dynamisch aktualisiert werden auch wenn ich die Seite nicht Reloade? Hatte das Problem auch mal mit dem Datetime Widget, dass dort die Uhrzeit festhing. Da hatte dann ein Löschen des Widget und das Erstellen eines neuen Widgets geholfen. Beim Wetter und beim Kalender Widget war das aber nun leider nicht die Lösung. Auch eine Auto Reload im Fully Browser schafft irgendwie keine Abhilfe. Erst wenn ich dort durch die "nach unten ziehen" Geste einen Refresh der Seite mache werden auch die Widgets aktualisiert

      posted in Tester
      the-masterplan
      the-masterplan
    • RE: Über einen Datenpunkt aus API lesen & an API schreiben?

      @paul53
      Vielen Dank erstmal für deine ausführliche Antwort und deine Mühe. Das hat mir sehr geholfen und ich verstehe jetzt deutlich besser die Triggerfunktion.

      @paul53 said in Über einen Datenpunkt aus API lesen & an API schreiben?:

      Die Abfragen sind überflüssig: Aktualisiere die 8 Datenpunkte alle 10 s.

      So hatte ich es tatsächlich auch die ganze Zeit. Die Abfragen waren zuletzt ein sehr verzweifelter Versuch meine Probleme in den Griff zu kriegen

      Anstelle des RegExp verwende einzelne Trigger. Beispiel:

      on({id: '0_userdata.0.Klimaanlagen.Gästezimmer.Soll-Temperatur', change: 'ne', fromNe: 'system.adapter.javascript.0'}, function(dp) {
      

      So habe ich es nun umgesetzt und funktioniert gefühlt zuverlässiger. Wollte ich schon länger machen, aber war zu faul ^^

      verhindert Triggern, wenn die Quelle ein Skript ist.

      Der Trigger soll auch über Skripte ausgelöst werden. Daher habe ich das fromNE: weggelassen

      Worin unterscheiden sich die Datenpunkte?

      • "0_userdata.0.Klimaanlagen.Schlafzimmer.Switch"
      • "0_userdata.0.Klimaanlagen.Schlafzimmer.Automatisch_An"
      • "0_userdata.0.Klimaanlagen.Schlafzimmer.Automatisch_aus"

      Hatte mit automatisch an und automatisch aus versucht eine Logik zu bauen, um zu erkennen, ob die Klimaanlagen manuell über die Fernbedienung oder die vis bedient wurden. In diesem Fall sollen die Anlagen nämlich nicht mehr automatisch an oder ausgehen.

      Eine Hysterese von 100 W ist viel zu klein. Sie muss größer sein als die Leistungsaufnahme des leistungsstärksten Gerätes, sonst wird im Grenzbereich alle 2 Minuten ein- und ausgeschaltet.

      "kurzfristig_Mittelwert_Stromeinspeisung/-Bezug" ist über eine Minute gemittelt und "Mittelwert_Stromeinspeisung/-Bezug" ist über 10 Minuten gemittelt. Dadurch waren es nicht ganz alle 2 Minuten, aber je nach Wolkengrad schon alle 10 Minuten. ich habe das mal ein wenig erhöht.

      @paul53 said in Über einen Datenpunkt aus API lesen & an API schreiben?:

      @maximilian-garbe sagte: bei einer Änderung der Datenpunkte diese wieder an die Klimaanlage geschickt werden, um die Anlage z.B. anzuschalten oder auszuschalten:

      Ich würde das Senden des Kommandos in eine Funktion sendCmd(cmd) packen. Das NPM-Modul "follow-redirects" kenne ich nicht und habe mich deshalb an Dein Skript gehalten.

      Genauso habe ich es jetzt umgesetzt:

      var https = require('follow-redirects').https;
      
      function sendStatetoAPI(cmd) {
         var options = {
             'method': 'POST',
             'hostname': 'api.smartthings.com',
             'path': '/v1/devices/xxx/commands',
             'headers': {
                 'Authorization': 'Bearer xxx',
                 'Content-Type': 'application/json'
             },
             'maxRedirects': 20
         };
      
         var req = https.request(options, function (res) {
             var chunks = [];
      
             res.on("data", function (chunk) {
                 chunks.push(chunk);
             });
      
             res.on("end", function (chunk) {
                 var body = Buffer.concat(chunks);
             });
      
             res.on("error", function (error) {
                 console.error(error);
             });
         });
         let cmds = {commands: [cmd]};
         req.write(JSON.stringify(cmds));
         req.end();
      
      }
      
      on({ id: '0_userdata.0.Klimaanlagen.Gästezimmer.Zusatz-Modus_(Windfree)', change: 'ne', ack: false}, function (Zusatzmodus) {
         var postData = {
                     "component": "main",
                     "capability": "custom.airConditionerOptionalMode",
                     "command": "setAcOptionalMode",
                     "arguments": [
                         Zusatzmodus.state.val
                     ]
         };
         sendStatetoAPI(postData)
      });
      
      on({ id: '0_userdata.0.Klimaanlagen.Gästezimmer.Gebläse-Oszillation', change: 'ne', ack: false}, function (Oszillation) {
         var postData = {
                     "component": "main",
                     "capability": "fanOscillationMode",
                     "command": "setFanOscillationMode",
                     "arguments": [
                         Oszillation.state.val
                     ]
         };
         sendStatetoAPI(postData)
      });
      
      on({ id: '0_userdata.0.Klimaanlagen.Gästezimmer.Gebläsegeschwindigkeit', change: 'ne', ack: false}, function (VentSpeed) {
         var postData = {
                     "component": "main",
                     "capability": "airConditionerFanMode",
                     "command": "setFanMode",
                     "arguments": [
                         VentSpeed.state.val
                     ]
         };
         sendStatetoAPI(postData)
      });
      
      on({ id: '0_userdata.0.Klimaanlagen.Gästezimmer.Modus', change: 'ne', ack: false}, function (Modus) {
         var postData = {
                     "component": "main",
                     "capability": "airConditionerMode",
                     "command": "setAirConditionerMode",
                     "arguments": [
                         Modus.state.val
                     ]
         };
         sendStatetoAPI(postData)
      });
      
      on({ id: '0_userdata.0.Klimaanlagen.Gästezimmer.Soll-Temperatur', change: 'ne', ack: false}, function (SollTemp) {
         var postData = {
                     "component": "main",
                     "capability": "thermostatCoolingSetpoint",
                     "command": "setCoolingSetpoint",
                     "arguments": [
                         SollTemp.state.val
                     ]
         };
         sendStatetoAPI(postData)
      });
      
      on({ id: '0_userdata.0.Klimaanlagen.Gästezimmer.Switch', change: 'ne', ack: false}, function (Switch) {
         var postData = {
                     "component": "main",
                     "capability": "switch",
                     "command": Switch.state.val,
                     "arguments": [
                     ]
         };
         sendStatetoAPI(postData)
      });
      

      var fs = require('fs'); // wofür?

      Das war ein Relikt 😉

      on({id: '0_userdata.0.Klimaanlagen.Gästezimmer.Switch', change: 'ne', ack: false}, function (dp) {
          sendCmd({
              component: "main",
              capability: "switch",
              command: "switch",
              arguments: [dp.state.val ? 'on' : 'off']  // boolean --> string
          });
      });
      

      Muss hier nicht auch der Wert "on" bzw. "off" in arguments[0] übergeben werden?

      Das ist so eine Eigenart der Smartthings API. Für einige Funktionen wird der Value an Command übergeben wie bei switch und bei anderen kommt der in die Argumente. Nicht wirklich eingängig leider. Das Displaylicht kann man zum Beispiel nur per Befehl ein und ausschalten. Es gibt aber keine Möglichkeit den aktuellen Status des Displaylichts abzufragen.

      Hier noch einmal der Vollständigkeit halber mein mit deinen Tipps optimiertes Skript zum
      Automatisch Ein- und Ausschalten:

      on({ id: "0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.kurzfristig_Mittelwert_Stromeinspeisung/-Bezug", change: 'ne' }, function (kurzfristig_Mittelwert_Stromeinspeisung) {
         if (compareTime("09:00", "null", ">") && (new Date().getMonth() + 1) >= 4 && (new Date().getMonth() + 1) <= 9) {
             if (getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Mittelwert_Stromeinspeisung/-bezug").val >= 200 && kurzfristig_Mittelwert_Stromeinspeisung.state.val >= 500) {
                 console.log('Genug Strom wird eingespeist');
                 if (getState("0_userdata.0.Klimaanlagen.Schlafzimmer.Switch").ack && getState("0_userdata.0.Klimaanlagen.Schlafzimmer.Switch").val == 'off' && getState("0_userdata.0.Klimaanlagen.Schlafzimmer.Temperatur").val >= 19 && getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Automatikmodus_Schlafzimmer").val == true) {
                     setState("0_userdata.0.Klimaanlagen.Schlafzimmer.Switch_AutoState", 'on');
                     setState("0_userdata.0.Klimaanlagen.Schlafzimmer.Switch"/*Switch*/, 'on');
                     setState("0_userdata.0.Klimaanlagen.Schlafzimmer.Modus"/*Modus*/, 'cool');
                     setState("0_userdata.0.Klimaanlagen.Schlafzimmer.Soll-Temperatur"/*Soll-Temperatur*/, 16);
                     console.log('Klima Schlafzimmer an');
                 } else if (getState("0_userdata.0.Klimaanlagen.Kinderzimmer.Switch").ack && getState("0_userdata.0.Klimaanlagen.Kinderzimmer.Automatisch_aus").val == true && getState("0_userdata.0.Klimaanlagen.Kinderzimmer.Switch").val == 'off' && getState("0_userdata.0.Klimaanlagen.Kinderzimmer.Temperatur").val >= 19 && getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Automatikmodus_Kinderzimmer").val == true) {
                     setState("0_userdata.0.Klimaanlagen.Kinderzimmer.Switch_AutoState", 'on');
                     setState("0_userdata.0.Klimaanlagen.Kinderzimmer.Switch"/*Switch*/, 'on');
                     setState("0_userdata.0.Klimaanlagen.Kinderzimmer.Modus"/*Modus*/, 'cool');
                     setState("0_userdata.0.Klimaanlagen.Kinderzimmer.Soll-Temperatur"/*Soll-Temperatur*/, 16);
                     console.log('Klima Kinderzimmer an');
                 } else if (getState("0_userdata.0.Klimaanlagen.Gästezimmer.Switch").ack && getState("0_userdata.0.Klimaanlagen.Gästezimmer.Automatisch_aus").val == true && getState("0_userdata.0.Klimaanlagen.Gästezimmer.Switch").val == 'off' && getState("0_userdata.0.Klimaanlagen.Gästezimmer.Temperatur").val >= 19 && getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Automatikmodus_Gästezimmer").val == true) {
                     setState("0_userdata.0.Klimaanlagen.Gästezimmer.Switch_AutoState", 'on');
                     setState("0_userdata.0.Klimaanlagen.Gästezimmer.Switch"/*Switch*/, 'on');
                     setState("0_userdata.0.Klimaanlagen.Gästezimmer.Modus"/*Modus*/, 'cool');
                     setState("0_userdata.0.Klimaanlagen.Gästezimmer.Soll-Temperatur"/*Soll-Temperatur*/, 16);
                     console.log('Klima Gästezimmer an');
                 }
             } else if (getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Mittelwert_Stromeinspeisung/-bezug").val <= -200 && kurzfristig_Mittelwert_Stromeinspeisung.state.val <= -500) {
                 if (getState("0_userdata.0.Klimaanlagen.Gästezimmer.Switch").ack && getState("0_userdata.0.Klimaanlagen.Gästezimmer.Switch").val == 'on' && getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Automatikmodus_Gästezimmer").val == true) {
                     setState("0_userdata.0.Klimaanlagen.Gästezimmer.Switch_AutoState"/*Switch*/, 'off');
                     setState("0_userdata.0.Klimaanlagen.Gästezimmer.Switch"/*Switch*/, 'off');
                     console.log('Klima Gästezimmer aus');
                 } else if (getState("0_userdata.0.Klimaanlagen.Kinderzimmer.Switch").ack && getState("0_userdata.0.Klimaanlagen.Kinderzimmer.Switch").val == 'on' && getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Automatikmodus_Kinderzimmer").val == true) {
                     setState("0_userdata.0.Klimaanlagen.Kinderzimmer.Switch_AutoState"/*Switch*/, 'off');
                     setState("0_userdata.0.Klimaanlagen.Kinderzimmer.Switch"/*Switch*/, 'off');
                     console.log('Klima Kinderzimmer aus');
                 } else if (getState("0_userdata.0.Klimaanlagen.Schlafzimmer.Switch").ack && getState("0_userdata.0.Klimaanlagen.Schlafzimmer.Switch").val == 'on' && getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Automatikmodus_Schlafzimmer").val == true) {
                     setState("0_userdata.0.Klimaanlagen.Schlafzimmer.Switch_AutoState"/*Switch*/, 'off');
                     setState("0_userdata.0.Klimaanlagen.Schlafzimmer.Switch"/*Switch*/, 'off');
                     console.log('Klima Schlafzimmer aus');
                 }
                 //console.log('Alle Klimaanlagen aus');
             } else {
         }
         }
      

      Nochmal besten Dank!

      Jetzt muss nur die Sonne wieder scheinen, damit ich die angepassten Skripte auch mal testen kann 😉

      posted in JavaScript
      the-masterplan
      the-masterplan
    • Über einen Datenpunkt aus API lesen & an API schreiben?

      Hallo zusammen,

      Ich hänge irgendwie fest und komme nicht mehr weiter. Ich frage mit folgendem Script über die Smarthings API von Samsung den Status meiner Klimaanlage ab und schreibe ihn in Datenpunkte:

      schedule('*/10 * * * * *',function(){
      	var request = require("request")
      	var settings = {
      	  "url": "https://api.smartthings.com/v1/devices/XXX/status",
      	  "method": "GET",
      	  "timeout": 0,
      	  "headers": {
      		"Authorization": "Bearer XXX"
      	  }
      	};
      	request(settings, function(error, response, body){        
      		var jsonresult = JSON.parse(body);
      		var maincomp = jsonresult.components.main
              if (getstate('0_userdata.0.Klimaanlagen.Gästezimmer.Temperatur') != maincomp.temperatureMeasurement.temperature.value || ! getState('0_userdata.0.Klimaanlagen.Gästezimmer.Temperatur').ack) {
                  setState('0_userdata.0.Klimaanlagen.Gästezimmer.Temperatur', maincomp.temperatureMeasurement.temperature.value, true);
              }
      		if (getState('0_userdata.0.Klimaanlagen.Gästezimmer.relative_Luftfeuchtigkeit') != maincomp.relativeHumidityMeasurement.humidity.value || ! getState('0_userdata.0.Klimaanlagen.Gästezimmer.relative_Luftfeuchtigkeit').ack) {
      		    setState('0_userdata.0.Klimaanlagen.Gästezimmer.relative_Luftfeuchtigkeit', maincomp.relativeHumidityMeasurement.humidity.value, true);
              }
              if (getState('0_userdata.0.Klimaanlagen.Gästezimmer.Modus') != maincomp.airConditionerMode.airConditionerMode.value || ! getState('0_userdata.0.Klimaanlagen.Gästezimmer.Modus').ack) {
                  setState('0_userdata.0.Klimaanlagen.Gästezimmer.Modus', maincomp.airConditionerMode.airConditionerMode.value, true);
              }
              if (getState('0_userdata.0.Klimaanlagen.Gästezimmer.Soll-Temperatur') != maincomp.thermostatCoolingSetpoint.coolingSetpoint.value || ! getState('0_userdata.0.Klimaanlagen.Gästezimmer.Soll-Temperatur').ack) {
                  setState('0_userdata.0.Klimaanlagen.Gästezimmer.Soll-Temperatur', maincomp.thermostatCoolingSetpoint.coolingSetpoint.value, true);
              }
              if (getState('0_userdata.0.Klimaanlagen.Gästezimmer.Zusatz-Modus_(Windfree)') != maincomp["custom.airConditionerOptionalMode"].acOptionalMode.value || ! getState('0_userdata.0.Klimaanlagen.Gästezimmer.Zusatz-Modus_(Windfree)').ack) {
                  setState('0_userdata.0.Klimaanlagen.Gästezimmer.Zusatz-Modus_(Windfree)', maincomp["custom.airConditionerOptionalMode"].acOptionalMode.value, true);
              }
              if (getState('0_userdata.0.Klimaanlagen.Gästezimmer.Gebläsegeschwindigkeit)') != maincomp.airConditionerFanMode.fanMode.value || ! getState('0_userdata.0.Klimaanlagen.Gästezimmer.Gebläsegeschwindigkeit').ack) {
                  setState('0_userdata.0.Klimaanlagen.Gästezimmer.Gebläsegeschwindigkeit', maincomp.airConditionerFanMode.fanMode.value, true);
              }    
              if (getState('0_userdata.0.Klimaanlagen.Gästezimmer.Gebläse-Oszillation)') != maincomp.fanOscillationMode.fanOscillationMode.value || ! getState('0_userdata.0.Klimaanlagen.Gästezimmer.Gebläse-Oszillation').ack) {
                  setState('0_userdata.0.Klimaanlagen.Gästezimmer.Gebläse-Oszillation', maincomp.fanOscillationMode.fanOscillationMode.value, true);
              }   
              if (getState('0_userdata.0.Klimaanlagen.Gästezimmer.Switch)') != maincomp.switch.switch.value || ! getState('0_userdata.0.Klimaanlagen.Gästezimmer.Switch').ack) {
                  setState('0_userdata.0.Klimaanlagen.Gästezimmer.Switch', maincomp.switch.switch.value, true);
              }   
          });
      });
      

      Auf die gleichen Datenpunkte habe ich in einem zweiten Script einen Trigger gesetzt, sodass bei einer Änderung der Datenpunkte diese wieder an die Klimaanlage geschickt werden, um die Anlage z.B. anzuschalten oder auszuschalten:

      on({id: new RegExp('0_userdata\\.0\\.Klimaanlagen\\.Gästezimmer\\.Gebläse-Oszillation' + "$|" + '0_userdata\\.0\\.Klimaanlagen\\.Gästezimmer\\.Gebläsegeschwindigkeit' + "$|" + '0_userdata\\.0\\.Klimaanlagen\\.Gästezimmer\\.Modus' + "$|" + '0_userdata\\.0\\.Klimaanlagen\\.Gästezimmer\\.Soll-Temperatur' + "$|" + '0_userdata\\.0\\.Klimaanlagen\\.Gästezimmer\\.Switch' + "$|" + '0_userdata\\.0\\.Klimaanlagen\\.Gästezimmer\\.Zusatz-Modus_\\(Windfree\\)' + "$"), change: "ne"}, async function (obj) {
      
      var https = require('follow-redirects').https;
      var fs = require('fs');
      var options = {
       'method': 'POST',
       'hostname': 'api.smartthings.com',
       'path': '/v1/devices/XXX/commands',
       'headers': {
         'Authorization': 'Bearer XXX',
         'Content-Type': 'application/json'
       },
       'maxRedirects': 20
      };
      
      var req = https.request(options, function (res) {
       var chunks = [];
      
       res.on("data", function (chunk) {
         chunks.push(chunk);
       });
      
       res.on("end", function (chunk) {
         var body = Buffer.concat(chunks);
       });
      
       res.on("error", function (error) {
         console.error(error);
       });
      });
      var postData = JSON.stringify({
       "commands": [
         {
           "component": "main",
           "capability": "thermostatCoolingSetpoint",
           "command": "setCoolingSetpoint",
           "arguments": [
             getState("0_userdata.0.Klimaanlagen.Gästezimmer.Soll-Temperatur").val
           ]
         },
          {
           "component": "main",
           "capability": "switch",
           "command": getState("0_userdata.0.Klimaanlagen.Gästezimmer.Switch").val,
           "arguments": [
           ]
         },
              {
               "component": "main",
               "capability": "airConditionerMode",
               "command": "setAirConditionerMode",
               "arguments": [
                    getState("0_userdata.0.Klimaanlagen.Gästezimmer.Modus").val
                 ]
             },
         {
               "component": "main",
               "capability": "airConditionerFanMode",
               "command": "setFanMode",
               "arguments": [
                 getState("0_userdata.0.Klimaanlagen.Gästezimmer.Gebläsegeschwindigkeit").val
               ]
             },
              {
               "component": "main",
               "capability": "custom.airConditionerOptionalMode",
               "command": "setAcOptionalMode",
               "arguments": [
                 getState("0_userdata.0.Klimaanlagen.Gästezimmer.Zusatz-Modus_(Windfree)").val
               ]
             },
              {
               "component": "main",
               "capability": "fanOscillationMode",
               "command": "setFanOscillationMode",
               "arguments": [
                getState("0_userdata.0.Klimaanlagen.Gästezimmer.Gebläse-Oszillation").val
               ]
             }
      
       ]
      });
      
      req.write(postData);
      
      req.end();});
      

      Nun habe ich das Problem, dass wenn ich zufällig in dem Augenblick versuche die Anlage über den Datenpunkt einzuschalten, wenn die Daten von der Anlage gelesen werden, die Anlage nicht angeht und meine Änderung des Datenpunkts einfach überschrieben wird.
      Wie kann ich das so aufsetzen, dass meine Änderung nicht automatisch überschrieben wird sondern tatsächlich an die Anlage geschickt wird? Ist wahrscheinlich eine Anfängerfrage, aber irgendwie konnte ich mir die Lösung nicht ergoogeln. Mache ich da einen kapitalen Denkfehler?

      Ich schalte die Klimaanlage mit einem weiteren Skript an und aus, je nachdem ob die Photovoltaik gerade genug Strom produziert oder nicht. Dabei kommt es immer wieder vor, dass die Anlage nicht korrekt ein oder wieder ausgeschaltet wird. Gerade das "vergessene" Ausschalten könnte aber teuer werden und das würde ich gerne in Zukunft vermeiden. Zur Vollständigkeit hier noch einmal mein Skript zum automatischen an und ausschalten:

      var Intervall;
      
      
      Intervall = setInterval(async function () {
       if (compareTime("09:00", "null", ">") && (new Date().getMonth() + 1) >= 4 && (new Date().getMonth() + 1) <= 9) {
         if (getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Mittelwert_Stromeinspeisung/-bezug").val >= 100 && getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.kurzfristig_Mittelwert_Stromeinspeisung/-Bezug").val >= 100) {
           console.log('Genug Strom wird eingespeist');
           if (getState("0_userdata.0.Klimaanlagen.Schlafzimmer.Automatisch_aus").val == true && getState("0_userdata.0.Klimaanlagen.Schlafzimmer.Switch").val == 'off' && getState("0_userdata.0.Klimaanlagen.Schlafzimmer.Temperatur").val >= 19 && getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Automatikmodus_Schlafzimmer").val == true) {
             setState("0_userdata.0.Klimaanlagen.Schlafzimmer.Switch"/*Switch*/, 'on');
             setState("0_userdata.0.Klimaanlagen.Schlafzimmer.Modus"/*Modus*/, 'cool');
             setState("0_userdata.0.Klimaanlagen.Schlafzimmer.Soll-Temperatur"/*Soll-Temperatur*/, 16);
             setState("0_userdata.0.Klimaanlagen.Schlafzimmer.Automatisch_An", true);
             setState("0_userdata.0.Klimaanlagen.Schlafzimmer.Automatisch_aus", false);
             console.log('Schlafzimmer an');
           } else if (getState("0_userdata.0.Klimaanlagen.Kinderzimmer.Automatisch_aus").val == true && getState("0_userdata.0.Klimaanlagen.Kinderzimmer.Switch").val == 'off' && getState("0_userdata.0.Klimaanlagen.Kinderzimmer.Temperatur").val >= 19 && getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Automatikmodus_Kinderzimmer").val == true) {
             setState("0_userdata.0.Klimaanlagen.Kinderzimmer.Switch"/*Switch*/, 'on');
             setState("0_userdata.0.Klimaanlagen.Kinderzimmer.Modus"/*Modus*/, 'cool');
             setState("0_userdata.0.Klimaanlagen.Kinderzimmer.Soll-Temperatur"/*Soll-Temperatur*/, 16);
             setState("0_userdata.0.Klimaanlagen.Kinderzimmer.Automatisch_An", true);
             setState("0_userdata.0.Klimaanlagen.Kinderzimmer.Automatisch_aus", false);
             console.log('Kinder an');
           } else if (getState("0_userdata.0.Klimaanlagen.Gästezimmer.Automatisch_aus").val == true && getState("0_userdata.0.Klimaanlagen.Gästezimmer.Switch").val == 'off' && getState("0_userdata.0.Klimaanlagen.Gästezimmer.Temperatur").val >= 19 && getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Automatikmodus_Gästezimmer").val == true) {
             setState("0_userdata.0.Klimaanlagen.Gästezimmer.Switch"/*Switch*/, 'on');
             setState("0_userdata.0.Klimaanlagen.Gästezimmer.Modus"/*Modus*/, 'cool');
             setState("0_userdata.0.Klimaanlagen.Gästezimmer.Soll-Temperatur"/*Soll-Temperatur*/, 16);
             setState("0_userdata.0.Klimaanlagen.Gästezimmer.Automatisch_An", true);
             setState("0_userdata.0.Klimaanlagen.Gästezimmer.Automatisch_aus", false);
             console.log('Gäste an');
           }
         } else if (getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Mittelwert_Stromeinspeisung/-bezug").val <= 0 && getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.kurzfristig_Mittelwert_Stromeinspeisung/-Bezug").val <= 0) {
           if (getState("0_userdata.0.Klimaanlagen.Gästezimmer.Automatisch_An").val == true && getState("0_userdata.0.Klimaanlagen.Gästezimmer.Switch").val == 'on' && getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Automatikmodus_Gästezimmer").val == true) {
             setState("0_userdata.0.Klimaanlagen.Gästezimmer.Switch"/*Switch*/, 'off');
             setState("0_userdata.0.Klimaanlagen.Gästezimmer.Automatisch_aus", true);
             setState("0_userdata.0.Klimaanlagen.Gästezimmer.Automatisch_An", false);
             setState("0_userdata.0.Klimaanlagen.Gästezimmer.Switch"/*Switch*/, 'off');
             console.log('Gästezimmer aus');
           } else if (getState("0_userdata.0.Klimaanlagen.Kinderzimmer.Automatisch_An").val == true && getState("0_userdata.0.Klimaanlagen.Kinderzimmer.Switch").val == 'on' && getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Automatikmodus_Kinderzimmer").val == true) {
             setState("0_userdata.0.Klimaanlagen.Kinderzimmer.Switch"/*Switch*/, 'off');
             setState("0_userdata.0.Klimaanlagen.Kinderzimmer.Automatisch_aus", true);
             setState("0_userdata.0.Klimaanlagen.Kinderzimmer.Automatisch_An", false);
             setState("0_userdata.0.Klimaanlagen.Kinderzimmer.Switch"/*Switch*/, 'off');
             console.log('Kinder aus');
           } else if (getState("0_userdata.0.Klimaanlagen.Schlafzimmer.Switch").val == 'on' && getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Automatikmodus_Schlafzimmer").val == true) {
             setState("0_userdata.0.Klimaanlagen.Schlafzimmer.Switch"/*Switch*/, 'off');
             setState("0_userdata.0.Klimaanlagen.Schlafzimmer.Automatisch_aus", true);
             setState("0_userdata.0.Klimaanlagen.Schlafzimmer.Automatisch_An", false);
             setState("0_userdata.0.Klimaanlagen.Schlafzimmer.Switch"/*Switch*/, 'off');
             console.log('Schlafzimmer aus');
           }
           console.log('Alle aus');
         } else {
           console.log('Abwarten');
         }
       }
       console.log(('Schlafzimmer-Klima: ' + String(getState("0_userdata.0.Klimaanlagen.Schlafzimmer.Switch").val)));
       console.log(('Kinderzimmer-Klima: ' + String(getState("0_userdata.0.Klimaanlagen.Kinderzimmer.Switch").val)));
       console.log(('Gästezimmer-Klima: ' + String(getState("0_userdata.0.Klimaanlagen.Gästezimmer.Switch").val)));
       console.log(getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.Mittelwert_Stromeinspeisung/-bezug").val);
       console.log(getState("0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.kurzfristig_Mittelwert_Stromeinspeisung/-Bezug").val);
      }, 120000);
      
      

      Ich bin für jeden Tipp dankbar!

      Beste Grüße

      posted in JavaScript
      the-masterplan
      the-masterplan
    • RE: jarvis v3.0.0 - just another remarkable vis

      @mcu
      Ok habe eben noch ein zweites Mal deine Beschreibung vom Link gelesen und jetzt verstehe ich es. Hatte gerade anscheinend einen Knoten im Hirn. Vielen Dank!

      posted in Tester
      the-masterplan
      the-masterplan
    • RE: jarvis v3.0.0 - just another remarkable vis

      @mcu
      Auflösung liegt bei 1200 Pixel. Die Darstellung im Browser hat aber "nur" 800 Pixel.

      posted in Tester
      the-masterplan
      the-masterplan
    • RE: jarvis v3.0.0 - just another remarkable vis

      @mcu
      Ich muss doch wieder zurück rudern. Habe jetzt das Problem, dass jetzt alles nur noch in einer Spalte angezeigt wird, auch wenn ich zweispaltig haben möchte ^^

      posted in Tester
      the-masterplan
      the-masterplan
    • RE: jarvis v3.0.0 - just another remarkable vis

      @mcu

      Danke dir! das wars. Da wäre ich nie drauf gekommen. Logik ist mir zwar immer noch nicht ganz klar, aber ich habe jetzt den Wert für small von 640 auf 820 gestellt und nun klappt es.

      posted in Tester
      the-masterplan
      the-masterplan
    • RE: jarvis v3.0.0 - just another remarkable vis

      @mcu Ja genau

      posted in Tester
      the-masterplan
      the-masterplan
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo