Inventer Lüftersteuerung sMove

Hallo,

dies ist mein erster Beitrag und ich bin noch komplett neu im HA Spiel - entschuldigt daher wenn ich mich blöd anstelle.

Ich habe zuhause eine dezentrale Lüftung von inventer. Diese wird gesteuert über den sMove. Diese Steuerung würde ich gerne ins Smarthome integrieren (das war auch der Grund warum ich mich mit HA beschäftige).

Die Steuerung erfolgt via Spannung zwischen 0-10 V.
image

Nun meine Frage:
Kann ich das mit einem Shelly Plus 0-10V Dimmer abbilden?
Und falls ja, kann man dann dennoch manuell den sMove Regler nutzen oder wäre es dann nur noch über den Shelly Dimmer möglich?

Wie gesagt, ich bin blutiger Anfänger und bitte um Nachsicht :see_no_evil:

Hallo,
ich habe dieselben Fragen. :slight_smile:
Haben Sie eine Antwort gefunden, vielleicht bei der Firma inventer.eu nachgefragt, oder haben Sie es versucht?

Seite 12 der ‘Installation instructions sMove’ sieht vielversprechend aus.

Als Alternative würde ich den ‘Shelly Dimmer 0/1-10V PM Gen3’ erwägen (‘Shelly Dimmer 0/1-10V PM Gen3’ Basic wiring diagrams ).

Vielen Dank!

Moin, der Support hat mir blitzschnell geantwortet, ab Seite 9 ist es beschrieben sagte er. Mit meinem Elektriker des Vertrauens nochmal geredet, einfach den Öffner (NC) Kontakt ansteuern.

Der Shelly Dimmer 0/1-10V PM Gen3 funktioniert in Kombination mit dem Inventer sMove mittlerweile sehr gut bei mir. Ich kann bestätigen, dass die manuelle Nutzung des Reglers nicht mehr funktioniert. Ich empfehle, darauf zu achten, dass dieser Shelly einen 240V-Anschluss benötigt. (Bei mir war der sMove zu weit vom 240V/24V-Transformator entfernt, sodass ich eine andere 240V-Quelle suchen musste.)

Es wäre interessant zu wissen, ob die manuelle Nutzung des sMove-Reglers mit anderen Shelly-Geräten (z. B. Shelly Plus 0-10V Dimmer) funktioniert.

Hallo in die Runde, ich klinke mich mal ein, da ich auch meinen sMove smart machen möchte. Das war auch einer der Hauptgründe, weshalb ich nun bei Homeassistant einsteige.

Der Inventer Support hat mir bestätigt, dass das Frontpanel leider nur noch als Anzeige dient, sobald an der Rückseite die Haussteuerung angeschlossen wird. D.h. das Problem wird sich auch mit anderen Dimmern nicht lösen lassen. Daher setze ich auch auf den von @mmm genannten Shelly Dimmer.

Auf einer homeassistant Community-Seite habe ich einen Post von einem Ludwig gefunden, der erklärt, wie man den Shelly Dimmer anschließen und bei HA einarbeiten muss. Ist das zufällig die gleiche Anleitung, der du gefolgt bist?

LG!

Hallo,

Mein Elektriker hat den Anschluss ohne Anleitung vorgenommen.

Der Shelly-Anschluss für den sMove:

Der 240V-Anschluss für den Shelly (ich benutze eine Steckdose in derselben Wand):

Viel Erfolg!

Danke dir! Den Anschluss wird bei mir auch der Elektriker machen. Bei der Integration in HA muss ich dann selbst ran. LG!

Hallo zusammen,
nur beim Lesen der Doku und ohne etwas ausprobiert zu haben, zweifle ich es gerade an, dass man den smove ausschließlich nur noch zur Anzeige nutzen kann. Nach meiner Interpretation müsste man über den Shelly auch einstellen können, dass die Bedienung über das Gerät auch wieder funktioniert. Hat das jemand schon mal ausprobiert?

edit: folgende Annahmen stellten sich als falsch heraus. Siehe unten
Das Ergebnis meiner Recherche:

Ich nehme an, dass die Spannung zwischen den beiden Pins SC1 und SC2 10VDC beträgt (hat jemand einmal die Spannung zwischen SC1 und SC2 gemessen?)
Dann müsste man bei einer Ausgangsspannung am Shelly von 10VDC das Gerät wieder normal bedienen können. Zwischen 0 und 8,5VDC wäre das Gerät ferngesteuert, wie beschrieben.

Kann das jemand bestätigen?

VG

Hallo monstrich,

Ich habe die Spannung zwischen SC1 und SC2 nicht gemessen.

In meinen Shelly Einstellungen habe ich ‘operational mode’ “0-10V” gewählt (die einzige Alternative ist “1-10V”).

Bei 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80% funktioniert alles wie erwartet laut Tabelle.

Jedoch ab 82% bis 100% ändert sich gar nichts. Z.B. wenn ich erst 60% wähle und dann auf 100% erhöhe, dann funktioniert alles immer noch wie bei 60%.

Wenn ich das Shelly ausschalte, dann funktioniert es genauso wie bei 0% (also Funktion ‘Ventilation level 3’ wie in der Tabelle bei 0V).

Vielleicht hat jemand eine Idee wie man den sMove trotzdem zur Bedienung nutzen könnte? Oder vielleicht könnte man es irgendwie als Input nutzen?

Ich habe keine Ahnung von Elektronik: vielleicht gibt es zusätzliche Teile, die bei 0V die Verbindung komplett trennen oder ähnliches?

VG

PS Ich kann die Kombination Shelly 0-10V Dimmer Gen3 und sMove nichtsdestotrotz sehr empfehlen. Ich benutze ein Shelly Script, dass die vorhergesagte Temperatur mit der Temperatur in meiner Wohnung vergleicht und abhängig davon, ob Handys zuhause sind und je nach Uhrzeit den sMove bedient.

:crayon:by HarryP: Zusammenführung Doppelpost (bei Änderungen oder hinzufügen von Inhalten bitte die „Bearbeitungsfunktion“ anstatt „Antworten“ zu nutzen)

Ich habe bei an meinen smove jetzt einmal gespielt und gemessen. Turns out: alle meine Annahmen sind quasi genau umgekehrt :expressionless::grinning:

So habe ich es gemessen:

Tatsächlich sind ja im originalen Zustand sowohl die Steckbrücke als auch die SC Kontakte offen. Und das ist der Normalbetrieb.
@mmm kannst du einmal probieren, eine der 2 Adern zu den Kontakten SC1 oder SC2 einfach auszuklemmen? Das wäre dann ja der Originalzustand.

Wenn das funktioniert, könnte man mit einem zweiten Relais-Shelly einfach die analoge Leitung zu- und abschalten und damit zwischen Fern- und lokaler Steuerung wechseln.

Hi,
Ich habe mir nun den vorgeschlagenen Shelly (Dim 0/1-10V Gen3), sowie einen Shelly 1 mini bestellt und eingebaut. Es funktioniert :slight_smile:

Wird der shelly mini eingeschaltet, wird die Lüftung über den shelly dimmer gesteuert. Wird der mini ausgeschaltet, ist die Steuerung über das Bedienteil wieder möglich. Die Lüfterstufe springt dann auf den letzten manuellen Wert zurück. Ein wenig schade, man kann also nicht mit kurzen analogen Impulsen die Lüfter z.B. im Tagesverlauf verstellen und von der Stufe aus wieder am Bedienteil einstellen.

Falls jemand noch eine schicke Automatisierung hat, bzw. wie der Analogwert am Dimmer über z.B. eine Dropdown Liste ausgewählt wird, würde es mir etwas Probierarbeit sparen :wink:

VG

1 „Gefällt mir“

Das sind super Nachrichten! :slight_smile:

Hier sind meine drei Shelly scripts. Das sind meine ersten Shelly-Skripte. Verbesserungen oder Anregungen sind jederzeit willkommen.

Ein dropdown gibt es als virtual component in Shelly nicht, aber das gibt es bestimmt in Home Assistant o. Ä.

Sie benutzen folgende virtual components:

Shelly script 1 - setInverterAndFloorHeatingSchedule:

let outdoor_temp_threshold = 18;

// Virtual component id ID
let at_home_boolean_component_id = 200;
let outdoor_temp_component_id = 200;
let device_count_component_id = 201;
let outdoor_temp_forecast_component_id = 202;
let indoor_temp_component_id = 203;
let floor_heating_devices = ["192.168.50.xxx", // heating_floor_office1a
"192.168.50.yyy", // heating_floor_bedroom2a
"192.168.50.zzz", // heating_floor_bedroom3
"192.168.50.aaa", // heating_floor_livingroom4
"192.168.50.bbb" // heating_floor_childroom5
];

let i = 0

// Main function
function setInverter() {
  let d = Date();
  let hour = d.getHours();
  let heating_url = "";
  
  if(getDeviceCount()>0){
    print("Devices connected, so assuming that at home.");
    setAtHomeBoolean(true);
  }
  else if (getDeviceCount()==0 & hour >= 10 & hour <= 21){
    print("No devices connected and time between 10:00 and 22:00, so assuming that away.");
    setAtHomeBoolean(false);
  }
  
  if(getAtHomeBoolean()==false){ // Away from home
    // Switch off floor heating
    // Iterate through floor heating devices
    //for (let i = 0; i < floor_heating_devices.length; i ++) {
      heating_url = "http://" + floor_heating_devices[i] + "/rpc/Switch.SetConfig?id=0&config={%22in_mode%22:%22detached%22,%22initial_state%22:%22restore_last%22}";
      print("Switching off floor heating device "+i+": "+heating_url);      
      try{Shelly.call("HTTP.GET", { url: heating_url }, function (result, error_code, error_message) {})}catch(e) {};
      if(i < floor_heating_devices.length-1){i=i+1;}else{i=0} // Only 5 rpc calls per script, so switching only one heating device per script iteration.
    //}
    if(getOutdoorTempForecast()>outdoor_temp_threshold){ // Hot day expected
      // Set inverter
      if(getOutdoorTemp()<getIndoorTemp()){ // Take cold air in
        print("Ventilation level 4 (10%)");
        try{Shelly.call("HTTP.GET", { url: "http://localhost/rpc/light.set?id=0&brightness=10" }, function (result, error_code, error_message) {})}catch(e) {};
      }
      else{ // Keep cold air inside
        print("Heat recovery ventilation level 4 (80%)");
        try{Shelly.call("HTTP.GET", { url: "http://localhost/rpc/light.set?id=0&brightness=80" }, function (result, error_code, error_message) {})}catch(e) {};
      }
    }
    else{ // Cold day expected
      // Set inverter
      if(getOutdoorTemp()<getIndoorTemp()){ // Keep warmth inside
        print("Heat recovery ventilation level 4 (80%)");
        try{Shelly.call("HTTP.GET", { url: "http://localhost/rpc/light.set?id=0&brightness=80" }, function (result, error_code, error_message) {})}catch(e) {};
      }
      else{ // Take warmth inside
        print("Ventilation level 4 (10%)");
        try{Shelly.call("HTTP.GET", { url: "http://localhost/rpc/light.set?id=0&brightness=10" }, function (result, error_code, error_message) {})}catch(e) {};
      }
    }
  }
  else{ // At home
    if(getOutdoorTempForecast()>outdoor_temp_threshold){ // Hot day expected
      // Switch off floor heating
      // Iterate through floor heating devices
      //for (let i = 0; i < floor_heating_devices.length; i ++) {
        heating_url = "http://" + floor_heating_devices[i] + "/rpc/Switch.SetConfig?id=0&config={%22in_mode%22:%22detached%22,%22initial_state%22:%22restore_last%22}";
        print("Switching off floor heating device "+i+": "+heating_url);      
        try{Shelly.call("HTTP.GET", { url: heating_url }, function (result, error_code, error_message) {})}catch(e) {};
        if(i < floor_heating_devices.length-1){i=i+1;}else{i=0} // Only 5 rpc calls per script, so switching only one heating device per script iteration.
      //}
      
      if(hour>=23 | hour < 8){
        print("Ventilation OFF (40%) between 23:00 and 08:00 if at home");
        try{Shelly.call("HTTP.GET", { url: "http://localhost/rpc/light.set?id=0&brightness=40" }, function (result, error_code, error_message) {})}catch(e) {};
      }
      else if(getOutdoorTemp()<getIndoorTemp()){ // Take warmth inside
        print("Ventilation level 1 (30%)");
        try{Shelly.call("HTTP.GET", { url: "http://localhost/rpc/light.set?id=0&brightness=30" }, function (result, error_code, error_message) {})}catch(e) {};
      }
      else{ // Keep cold air inside
        print("Heat recovery ventilation level 1 (50%)");
        try{Shelly.call("HTTP.GET", { url: "http://localhost/rpc/light.set?id=0&brightness=50" }, function (result, error_code, error_message) {})}catch(e) {};
      }
    }
    else{ // Cold day expected
      // Switch on floor heating
      // Iterate through floor heating devices
      //for (let i = 0; i < floor_heating_devices.length; i ++) {
        heating_url = "http://" + floor_heating_devices[i] + "/rpc/Switch.SetConfig?id=0&config={%22in_mode%22:%22follow%22,%22initial_state%22:%22match_input%22}";
        print("Switching on floor heating device "+i+": "+heating_url);      
        try{Shelly.call("HTTP.GET", { url: heating_url }, function (result, error_code, error_message) {})}catch(e) {};
        if(i < floor_heating_devices.length-1){i=i+1;}else{i=0} // Only 5 rpc calls per script, so switching only one heating device per script iteration.
      //}
      
      if(hour>=23 | hour < 8){
        print("Ventilation OFF (40%) between 23:00 and 08:00 if at home");
        try{Shelly.call("HTTP.GET", { url: "http://localhost/rpc/light.set?id=0&brightness=40" }, function (result, error_code, error_message) {})}catch(e) {};
      }
      else if(getOutdoorTemp()<getIndoorTemp()){ // Keep warmth inside
        print("Heat recovery ventilation level 1 (50%)");
        try{Shelly.call("HTTP.GET", { url: "http://localhost/rpc/light.set?id=0&brightness=50" }, function (result, error_code, error_message) {})}catch(e) {};
      }
      else{ // Take warmth inside
        print("Ventilation level 1 (30%)");
        try{Shelly.call("HTTP.GET", { url: "http://localhost/rpc/light.set?id=0&brightness=30" }, function (result, error_code, error_message) {})}catch(e) {};
      }
    }
  }
  print(""+getOutdoorTemp());
  print(""+getOutdoorTempForecast());
  print(""+getAtHomeBoolean());
}

function getOutdoorTemp() {
   let current_value = Virtual.getHandle("number:"+outdoor_temp_component_id);
   return current_value.getValue();
}

function getOutdoorTempForecast() {
   let current_value = Virtual.getHandle("number:"+outdoor_temp_forecast_component_id);
   return current_value.getValue();
}

function getIndoorTemp() {
   let current_value = Virtual.getHandle("number:"+indoor_temp_component_id);
   return current_value.getValue();
}

function getDeviceCount() {
   let current_value = Virtual.getHandle("number:"+device_count_component_id);
   return current_value.getValue();
}

function getAtHomeBoolean() {
   let current_value = Virtual.getHandle("boolean:"+at_home_boolean_component_id);
   return current_value.getValue();
}

function setAtHomeBoolean(x) {
       Shelly.call(
                  "Boolean.Set",
                  {
                    "id": at_home_boolean_component_id,
                    "value": x
                  });
  print("At home set to: " + x);
  
}

// Check inverter settings every 1 min
Timer.set(60000, true, function () {
    print("Timer triggered. Setting inverter.");
    setInverter();
});

// Initial fetch to verify script is working
print("Initial fetch to verify setInverter script is working...");
setInverter();

Shelly script 2 - checkDevicesOnNetwork:

// List all devices that the script should check
let devices = [
  "192.168.50.ggg", // Samsung
  "192.168.50.hhh" // iPhone
];

// Virtual component id ID
let component_id = 201;
let connected_device_count = 0;

// Function to check devices on network
function checkDevicesOnNetwork() {
    print("Starting checkDevicesOnNetwork");
    
    let url = "";
    connected_device_count = 0;
    
     // Iterate through devices
    for (let i = 0; i < devices.length; i ++) {
        url = devices[i];
        print("Device "+i+": "+url);      
        Shelly.call("HTTP.GET", { url: url }, processHttpResponse, url);
    }
    
    
    print("Current connected device count: "+getCounter());
}


function processHttpResponse(result, error_code, error_message, url) {
            if (error_code == -114) {
                print("Device "+url+" connected");
                print("Error message: " + error_message);
                print("Error code: " + error_code);
                connected_device_count = connected_device_count + 1;
            } 
            else if (error_code == -104) {
                print("Device "+url+" disconnected");
                print("Error message: " + error_message);
                print("Error code: " + error_code);
                connected_device_count = connected_device_count + 0;
            }
            else {
                print("HTTP request successful: "+result+" - "+error_message+" - "+error_code);
            }
            setCounter(connected_device_count);
}


function setCounter(x) {
       Shelly.call(
                  "Number.Set",
                  {
                    "id": component_id,
                    "value": x
                  });
  print(x+ " devices connected");
  
}

function getCounter() {
   let current_counter_value = Virtual.getHandle("number:"+component_id);
   return current_counter_value.getValue();
}

// Check device connections each minute
Timer.set(60000, true, function () {
    print("Timer triggered. Checking device connections.");
    checkDevicesOnNetwork();
});

// Initial fetch to verify script is working
print("Initial check to verify script is working...");
setCounter(0);

Shelly script 3 - Openweather_script:

// API key and city settings
let api_key = "xxxxxx"; //  OpenWeatherMap API key
let city = "Berlin,de"; // Change it to your city, country


// Virtual component id ID
let outdoor_temp_component_id = 200;

// Function to fetch weather data from OpenWeatherMap
function fetchWeatherData() {
    print("Starting fetchWeatherData function");
    
    // URL az OpenWeatherMap API kéréshez
    let url = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "&units=metric&appid=" + api_key;

    Shelly.call("HTTP.GET", { url: url }, function (result, error_code, error_message) {
        if (error_code !== 0) {
            print("Error fetching weather data: " + error_message);
            print("Error code: " + error_code);
        } else {
            print("HTTP GET request successful. Parsing result...");
            try {
                let weatherData = JSON.parse(result.body);
                let temperature = weatherData.main.temp;
                print("External temperature in your city: " + temperature + "°C");
       

         Shelly.call(
                  "Number.Set",
                  {
                    "id": outdoor_temp_component_id,
                    "value": temperature
                  },
                  function(result, error_code, error_message) {
                    if (error_code !== 0) {
                      print("An error occurred when updating the virtual component: " + error_message);
                    } else {
                      print("Virtual componentupdated. Value: " + temperature);
                    }
                  }
                );
            } catch (e) {
                print("Error parsing weather data: " + e.message);
                print("Received data: " + result.body); // Print the actual data received for debugging
            }
        }
    });
}

// Fetch weather data every 15 min
Timer.set(900000, true, function () {
    print("Timer triggered. Fetching weather data...");
    fetchWeatherData();
});

// Initial fetch to verify script is working
print("Initial fetch to verify script is working...");
fetchWeatherData();

// API key and city settings
let api_key = "xxxxxx"; //  OpenWeatherMap API key
let city = "Berlin,de"; // Change it to your city, country
let forecast_intervals = 8; // 16 would be nice, as it's two days, but more than a certain number leads to out of memory error


// Virtual component id ID
let outdoor_forecast_component_id = 202;

// Function to fetch weather data from OpenWeatherMap
function fetchWeatherForecast() {
    print("Starting fetchWeatherForecastfunction");
    
    // URL az OpenWeatherMap API kéréshez
    let url = "http://api.openweathermap.org/data/2.5/forecast?q=" + city + "&units=metric&appid=" + api_key + "&cnt=" + forecast_intervals;

    Shelly.call("HTTP.GET", { url: url }, function (result, error_code, error_message) {
        if (error_code !== 0) {
            print("Error fetching weather data: " + error_message);
            print("Error code: " + error_code);
        } else {
            print("HTTP GET request successful. Parsing result...");
            try {
                let weatherData = JSON.parse(result.body);
                let temperature = -30;
                let i = 0;
                while (i < forecast_intervals) {
                      if (weatherData.list[i].main.temp>temperature) {temperature=weatherData.list[i].main.temp}
                      i = i + 1;
                }
                // delete weatherData
                print("Maximal forecasted temperature during current and next day in your city: " + temperature + "°C");
       

         Shelly.call(
                  "Number.Set",
                  {
                    "id": outdoor_forecast_component_id,
                    "value": temperature
                  },
                  function(result, error_code, error_message) {
                    if (error_code !== 0) {
                      print("An error occurred when updating the virtual component: " + error_message);
                    } else {
                      print("Virtual component updated. Value: " + temperature);
                    }
                  }
                );
            } catch (e) {
                print("Error parsing weather data: " + e.message);
                print("Received data: " + result.body); // Print the actual data received for debugging
            }
        }
    });
}

// Fetch weather data every 15 min
Timer.set(900000, true, function () {
    print("Timer triggered. Fetching weather data...");
    fetchWeatherForecast();
});

// Initial fetch to verify script is working
print("Initial fetch to verify script is working...");
fetchWeatherForecast();

Ja, ich bin in HA unterwegs, habs aber schon hinbekommen :wink:

Mittlerweile kann ich bestätigen, dass dieses Schema mit einer Kombination aus „Shelly Dimmer 0/1-10V PM Gen3“ und „Shelly 1 Mini Gen4“ gut funktioniert.

Eine kurze Frage zum Shelly Dimmer in HA: Wird die variable Entität zur Steuerung (0-100%) als Typ Licht angegeben? Hast Du das ändern können, so dass HA es nicht als Licht erkennt?

Hintergrund ist, dass ich die Lüftung als Licht immer “an” ist…

Hi, sorry für die späte Antwort. Ja bei mir ist es auch eine Licht-Entität.

Es hat mich aber bisher nicht gestört, da ich über Auswahllisten und Automationen die “Lichtintensität”/Lüfterstufe einstelle.

Binär zeige ich nur Automatik/Manuell (Zustand Relais) an.

Mit dem Analogwert wird es sowieso schwer, Ein/Aus darzustellen, da Aus eben nicht bei 0% ist, und die Stufen auch noch in ungeordneter Reihenfolge sind.

Hallo zusammen,

ich habe auch diese Inventer smove Einheiten und ich habe Sie mir auch in den HA intergriert, wobei ich mir mal die Mühe gemacht habe, alles mittels Picture Elemente darzustellen, habe mir dann einen “input_boolean” (zum umschalten der Wärmerückgewinnung / Durchlüften Funktion) und einen “input_select” (zum Auswählen der Stufe 1, 2, 3, 4, Pause) und dann eine Automation dazu erstellt….In der Funktion dann die entsprechenden prozentuallen Werte das Shelly-Dimmers eingegeben…. Zur Simulation, da ich noch keinen Shelly habe (ist bestellt), habe ich ein “light” eingesetzt. Das funktioniert super…. Die Bedienung ist genau wie die am Touchpanel….

Bei Pause, blinkt die LED

Bei Stufe 1, 2, 3, 4 wird der Balken entsprechend dargestellt

Die Umschaltfunktion “Wärmerückgewinnung und Durchlüften” ist auch so dargestellt wie in echt

Hallo @sven071181

Das sieht ja richtig cool aus - kannst du deine Automation denn irgendwie teilen?

@phlash ja mach ich gerne. Muss dann mal alle Bilder und gifs, die Automation, die Oberfläche und die Helfer zusammen stellen

@sven071181 Kein Stress!

Hast du denn auch ein zusätzliches Relais integriert um auf Handbetrieb umschalten zu können?