Ankündigung

Einklappen

Sammelbestellung ETS6 Vollversionen aktiv!

Sammelbestellung für ETS6 Vollversionen (Prof., Home, Lite) mit 40% Rabatt aktiv! Infos im Forum!
Mehr anzeigen
Weniger anzeigen

bosch Smart Home Raumtemperatur II über zigbee2mqtt wie auf Ausgang wirken lassen.

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    bosch Smart Home Raumtemperatur II über zigbee2mqtt wie auf Ausgang wirken lassen.

    Hi,
    ich versuche einen Bosch Smart Home Raumtemperaturrelger II auf eine Fußbodenheizung wirken zu lassen aber fühle ich mich, als hätte ich von HASS keine Ahnung.

    Ich habe also via Zigbee2mqtt einen "bosch Smart Home Raumtemperatur II" eingebunden, ging wunderbar und ich habe jetzt alles in HASS, was ich meiner Meinung nach bräuchte und auch noch bidirektional. Aber wie sage ich dem Teil jetzt, es soll z.b. auf einen Relais Ausgang wirken zum testen? Ich habe hier eine Shelly Plug und wollte damit etwas spielen und bei den Kindern im Bad eine Heizmatte zum testen an/aus machen. Quasi "PWM Simulieren"... wenn ich den verschiedenen Anleitungen von Simon42 folge, lande ich z.b. bei der "HASmartThermostat" Integration. Die hat aber wieder eigene Sollwerte und Betriebsmodi. Klar ich kann die Isttemperatur vom Bosch damit verbinden und dann wirkt er auf den von mir ausgewählten Ausgang, aber dann ist die Sollwertverstellung vom Bosch nicht möglich und eigentlich ist das ja doppelt.. mir fehlt ja "nur" die Wirkung auf den Ausgang. Muss ich das dann z.b. über C.A.F.E. machen oder über ein Skript?
    Kann mich da bitte kurz wer in die richtige Richtung schupsen? DANKE!

    Gruß
    Roman

    PS:Es sollte ein HASS Anfänger Forum geben.
    Zuletzt geändert von BadSmiley; 23.05.2026, 11:17.
    Dieser Beitrag enthält keine Spuren von Sarkasmus... ich bin einfach so?!

    #2
    Edit3: So, jetzt geht es wie gedacht:

    1. unter config/blueprints/automation/<ordner>/​ eine Datei wie z.b. pwm_fubu.yaml ablegen und folgenden Code rein kopieren:

    Code:
    blueprint:
      name: PWM Heizungssteuerung (P-Regler, Heizart wählbar → Shelly)
      description: >
        Berechnet selbst einen Stellwert (0–100 %) aus der Regelabweichung
        zwischen Soll- und Ist-Temperatur eines Climate-Thermostats (P-Regler
        mit Proportionalband) und gibt diesen als PWM-Signal (getaktetes Ein/Aus)
        auf einen Schaltausgang aus.
    
        Über die Heizart werden erprobte Voreinstellungen für Proportionalband
        und Zykluszeit gewählt. Im Modus "Benutzerdefiniert" greifen stattdessen
        die manuell eingestellten Werte.
    
        Voreinstellungen je Heizart:
          - Fußbodenheizung: Proportionalband 3,5 °C, Zykluszeit 20 min (träge)
          - Heizkörper:      Proportionalband 1,5 °C, Zykluszeit 15 min
          - Konvektor/Lüfter: Proportionalband 1,0 °C, Zykluszeit 10 min (flink)
          - Benutzerdefiniert: nutzt die manuellen Felder unten
    
        Hinweis: Reiner P-Regler -> es bleibt eine kleine bleibende
        Regelabweichung (Ist pendelt sich knapp unter Soll ein).
      domain: automation
      input:
        climate_entity:
          name: Thermostat (Climate-Entität)
          description: Liefert Ist-Temperatur (current_temperature) und Soll-Temperatur.
          selector:
            entity:
              domain: climate
        setpoint_attribute:
          name: Soll-Attribut
          description: >
            Welches Attribut den Sollwert enthält. target_temp_low für Geräte mit
            Heiz-/Kühlbereich, temperature für normale Thermostate.
          default: target_temp_low
          selector:
            select:
              options:
                - label: target_temp_low (Heiz-/Kühlbereich)
                  value: target_temp_low
                - label: temperature (Standard-Sollwert)
                  value: temperature
        switch_entity:
          name: Schaltausgang
          description: Der Schalter/Aktor, der getaktet werden soll (z. B. Shelly).
          selector:
            entity:
              domain: switch
        heating_type:
          name: Heizart
          description: >
            Bestimmt die Voreinstellungen für Proportionalband und Zykluszeit.
            Bei "Benutzerdefiniert" greifen die manuellen Felder darunter.
          default: heizkoerper
          selector:
            select:
              options:
                - label: Fußbodenheizung (träge)
                  value: fussboden
                - label: Heizkörper
                  value: heizkoerper
                - label: Konvektor / Lüfter (flink)
                  value: konvektor
                - label: Benutzerdefiniert
                  value: custom
        custom_proportional_band:
          name: "Benutzerdef.: Proportionalband (°C)"
          description: >
            Nur wirksam, wenn Heizart = Benutzerdefiniert. Temperaturspanne
            unterhalb des Sollwerts, über die von 0 % auf 100 % hochgeregelt wird.
          default: 2.0
          selector:
            number:
              min: 0.5
              max: 5.0
              step: 0.1
              unit_of_measurement: "°C"
              mode: slider
        custom_cycle_time:
          name: "Benutzerdef.: Zykluszeit"
          description: >
            Nur wirksam, wenn Heizart = Benutzerdefiniert. Muss in 60 aufgehen.
          default: "15"
          selector:
            select:
              options:
                - label: 5 Minuten
                  value: "5"
                - label: 10 Minuten
                  value: "10"
                - label: 15 Minuten
                  value: "15"
                - label: 20 Minuten
                  value: "20"
                - label: 30 Minuten
                  value: "30"
        min_einschaltzeit:
          name: Minimale Einschaltzeit (Sekunden)
          description: >
            Stellwerte, die eine kürzere Einschaltzeit als diesen Wert ergeben,
            werden auf 0 gesetzt (verhindert sehr kurze, sinnlose Schaltimpulse).
          default: 30
          selector:
            number:
              min: 0
              max: 120
              step: 5
              unit_of_measurement: s
              mode: slider
    
    mode: restart
    
    triggers:
      # Regulärer Zyklustakt (jede Minute, gefiltert per Condition)
      - trigger: time_pattern
        minutes: "/1"
        id: zyklus
      # Sofort neu rechnen, wenn sich der Sollwert ändert
      - trigger: state
        entity_id: !input climate_entity
        attribute: !input setpoint_attribute
        id: sollwert
    
    variables:
      climate_entity: !input climate_entity
      switch_entity: !input switch_entity
      setpoint_attribute: !input setpoint_attribute
      heating_type: !input heating_type
      custom_band: !input custom_proportional_band
      custom_cycle: !input custom_cycle_time
      min_ein: !input min_einschaltzeit
      # Voreinstellungen je Heizart auflösen
      prop_band: >
        {% if heating_type == 'fussboden' %} 3.5
        {% elif heating_type == 'heizkoerper' %} 1.5
        {% elif heating_type == 'konvektor' %} 1.0
        {% else %} {{ custom_band }}
        {% endif %}
      cycle_min: >
        {% if heating_type == 'fussboden' %} 20
        {% elif heating_type == 'heizkoerper' %} 15
        {% elif heating_type == 'konvektor' %} 10
        {% else %} {{ custom_cycle }}
        {% endif %}
      ist_temp: "{{ state_attr(climate_entity, 'current_temperature') | float(0) }}"
      soll_temp: "{{ state_attr(climate_entity, setpoint_attribute) | float(0) }}"
      abweichung: "{{ soll_temp - ist_temp }}"
      # P-Regler: lineare Begrenzung auf 0..100 % über das Proportionalband
      stellwert: >
        {% set p = (abweichung / (prop_band | float) * 100) %}
        {{ [[p, 0] | max, 100] | min | round(1) }}
      ein_sekunden_roh: "{{ (cycle_min | int * 60 * (stellwert / 100)) | int(0) }}"
      # Mindest-Einschaltzeit erzwingen
      ein_sekunden: "{{ ein_sekunden_roh if ein_sekunden_roh >= (min_ein | int) else 0 }}"
    
    conditions:
      # Sollwert-Trigger immer durchlassen; Zeit-Trigger nur zu Zyklusbeginn
      # (z. B. bei 15 min: :00, :15, :30, :45)
      - condition: template
        value_template: >
          {{ trigger.id == 'sollwert'
             or now().minute % (cycle_min | int) == 0 }}
    
    actions:
      - choose:
          # Stellwert 0 (oder unter Mindestzeit) -> komplett aus
          - conditions:
              - "{{ ein_sekunden <= 0 }}"
            sequence:
              - action: switch.turn_off
                target:
                  entity_id: "{{ switch_entity }}"
          # Stellwert >= 100 -> dauerhaft an
          - conditions:
              - "{{ stellwert >= 100 }}"
            sequence:
              - action: switch.turn_on
                target:
                  entity_id: "{{ switch_entity }}"
        default:
          # Teil-Last: an, warten, aus
          - action: switch.turn_on
            target:
              entity_id: "{{ switch_entity }}"
          - delay:
              seconds: "{{ ein_sekunden }}"
          - action: switch.turn_off
            target:
              entity_id: "{{ switch_entity }}"​
    Zuletzt geändert von BadSmiley; 23.05.2026, 12:57.
    Dieser Beitrag enthält keine Spuren von Sarkasmus... ich bin einfach so?!

    Kommentar


      #3
      Dann machen wir mal weiter, mit Smarthome IoT Bastellei aber offline. Als Heizungsaktor habe ich diesen ausgewählt: https://automat-on.de/zigbee-tuya-8-...gler-ch8z.html

      Leider ging er erstmal nicht unter Zigbee2mqtt... ich habe etwas mit Claude diskutiert und eine Stunde später:

      1. /homeassistant/zigbee2mqtt/external_converters/ als Ordner anlegen, den gab es bei mir nicht

      Hier z.b. die Datei "automaton_ch8z.js" erstellen und folgenden Code rein kopieren:
      Code:
      import * as exposes from "zigbee-herdsman-converters/lib/exposes";
      import * as tuya from "zigbee-herdsman-converters/lib/tuya";
      
      const e = exposes.presets;
      const ea = exposes.access;
      
      const switchValueConverter = tuya.valueConverterBasic.lookup(() => ({
          ON: true,
          OFF: false,
      }));
      
      // Hilfsfunktion: fordert das Gerät auf, alle Datapoints zu senden.
      // Tuya-Geräte senden ihren Zustand normalerweise nur bei Änderungen.
      // Mit einem "Data Query"-Befehl bringt man sie dazu, alles zu schicken.
      const requestDeviceStatus = async (device) => {
          try {
              const endpoint = device.getEndpoint(1);
              // Tuya "Data Query"-Command (cluster manuSpecificTuya / 0xEF00)
              await endpoint.command("manuSpecificTuya", "dataQuery", {});
          } catch (error) {
              // Gerät evtl. nicht erreichbar - keine harte Fehlerbehandlung nötig
          }
      };
      
      export default {
          fingerprint: [
              {
                  modelID: "TS0601",
                  manufacturerName: "_TZE204_1oft6qso",
              },
          ],
          model: "CH8Z",
          vendor: "AutomatOn",
          description: "Underfloor heating / irrigation valves controller - 8 zones (AutomatOn CH8Z)",
          fromZigbee: [tuya.fz.datapoints],
          toZigbee: [tuya.tz.datapoints],
          onEvent: async (type, data, device) => {
              // Zeitsynchronisation für Tuya beibehalten
              await tuya.onEventSetTime(type, data, device);
      
              // Bei Z2M-Start und wenn sich das Gerät am Netzwerk meldet:
              // einmal aktuellen Zustand aller Datapoints anfordern.
              if (type === "start" || type === "deviceAnnounce") {
                  await requestDeviceStatus(device);
              }
          },
          configure: async (device, coordinatorEndpoint) => {
              await tuya.configureMagicPacket(device, coordinatorEndpoint);
              // Direkt nach dem Konfigurieren einmal Status anfordern
              await requestDeviceStatus(device);
          },
          exposes: [
              e.switch().withEndpoint("l1"),
              e.switch().withEndpoint("l2"),
              e.switch().withEndpoint("l3"),
              e.switch().withEndpoint("l4"),
              e.switch().withEndpoint("l5"),
              e.switch().withEndpoint("l6"),
              e.switch().withEndpoint("l7"),
              e.switch().withEndpoint("l8"),
              e.numeric("countdown_l1", ea.STATE_SET).withValueMin(0).withValueMax(43200).withValueStep(1).withUnit("s").withDescription("Countdown Kanal 1"),
              e.numeric("countdown_l2", ea.STATE_SET).withValueMin(0).withValueMax(43200).withValueStep(1).withUnit("s").withDescription("Countdown Kanal 2"),
              e.numeric("countdown_l3", ea.STATE_SET).withValueMin(0).withValueMax(43200).withValueStep(1).withUnit("s").withDescription("Countdown Kanal 3"),
              e.numeric("countdown_l4", ea.STATE_SET).withValueMin(0).withValueMax(43200).withValueStep(1).withUnit("s").withDescription("Countdown Kanal 4"),
              e.numeric("countdown_l5", ea.STATE_SET).withValueMin(0).withValueMax(43200).withValueStep(1).withUnit("s").withDescription("Countdown Kanal 5"),
              e.numeric("countdown_l6", ea.STATE_SET).withValueMin(0).withValueMax(43200).withValueStep(1).withUnit("s").withDescription("Countdown Kanal 6"),
              e.numeric("countdown_l7", ea.STATE_SET).withValueMin(0).withValueMax(43200).withValueStep(1).withUnit("s").withDescription("Countdown Kanal 7"),
              e.numeric("countdown_l8", ea.STATE_SET).withValueMin(0).withValueMax(43200).withValueStep(1).withUnit("s").withDescription("Countdown Kanal 8"),
              e.enum("power_on_behavior", ea.STATE_SET, ["off", "on", "previous"]).withDescription("Verhalten nach Stromausfall"),
              e.enum("indicator_mode", ea.STATE_SET, ["none", "relay", "pos"]).withDescription("LED-Modus"),
              e.child_lock(),
          ],
          endpoint: () => ({
              l1: 1, l2: 1, l3: 1, l4: 1,
              l5: 1, l6: 1, l7: 1, l8: 1,
          }),
          meta: {
              multiEndpoint: true,
              tuyaDatapoints: [
                  [1, "state_l1", switchValueConverter],
                  [2, "state_l2", switchValueConverter],
                  [3, "state_l3", switchValueConverter],
                  [4, "state_l4", switchValueConverter],
                  [5, "state_l5", switchValueConverter],
                  [6, "state_l6", switchValueConverter],
                  [7, "state_l7", switchValueConverter],
                  [8, "state_l8", switchValueConverter],
                  [9,  "countdown_l1", tuya.valueConverter.raw],
                  [10, "countdown_l2", tuya.valueConverter.raw],
                  [11, "countdown_l3", tuya.valueConverter.raw],
                  [12, "countdown_l4", tuya.valueConverter.raw],
                  [13, "countdown_l5", tuya.valueConverter.raw],
                  [14, "countdown_l6", tuya.valueConverter.raw],
                  [15, "countdown_l7", tuya.valueConverter.raw],
                  [16, "countdown_l8", tuya.valueConverter.raw],
                  [27, "power_on_behavior", tuya.valueConverterBasic.lookup({
                      off: tuya.enum(0),
                      on: tuya.enum(1),
                      previous: tuya.enum(2),
                  })],
                  [28, "indicator_mode", tuya.valueConverterBasic.lookup({
                      none: tuya.enum(0),
                      relay: tuya.enum(1),
                      pos: tuya.enum(2),
                  })],
                  [29, "child_lock", tuya.valueConverter.lockUnlock],
              ],
          },
      };​
      funktioniert bei mir perfekt! Das Einzige was nicht geht... wenn der Zigbee2mqtt Controller neu startet und man schaltet einen Aktorkanal per hand, kriegt er den korrekten Status nicht mehr aus dem Gerät. Der Rest funktioniert aber so wie von mir gedacht.

      Viel Erfolg!
      Dieser Beitrag enthält keine Spuren von Sarkasmus... ich bin einfach so?!

      Kommentar

      Lädt...
      X