Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Über einen Datenpunkt aus API lesen & an API schreiben?

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.4k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    982

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.3k

Über einen Datenpunkt aus API lesen & an API schreiben?

Geplant Angeheftet Gesperrt Verschoben JavaScript
5 Beiträge 2 Kommentatoren 498 Aufrufe 1 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • the-masterplanT Offline
    the-masterplanT Offline
    the-masterplan
    schrieb am zuletzt editiert von the-masterplan
    #1

    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

    paul53P 2 Antworten Letzte Antwort
    0
    • the-masterplanT the-masterplan

      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

      paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von paul53
      #2

      @maximilian-garbe sagte: Status meiner Klimaanlage ab und schreibe ihn in Datenpunkte:

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

      schedule('*/10 * * * * *',function(){
         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) { 
             if(!error) {
                 var maincomp = JSON.parse(body).components.main;
                 setState('0_userdata.0.Klimaanlagen.Gästezimmer.Temperatur', maincomp.temperatureMeasurement.temperature.value, true);
                 setState('0_userdata.0.Klimaanlagen.Gästezimmer.relative_Luftfeuchtigkeit', maincomp.relativeHumidityMeasurement.humidity.value, true);
                 setState('0_userdata.0.Klimaanlagen.Gästezimmer.Modus', maincomp.airConditionerMode.airConditionerMode.value, true);
                 setState('0_userdata.0.Klimaanlagen.Gästezimmer.Soll-Temperatur', maincomp.thermostatCoolingSetpoint.coolingSetpoint.value, true);
                 setState('0_userdata.0.Klimaanlagen.Gästezimmer.Zusatz-Modus_(Windfree)', maincomp["custom.airConditionerOptionalMode"].acOptionalMode.value, true);
                 setState('0_userdata.0.Klimaanlagen.Gästezimmer.Gebläsegeschwindigkeit', maincomp.airConditionerFanMode.fanMode.value, true);
                 setState('0_userdata.0.Klimaanlagen.Gästezimmer.Gebläse-Oszillation', maincomp.fanOscillationMode.fanOscillationMode.value, true);
                 setState('0_userdata.0.Klimaanlagen.Gästezimmer.Switch', maincomp.switch.switch.value == 'on', true); // string --> boolean
             } 
         });
      });
      

      @maximilian-garbe sagte in Über einen Datenpunkt aus API lesen & an API schreiben?:

      bei einer Änderung der Datenpunkte diese wieder an die Klimaanlage geschickt werden

      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) {
      

      verhindert Triggern, wenn die Quelle ein Skript ist.

      @maximilian-garbe sagte in Über einen Datenpunkt aus API lesen & an API schreiben?:

      Skript zum automatischen an und ausschalten:

      Hier sollte auf "0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.kurzfristig_Mittelwert_Stromeinspeisung/-Bezug" getriggert werden.
      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"

      Ein Datenpunkt sollte zum Ein-/Ausschalten genügen. Modus und Sollwert werden beim Ein-/Ausschalten nicht verändert.
      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.

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      the-masterplanT 1 Antwort Letzte Antwort
      1
      • the-masterplanT the-masterplan

        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

        paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von paul53
        #3

        @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.

        var https = require('follow-redirects').https;
        var fs = require('fs'); // wofür?
        
        function sendCmd(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();
        }
        


        Zum Ein-/Auschalten kann man das Ack-Flag auswerten, das im ersten Skript gesetzt wird und im Ein-/Ausschaltskript nicht:

        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?

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        1 Antwort Letzte Antwort
        1
        • paul53P paul53

          @maximilian-garbe sagte: Status meiner Klimaanlage ab und schreibe ihn in Datenpunkte:

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

          schedule('*/10 * * * * *',function(){
             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) { 
                 if(!error) {
                     var maincomp = JSON.parse(body).components.main;
                     setState('0_userdata.0.Klimaanlagen.Gästezimmer.Temperatur', maincomp.temperatureMeasurement.temperature.value, true);
                     setState('0_userdata.0.Klimaanlagen.Gästezimmer.relative_Luftfeuchtigkeit', maincomp.relativeHumidityMeasurement.humidity.value, true);
                     setState('0_userdata.0.Klimaanlagen.Gästezimmer.Modus', maincomp.airConditionerMode.airConditionerMode.value, true);
                     setState('0_userdata.0.Klimaanlagen.Gästezimmer.Soll-Temperatur', maincomp.thermostatCoolingSetpoint.coolingSetpoint.value, true);
                     setState('0_userdata.0.Klimaanlagen.Gästezimmer.Zusatz-Modus_(Windfree)', maincomp["custom.airConditionerOptionalMode"].acOptionalMode.value, true);
                     setState('0_userdata.0.Klimaanlagen.Gästezimmer.Gebläsegeschwindigkeit', maincomp.airConditionerFanMode.fanMode.value, true);
                     setState('0_userdata.0.Klimaanlagen.Gästezimmer.Gebläse-Oszillation', maincomp.fanOscillationMode.fanOscillationMode.value, true);
                     setState('0_userdata.0.Klimaanlagen.Gästezimmer.Switch', maincomp.switch.switch.value == 'on', true); // string --> boolean
                 } 
             });
          });
          

          @maximilian-garbe sagte in Über einen Datenpunkt aus API lesen & an API schreiben?:

          bei einer Änderung der Datenpunkte diese wieder an die Klimaanlage geschickt werden

          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) {
          

          verhindert Triggern, wenn die Quelle ein Skript ist.

          @maximilian-garbe sagte in Über einen Datenpunkt aus API lesen & an API schreiben?:

          Skript zum automatischen an und ausschalten:

          Hier sollte auf "0_userdata.0.Klimaanlagen.Automatisierung_Relevante_Daten.kurzfristig_Mittelwert_Stromeinspeisung/-Bezug" getriggert werden.
          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"

          Ein Datenpunkt sollte zum Ein-/Ausschalten genügen. Modus und Sollwert werden beim Ein-/Ausschalten nicht verändert.
          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.

          the-masterplanT Offline
          the-masterplanT Offline
          the-masterplan
          schrieb am zuletzt editiert von
          #4

          @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 ;)

          paul53P 1 Antwort Letzte Antwort
          0
          • the-masterplanT the-masterplan

            @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 ;)

            paul53P Offline
            paul53P Offline
            paul53
            schrieb am zuletzt editiert von
            #5

            @the-masterplan sagte: optimiertes Skript zum Automatisch Ein- und Ausschalten:

            Die Hysterese erscheint mir immer noch zu klein. Du musst bedenken, dass bei Zuschalten eines Klimagerätes die Einspeisung um die Leistungsaufnahme des Gerätes zurück geht. Es soll ja im Grenzbereich der Einspeisung nicht nach kurzer Zeit wieder ausschalten.

            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

            1 Antwort Letzte Antwort
            0
            Antworten
            • In einem neuen Thema antworten
            Anmelden zum Antworten
            • Älteste zuerst
            • Neuste zuerst
            • Meiste Stimmen


            Support us

            ioBroker
            Community Adapters
            Donate

            773

            Online

            32.6k

            Benutzer

            82.2k

            Themen

            1.3m

            Beiträge
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
            ioBroker Community 2014-2025
            logo
            • Anmelden

            • Du hast noch kein Konto? Registrieren

            • Anmelden oder registrieren, um zu suchen
            • Erster Beitrag
              Letzter Beitrag
            0
            • Home
            • Aktuell
            • Tags
            • Ungelesen 0
            • Kategorien
            • Unreplied
            • Beliebt
            • GitHub
            • Docu
            • Hilfe