Neu bei Home Assistant und direkt Modbus Kopplung

Barry Ricoh

Active member
Hallo Forum,
ich bin noch ganz neu bei HA und möchte mich als erstes an meiner Heizung versuchen.
Ich habe eine Paradigma Systacomfort II per Modbus TCP angebunden.
Prinzipiell klappt die Kopplung auch, und ich kann schon etliche Werte einlesen und zB in Gauge visualisieren.
Was ich jetzt versuche ist den Sollwert für einen Heizkreis zu setzen.
Dafür gibt es ja den Service "modbus.write_register". Auch habe ich verstanden das dieser Service nicht in der config.yaml
eingetragen wird. Ich kann den sozusagen "direkt" aufrufen.
Jetzt brauche ich mal ne Idee wie ich das Visualisieren könnte.
Zb einen Schieberegler (zB 30-80 °C) mit einem Button "Sollwert setzen" .
Ich habe schon einen Helfer angelegt für den Schieberegler und Button Karten gibt es ja auch,
aber ich habe keine Idee wie ich das verknüpfen kann. Am besten sogar in einer Karte.
Könnt ihr mir weiter helfen?'

Vielen Dank im Vorraus.
 

IvoryBalboa90

Active member
Du kannst eine kleine Automation schreiben, die bei Änderung an deinem Helfer (also Schieberegler verstellt quasi) die Temperatur per Service weitergibt.

Ich kenne den yaml-Aufbau von deinem service zwar nicht, aber du wirst dort ja eine Temperatur eingeben können. Statt einer Zahl nimmst du dann:
YAML:
"{{ states('xxxxxxx')|float(0) }}"
Für xxxxx trägst du ein, wie deine Entität heißt (vermutlich input_number.xxx).
 

alexamend

Active member
Schau mal ob dir nicht sogar dieser blueprint weiterhelfen kann.

blueprint heating

YAML:
blueprint:
  name: 'Heating Control'
  description: 'Automatic heating based on a scheduler, presence of people and optional dependencies such as window opening, winter mode or party mode.'
  source_url: 'https://github.com/panhans/homeassistant/blob/main/blueprints/automation/panhans/heating_control.yaml'
  domain: automation
  input:
 
    heating:
      name: 'Thermostats / Valves'
      description: 'Thermostats to be controlled'
      selector:
        entity:
          domain: climate
          multiple: true
        
    min_temp:
      name: 'Minimum Temp'
      description: 'If no one is at home, the minimum temperature is set.'
      default: 19
      selector:
        number:
          min: 12
          max: 24
          step: 0.5
          mode: slider
        
    set_temp:
      name: 'Comfort temperature'
      description: 'If someone is at home, the comfort temperature is set.'
      selector:
        entity:
          domain: input_number
        
    persons:
      name: 'Persons'
      description: 'If a person is at home, the comfort temperature is set.'
      selector:
        entity:
          domain: person
          multiple: true
      
    scheduler:
      name: 'Scheduler'
      description: 'Scheduler that specifies when the comfort temperature can be set.'
      selector:
        entity:
          domain: schedule
          multiple: false
        
    window:
      name: 'Window (optional)'
      description: 'Window that turns off the thermostats if it is open.'
      default:
      selector:
        entity:
          domain: binary_sensor
        
    window_reaction_time:
      name: 'Window reaction time'
      description: 'Duration that the window must be open for the thermostats to be turned off.'
      default: 10
      selector:
        number:
          min: 0
          max: 60
          step: 1
          mode: slider
        
    winter_mode:
      name: 'Winter mode (optional)'
      description: 'Falls dieser Input boolean aus ist, wird niemals geheizt.'
      default:
      selector:
        entity:
          domain: input_boolean
        
    party_mode:
      name: 'Party mode (optional)'
      description: 'Overwrites winter mode and scheduler. If on, heating is activated.'
      default:
      selector:
        entity:
          domain: input_boolean

variables:
  set_temp: !input 'set_temp'
  min_temp: !input 'min_temp'
  scheduler: !input 'scheduler'
  window: !input 'window'
  winter_mode: !input 'winter_mode'
  party_mode: !input 'party_mode'
  persons: !input 'persons'

  party_state: "{{ party_mode != none and is_state(party_mode, 'on') }}"
  winter_state: "{{ winter_mode != none and is_state(winter_mode, 'on') }}"
  window_state: "{{ window != none and is_state(window, 'on') }}"
  mode: >
    {% if (winter_state == true or party_state == true) and window_state == false %}
      heat
    {% else %}
      off
    {% endif %}

  persons_home_count: "{{ expand(persons) | selectattr('state', 'eq', 'home') | list | count }}"
 
  temperatur: >
    {% if (states(scheduler) == 'on' and persons_home_count | int > 0 ) %}
      {{ states(set_temp) }}
    {% else %}
      {{ min_temp }}
    {% endif %}
 
trigger_variables:
  window_t: !input window
  winter_mode_t: !input winter_mode
  party_mode_t: !input party_mode

trigger:
  - platform: homeassistant
    event: start

  - platform: event
    event_type: automation_reloaded

  - platform: state
    entity_id: !input 'scheduler'

  - platform: state
    entity_id: !input 'set_temp'
    for:
      seconds: 2

  - platform: state
    entity_id: !input 'persons'

  - platform: template
    value_template: >-
       {{ window_t != none and is_state(window_t, 'on') }}
    for:
      seconds: !input 'window_reaction_time'

  - platform: template
    value_template: >-
       {{ window_t != none and is_state(window_t, 'off') }}
    for:
      seconds: !input 'window_reaction_time'
    
  - platform: template
    value_template: >-
       {{ winter_mode_t != none and is_state(winter_mode_t, 'on') }}
    for:
      seconds: !input 'window_reaction_time'

  - platform: template
    value_template: >-
       {{ winter_mode_t != none and is_state(winter_mode_t, 'off') }}
    for:
      seconds: !input 'window_reaction_time'
    
  - platform: template
    value_template: >-
       {{ party_mode_t != none and is_state(party_mode_t, 'off') }}
    for:
      seconds: !input 'window_reaction_time'
    
  - platform: template
    value_template: >-
       {{ party_mode_t != none and is_state(party_mode_t, 'off') }}
    for:
      seconds: !input 'window_reaction_time'
  
action:
  - service: climate.set_hvac_mode
    target:
      entity_id: !input 'heating'
    data:
      hvac_mode: "{{ mode }}"

  - condition: template
    value_template: "{{ mode == 'heat' }}"
  - delay: 3
  - service: climate.set_temperature
    data:
      entity_id: !input 'heating'
      temperature: "{{ temperatur | float }}"
        
mode: restart

Hier die passenden Ansicht Heating Card dazu
Heating card
 

Barry Ricoh

Active member
Hallo, vielen Dank ihr 2 für eure Antwort.
Leider übersteigen beide mein Verständnis.
Da fehlt mir noch sehr viel Kenntnis.

Der Service der den Wert schreiben soll ist laut Doku

YAML:
service: modbus.write_register
data:
     address: <target register address>
     unit: <target slave address>
     hub: <hub name>
     value: [0x4120, 0x0000]

Selbst wenn ich rausfinde wie ich den Wert des Schiebereglers an Value übergebe, habe ich keine Ahnung wo ich den Service eintragen (aufrufen) soll.
 
Zuletzt bearbeitet von einem Moderator:

IvoryBalboa90

Active member
Entwicklerwerkzeuge -> Dienste.
Da kannst den Dienst aussuchen und klickst dann auf "yaml" Modus und gibst da folgendes ein:

YAML:
service: modbus.write_register
    data:
      hub: xxxx
      unit: xxxx
      address: xxxx
      value: "{{ states('entity_id') }}"

Die ganzen xxxx musst du dir aus deiner Modbus-Integration rausholen.
Bei entity_id schreibst du rein, wie dein Schieberegler heißt (vermutlich input_number.irgendwas).

Wenn das geklappt hat, weißt du schonmal wie dein Service aussehen muss, mit dem du die Ziel-Temperatur übergibt.
Danach machen wir dann ne Automation draus.
 

Barry Ricoh

Active member
Also ich habe das dort mal auf die schnelle getestet mit einem festen Wert für Value.
Das hat schon mal funktioniert.
Das mit dem Wert vom Schieberegler übernehmen versuche ich morgen mal.
Heute ist zu spät. Muss in die Heia.

Vielen Dank erstmal für die Hilfe.
 

Barry Ricoh

Active member
Guten Morgen,
Habe das nun mal mit dem Schieberegler versucht.
Beim editieren des Dienstes wird der mir auch vorgeschlagen, und ich füge den ein.
Auch wird mir der Wert angezeigt, und beim Ausführen kommt auch ein grüner Haken, aber der Wert wird von der Steuerung nicht übernommen.
Ich denke das es da noch ein Problem mit dem Format des Wertes gibt.
Wenn ich einen direkten Wert übertrage : value: [550] (für 55 Grad C) übernimmt die Steuerung das.
Beim Schieberegler habe ich aber keine Möglichkeit gefunden den Wert irgendwie zu beeinflussen.
Du weisst bestimmt auch hier weiter. :)
 

Barry Ricoh

Active member
YAML:
service: modbus.write_register
data:
  value: "{{ states('input_number.hk1_sollwert') }}"
  hub: Systacomfort
  unit: 1
  address: 2
 

IvoryBalboa90

Active member
Da du sagtest, dass du 550 eingeben musstest für 55 Grad, kannst es mal so probieren:

YAML:
service: modbus.write_register
data:
  value: "{{ (states('input_number.hk1_sollwert')|float(0))*10 }}"
  hub: Systacomfort
  unit: 1
  address: 2
 

alexamend

Active member
Geht das bei modbus nicht über input_ typ: input und input_type: holding
Habe kein modbus um es zu testen, und deine
- int , wurden nicht angegeben daher aktuell alles auf int16

YAML:
modbus:
  - name: systacomfort
    type: tcp
    host: ---- IP ------
    port: ----- PORT -----
    sensors:
     - name: "Außentemperatur"
       scan_interval: 100
       slave: 1
       input_type: input
       scale: 0.1
       unit_of_measurement: °C
       address: 0
       data_type: int16
       precision: 2
     - name: "Vorlauftemp HK1"
       scan_interval: 100
       slave: 1
       input_type: input
       scale: 0.1
       unit_of_measurement: °C
       address: 1
       data_type: int16
       precision: 2
     - name: "Rücklauftemp HK1"
       scan_interval: 100
       slave: 1
       input_type: input
       scale: 0.1
       unit_of_measurement: °C
       address: 2
       data_type: int16
       precision: 2

  
## Writing
    climates:
      - name: "Sollwert Vorlauf HK1"
        scan_interval: 100
        slave: 1
        address: 2
        input_type: holding
        max_temp: 50
        min_temp: 25
        precision: 1
        scale: 0.1
        target_temp_register: 2
 

Barry Ricoh

Active member
Die Frage kann ich dir nicht beantworten.
Das man über den Dienst schreiben soll habe ich ja aus der Home Assistant Modbus Doku.
Und wenn der Wert ja direkt angegeben wird und nicht über eine Variable, geht es ja.
Nur ist das natürlich nicht zielführend.

Bei deinem Beispiel (Climates) hier steht aber ja gar kein Wert der geschrieben wird.
Oder übersehe ich was.
 

alexamend

Active member
Versuchs mal so, bei input helper ist float immer ein Problem

YAML:
service: modbus.write_register
data:
  value: "{{ states('input_number.hk1_sollwert')|float(0)*10 }}"
  hub: Systacomfort
  unit: 1
  address: 2
 

Barry Ricoh

Active member
Leider auch nix. 😭
Wenn ein Helper nix taugt, kann ich auch gerne ein anderes Element nehmen, wenn du mir sagst was ich noch nehmen könnte um einen Wert einzugeben.
 

alexamend

Active member
Was kommt denn für ein Fehler?
Könnte natürlich auch sein das du anstelle von
| float
| int
Eingeben musst
Dann müsstest du dein Helper von 300 bis 800 definieren, müsste man dann in der Ansicht auf 30 bis 80 umbiegen
 

Barry Ricoh

Active member
YAML:
Logger: homeassistant.components.modbus.modbus
Source: components/modbus/modbus.py:385
Integration: Modbus (documentation, issues)
First occurred: 12:25:22 (3 occurrences)
Last logged: 14:26:53

Pymodbus: Systacomfort: Exception Response(134, 6, IllegalFunction)

Der Fehler kommt wenn ich den Dienst starte in der Entwicklungsumgebung, obwohl da ein grüner Haken kommt nach der Ausführung.
Und ich sehe halt an der Steuerung das der Wert nicht übernommen wird.
Den Helper habe ich erstellt.
Wenn ich den Code eintippe findet der Editor ja auch den Namen der Entität und vervollständigt den, und zeigt mir den Wert an.
 
Zuletzt bearbeitet von einem Moderator:

Barry Ricoh

Active member
Scheint so als wenn ihr momentan genauso ratlos seit wie ich.
Ich würde dann jetzt mal an einem anderen Punkt ansetzen wollen damit ich weiter komme.

Wenn das mit der Variablem schreiben nicht geht im Moment, würde ich mal einen Festen Wert dort einsetzen, das klappt ja.
Ich bräuchte mal einen Tip, wie ich so eine Automation anlege.
Ich möchte sozusagen einen Schalter auf der Oberfläche haben, wenn der auf "ein" ist schreibe ich den festen Wert (80 °C) auf den Bus. Das muss alle 4 min passieren, solange bis der Schalter wieder ausgeschaltet wird.
Könnt ihr mir hier etwas unter die Arme greifen?

Vielen Dank im Voraus.
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
1.725
Beiträge
21.439
Mitglieder
1.234
Neuestes Mitglied
Doneinei
Oben