Ankündigung

Einklappen
Keine Ankündigung bisher.

Viessmann Plugin Neuentwicklung Python Hilfe

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

  • fhartlieb
    antwortet
    Ich habe eine Viessmann Vitronic 150 KB1 und diese müsste glaube ich somit nach OpenV auch grundsätzlich per V-Optokopf steuerbar sein.
    leider fehlt mir derzeit die Zeit für diese Schnittstelle und die SW-Installationen.
    Ich würde aber sehr gerne testen / das Plugin nutzen / unterstützen…. Es wäre schon ein Traum, die zentrale Heizung vor der Urlaubsrückkehr einschalten zu können oder manuell eine Leggionellen-Schaltung per shNG nachzurüsten und damit die Warmwasser-Temp reduzieren zu können.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    So, ich habe das Plugin nochmal überarbeitet und das Webif funktional gemacht. Aktueller Stand ist im PR.

    Es benötigt den aktuell(s)ten Develop-code (Stand heute), damit das alles funktioniert. Es wäre super, wenn das mal ein oder zwei Leute testen könnten.

    Wenn man keine Items, sondern nur den serialport konfiguriert, kann man - Verbindung vorausgesetzt - im Webif den einzigen Befehl manuell starten, den es immer gibt - den Anlagentyp abfragen. Im Standalone-Modul geht das von der Kommandozeile aus, dabei werden auch P300 und KW durchprobiert. Ich glaube aber, dass das so für zukünftige Nutzung reichen sollte...?

    Die Anpassung der structs bedarf ggf. einer Anpassung der Item-Referenzen, im Prinzip braucht man nur noch "struct: viessmann.MODEL" angeben.

    Bei Bedarf könnte ich noch Structs zur "alten" Struktur anbieten...

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Falls jemand Interesse hast: ich habe das viessmann-Plugin mal versucht, auf sdp zu portieren. Vielleicht findet sich ein interessierter Tester, ich kann immer nur an meiner Anlage testen, und die "kann" (braucht) nicht alle Funktionen...

    PR ist offen, Daten sind in meinem Repo, branch "viessmann" (no shit...)

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Dann bau dir mehr Debugmeldungen ein, insbesondere in die cyclic-Schleife. Du willst wissen, ob und wie lange der Scheduler beim ersten Mal läuft und wann er fertig ist. (< 30 Sekunden!)

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Zitat von TCr82 Beitrag anzeigen
    Ich vermute da müsste man aber irgendwo mehr DEBUG Meldungen einbauen, da an den aktuellen nicht viel abzulesen ist.
    Die kannst Du in das Plugin bei Dir selbst einbauen. Du findest in der init.py genügend Beispiele, wie das geht.

    Zitat von TCr82 Beitrag anzeigen
    Ist es denn normal, dass der Timer so klein ist? Bzw. wird der Sheduler immer wieder neu angelegt oder sollte der auch so immer wieder laufen?
    Es kommt mir nämlich so vor, als wenn der Intervall zu klein gewählt wird, weswegen der dann nicht mehr ausgeführt wird.
    Der die Zeit bis zur nächsten Ausführung wird aus den vom Nutzer angegebenen Pollzeiten in den Items selbst angegeben. Es wird also ermittelt, welches Item den kürzesten Abstand zwischen 2 Abfragen hat und das wird die Lesezyklus. Gelesen werden aber nur die Datenpunkte, die auch Due sind.

    Einen Kommentar schreiben:


  • TCr82
    antwortet
    Ich vermute da müsste man aber irgendwo mehr DEBUG Meldungen einbauen, da an den aktuellen nicht viel abzulesen ist.
    Ist es denn normal, dass der Timer so klein ist? Bzw. wird der Sheduler immer wieder neu angelegt oder sollte der auch so immer wieder laufen?
    Es kommt mir nämlich so vor, als wenn der Intervall zu klein gewählt wird, weswegen der dann nicht mehr ausgeführt wird.

    Ich schrieb ja, dass die nächste Ausführung schon längst vorbei ist und eben nicht abgearbeitet wurde.

    Wenn ich jetzt drauf sehe, steht da immer noch:
    viessmann.cyclic 2022-12-25 12:03:43+01005 None {30: 30}​

    Das Datum und die Zeit hat sich also nicht geändert (seid dem letzten Neustart)....

    2022-12-25 12:03:12 NOTICE lib.smarthome -------------------- SmartHomeNG initialization finished --------------------

    Zuletzt geändert von TCr82; 27.12.2022, 22:43.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Das habe ich auch überlegt, allerdings hieße dass, dass der Scheduler irgendwo stehen bliebe.. das bedarf wohl umfassender Debug-Meldungen...

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Hallo,

    auch bei mir läuft das Viessmann Plugin tadellos. Soweit ich weiß, nutzt Morg und ich aber nicht das KW200 Protokoll.

    Vielleicht reißt die Kommunikation ab und das Plugin stoppt/hängt. Das könnte auch erklären, warum der Scheduler nicht stimmt.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Hm. So direkt habe ich da keine Idee. Viessmann läuft hier völlig problemlos und zuverlässig (mit cyclic )

    Der cycle scheint mir auch sinnvoll berechnet...

    Einen Patch habe ich nicht (wozu auch...), aber du kannst ja in den Scheduler und ggf. in run oder in die "tieferen" Routinen noch Debug logs einbauen...

    Einen Kommentar schreiben:


  • TCr82
    antwortet
    Da sich das Problem ja Konstant nachvollziehen lässt, evtl. hast du ein patch für mehr debug Punkte, um zu sehen, wieso die Items nicht mehr Zyklisch gepollt werden.

    Edit:
    Ich hab mal an ein paar stellen ein warning loggen lassen, falls was schief laufen sollte:

    Code:
    diff --git a/viessmann/__init__.py b/viessmann/__init__.py
    index 0d9b2dcb..3dfd6078 100755
    --- a/viessmann/__init__.py
    +++ b/viessmann/__init__.py
    @@ -665,6 +665,7 @@ class Viessmann(SmartPlugin):
             Setup the scheduler to handle cyclic read commands and find the proper time for the cycle.
             '''
             if not self.alive:
    +            self.logger.warning(f'exit cyclic callback - I am not alive!')
                 return
     
             shortestcycle = -1
    @@ -682,6 +683,8 @@ class Viessmann(SmartPlugin):
                     self.scheduler_remove('cyclic')
                 self.scheduler_add('cyclic', self.send_cyclic_cmds, cycle=workercycle, prio=5, offset=0)
                 self.logger.info(f'Added cyclic worker thread ({workercycle} sec cycle). Shortest item update cycle found: {shortestcycle} sec')
    +        else:
    +            self.logger.warning(f'Cannot add cyclic worker thread. Got incorrect shortestcycle!')
     
         def _read_initial_values(self):
             '''
    Aber da wird trotzdem nichts geloggt. Evtl. liegt es einfach daran, dass er den workercycle falsche bestimmt.

    thomas@heizung:/opt/smarthome/plugins/viessmann$ grep cyclic /var/log/smarthome/smarthome-develop.log | tail -n 5

    2022-12-23 12:59:23 DEBUG smartplugin viessmann scheduler_get: name = plugins.viessmann.cyclic -- (smartplugin.py:scheduler_get:695)
    2022-12-23 12:59:23 DEBUG smartplugin viessmann scheduler_get: name = plugins.viessmann.cyclic -- (smartplugin.py:scheduler_get:695)
    2022-12-23 12:59:23 DEBUG smartplugin viessmann scheduler_add: name = plugins.viessmann.cyclic, parameters: prio=5, cycle=30 -- (smartplugin.py:scheduler_add:648)
    2022-12-23 12:59:24 INFO __init__ viessmann Added cyclic worker thread (30 sec cycle). Shortest item update cycle found: 60 sec -- (__init__.py:_create_cyclic_scheduler:685)
    2022-12-23 12:59:24 INFO __init__ plugins.viessmann.cyclic Triggering cyclic command read -- (__init__.py:send_cyclic_cmds:331)



    ​Im Admin unter Plugin Sheduler steht:
    Scheduler nächste Ausführung Prio Wert Cycle Crontab
    viessmann.cyclic 2022-12-23 12:59:54+0100 5 None {30: 30} -
    Nächste Ausführung ist aber da schon lange vorbei.

    Wieso plant er da keinen neuen Zyklus....
    Zuletzt geändert von TCr82; 23.12.2022, 13:12.

    Einen Kommentar schreiben:


  • TCr82
    antwortet
    Zitat von Morg Beitrag anzeigen
    • Was meinst du mit "zirkulieren"?
    • Steht im Admin-Interface etwas unter den Schedulern?
    Damit meinte ich den Plugin-Scheduler der Regelmäßig die Daten Abruft...
    viessmann.cyclic ist im Plugin-Scheduler gelistet.

    Zitat von Morg Beitrag anzeigen
    • Welche Versionen von shng, plugins, Viessmann-Plugin benutzt du? Wie sieht die Konfiguration vom Plugin aus?
    Im bin bei beidem (shNG & plugins) im Developer unterwegs.

    Code:
    thomas@heizung:/opt/smarthome$ git log --pretty="%H - %cd" -n 1
    d189684acaa818d20b5a3c8b4bff61e7a12edf06 - Tue Nov 1 16:48:48 2022 +0100
    thomas@heizung:/opt/smarthome$ cd plugins/
    thomas@heizung:/opt/smarthome/plugins$ git log --pretty="%H - %cd" -n 1
    f46bcb8cedeb301b473bad0ae978fb0c67fc107e - Mon Nov 7 17:22:45 2022 +0100
    thomas@heizung:/opt/smarthome$ grep ^[^#] etc/plugin.yaml
    %YAML 1.1
    ---
    database:
        plugin_name: database
        driver: sqlite3
        connect:
        -   database:./var/db/smarthomeng.db
        -   check_same_thread:0
        count_logentries: true
    cli:
        plugin_name: cli
        plugin_enabled: false
        ip: 0.0.0.0
        #port: 2323
        update: true
    viessmann:
        plugin_name: viessmann
        serialport: /dev/ttyOptolink
        heating_type: V200KW2
        protocol: KW
    uzsu:
        plugin_name: uzsu
    mqtt:
        plugin_name: mqtt
    executor:
        plugin_name: executor
    thomas@heizung:/opt/smarthome$ grep ^[^#] items/01-viessmann.yaml 
    technik:
        heizung:
            LastRead:
                name: Letztes Update über Viessmann-Plugin
                type: str
                mqtt_topic_init: Heizung/LastRead
            Updaten:
                name: Update aller Items mit 'viess_update'
                type: bool
                cache: true
                enforce_updates: true
                autotimer: 1 = false = latest
                viess_update: 1
                mqtt_topic_out: Heizung/Updaten
                mqtt_topic_in: Heizung/Updaten
            BAList:
                type: list
                viess_ba_list: true
            Anlage:
                Typ:
                    name: Anlagentyp
                    type: str
                    viess_read: Anlagentyp
                    viess_init: true
                    mqtt_topic_out: Heizung/Anlage/Typ
                Softwareindex:
                    name: Anlagentyp
                    type: num
                    viess_read: AnlagenSoftwareIndex
                    viess_init: true
                    mqtt_topic_out: Heizung/Anlage/Softwareindex
                Schema:
                    name: Anlagenschema
                    type: str
                    viess_read: Anlagenschema
                    viess_init: true
                    mqtt_topic_out: Heizung/Anlage/Schema
                Systemzeit:
                    name: Systemzeit der Anlage
                    type: str
                    viess_read: Systemtime
                    viess_read_cycle: 60
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/Anlage/Zeit
            Aussen:
                Temp:
                    name: Aussentemperatur
                    type: num
                    viess_read: Aussentemperatur
                    viess_read_cycle: 300
                    viess_init: true
                    on_update: technik.heizung.LastRead = str(sh.technik.heizung.Aussen.Temp.last_update())
                    mqtt_topic_out: Heizung/Aussen/Temp
                TempDp:
                    name: Aussentemperatur
                    type: num
                    viess_read: Aussentemperatur_Dp
                    viess_read_cycle: 300
                    viess_init: true
                    mqtt_topic_out: Heizung/Aussen/TempDp
            Brenner:
                Stufe:
                    name: Brennerstufe
                    type: num
                    viess_read: Brennerstufe
                    viess_read_cycle: 60
                    viess_init: true
                    mqtt_topic_out: Heizung/Brenner/AktuelleStufe
                Starts:
                    name: Brennerstarts
                    type: num
                    viess_read: Brennerstarts
                    viess_read_cycle: 120
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/Brenner/Starts
                BetriebsstundenStufe1:
                    name: Brenner Betriebsstunden
                    type: num
                    viess_read: Brenner_BetriebsstundenStufe1
                    viess_read_cycle: 1800
                    viess_init: true
                    mqtt_topic_out: Heizung/Brenner/BetriebsstundenStufe1
                Status:
                    name: Brennerstatus
                    type: bool
                    viess_read: Brennerstatus_1
                    viess_read_cycle: 300
                    viess_init: true
                    mqtt_topic_out: Heizung/Brenner/Status
                Stoerung:
                    name: Brennerstörung
                    type: bool
                    viess_read: Brennerstoerung
                    viess_read_cycle: 300
                    viess_init: true
                    mqtt_topic_out: Heizung/Brenner/Stoerung
            Kessel:
                TempIst:
                    name: Kesseltemperatur
                    type: num
                    viess_read: Kesseltemperatur
                    viess_read_cycle: 180
                    viess_init: true
                    mqtt_topic_out: Heizung/Kessel/TempIst
                TempSoll:
                    name: Kesselsolltemperatur
                    type: num
                    viess_read: Kesselsolltemperatur
                    viess_read_cycle: 300
                    viess_init: true
                    mqtt_topic_out: Heizung/Kessel/TempSoll
            WW:
                Status:
                    name: Warmwasser Status
                    type: num
                    viess_read: Warmwasser_Status
                    viess_read_cycle: 120
                    viess_init: true
                    mqtt_topic_out: Heizung/WW/Status
                PumpeSpeicher:
                    name: WW Speicherladepumpe
                    type: bool
                    viess_read: Speicherladepumpe
                    viess_read_cycle: 60
                    viess_init: true
                    mqtt_topic_out: Heizung/WW/PumpeSpeicher
                TempIst:
                    name: Warmwassertemperatur
                    type: num
                    viess_read: Warmwasser_Temperatur
                    viess_read_cycle: 120
                    viess_init: true
                    mqtt_topic_out: Heizung/WW/TempIst
                    enforce_updates: yes
                TempSoll:
                    name: Warmwasser_Solltemperatur
                    type: num
                    viess_read: Warmwasser_Solltemperatur
                    viess_read_cycle: 300
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/WW/TempSoll
                    mqtt_topic_in: Heizung/WW/TempSoll
                    enforce_updates: yes
                TempSollAktuell:
                    name: Warmwasser Solltemperatur aktuell
                    type: num
                    viess_read: Warmwasser_SolltemperaturAktuell
                    viess_read_cycle: 300
                    viess_init: true
                    mqtt_topic_out: Heizung/WW/TempSollAktuell
                Schaltzeiten:
                    name: WW Schaltzeiten im UZSU dict Format
                    type: dict
                    viess_timer: Timer_Warmwasser
                    viess_init: true
                    viess_send: true
                    mqtt_topic_init: Heizung/WW/Schaltzeiten
                    mqtt_topic_in: Heizung/WW/Schaltzeiten
            HK1:
                Betriebsart_Aktuell:
                    name: HK1 Aktuelle Betriebsart
                    type: str
                    viess_read: Aktuelle_Betriebsart_A1M1
                    viess_read_cycle: 3600
                    viess_init: true
                Betriebsart:
                    name: HK1 Betriebsart
                    type: num
                    viess_read: Betriebsart_A1M1
                    viess_send: true
                    viess_read_afterwrite: 5
                    viess_init: true
                    cache: true
                    enforce_updates: true
                    viess_read_cycle: 300
                    viess_trigger: Aktuelle_Betriebsart_A1M1
                    struct: viessmann.betriebsart
                    mqtt_topic_out: Heizung/HK1/Betriebsart
                    betriebsart_str:
                        eval: "'Neustart' if value == '' else ['Warmwasser (Schaltzeiten)','reduziert Heizen (dauernd)', 'normal Heizen (dauernd)', 'Heizen und Warmwasser (FS)', 'Heizen und Warmwasser (Schaltzeiten)', 'Standby'][int(value)]"
                Sparbetrieb:
                    name: HK1 Sparbetrieb
                    type: bool
                    viess_read: Sparbetrieb_A1M1
                    viess_read_cycle: 60
                    viess_init: true
                    viess_send: true
                    viess_read_afterwrite: 5
                    viess_trigger:
                      - Aktuelle_Betriebsart_A1M1
                      - Betriebsart_A1M1
                    mqtt_topic_out: Heizung/HK1/Spar
                    mqtt_topic_in: Heizung/HK1/Spar
                Partybetrieb:
                    name: HK1 Partybetrieb
                    type: bool
                    viess_read: Partybetrieb_A1M1
                    viess_read_cycle: 60
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/HK1/Party
                    mqtt_topic_in: Heizung/HK1/Party
                PartybetriebZeit:
                    name: HK1 Partybetriebszeit in Stunden
                    type: num
                    viess_read: Partybetrieb_A1M1_Zeit
                    viess_read_cycle: 300
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/HK1/PartyZeit
                    mqtt_topic_in: Heizung/HK1/PartyZeit
                TempRaumSollAkt:
                    name: HK1 Raum Soll-Temperatur Aktuell
                    type: num
                    #viess_read: Raumtemperatur_Soll_Aktuell_A1M1
                    #viess_read_cycle: 300
                    #viess_init: true
                    #mqtt_topic_out: Heizung/HK1/TempRaumSollAkt
                    #mqtt_retain: true
                TempRaumSollNorm:
                    name: HK1 Raum Soll-Temperatur im Normalbetrieb
                    type: num
                    viess_read: Raumtemperatur_Soll_Normalbetrieb_A1M1
                    viess_read_cycle: 300
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/HK1/TempRaumSollNorm
                    mqtt_topic_in: Heizung/HK1/TempRaumSollNorm
                TempRaumSollRed:
                    name: HK1 Raum Soll-Temperatur im Reduzierbetrieb
                    type: num
                    viess_read: Raumtemperatur_Soll_Red_Betrieb_A1M1
                    viess_read_cycle: 300
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/HK1/TempRaumSollRed
                    mqtt_topic_in: Heizung/HK1/TempRaumSollRed
                TempRaumSollParty:
                    name: HK1 Raum Soll-Temperatur im Partybetrieb
                    type: num
                    viess_read: Raumtemperatur_Soll_Party_Betrieb_A1M1
                    viess_read_cycle: 300
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/HK1/TempRaumSollParty
                    mqtt_topic_in: Heizung/HK1/TempRaumSollParty
                Neigung:
                    name: HK1 Heizkennlinie Neigung
                    type: num
                    viess_read: Neigung_Heizkennlinie_A1M1
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/HK1/Neigung
                    mqtt_topic_in: Heizung/HK1/Neigung
                Niveau:
                    name: HK1 Heizkennlinie Niveau
                    type: num
                    viess_read: Niveau_Heizkennlinie_A1M1
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/HK1/Niveau
                    mqtt_topic_in: Heizung/HK1/Niveau
                Pumpe:
                    name: HK1 Pumpe
                    type: bool
                    viess_read: Heizkreispumpe_A1M1
                    viess_read_cycle: 60
                    viess_init: true
                    mqtt_topic_out: Heizung/HK1/Pumpe
                Schaltzeiten:
                    name: HK1 Schaltzeiten im UZSU dict Format
                    type: dict
                    viess_timer: Timer_A1M1
                    viess_init: true
                    viess_send: true
                    mqtt_topic_init: Heizung/HK1/Schaltzeiten
                    mqtt_topic_in: Heizung/HK1/Schaltzeiten
            HK2:
                Betriebsart_Aktuell:
                    name: HK2 Aktuelle Betriebsart
                    type: str
                    viess_read: Aktuelle_Betriebsart_M2
                    viess_read_cycle: 3600
                    viess_init: true
                Betriebsart:
                    name: HK2 Betriebsart
                    type: num
                    viess_read: Betriebsart_M2
                    viess_send: true
                    viess_read_afterwrite: 5
                    viess_init: true
                    cache: true
                    enforce_updates: true
                    viess_read_cycle: 300
                    viess_trigger: Aktuelle_Betriebsart_M2
                    struct: viessmann.betriebsart
                    mqtt_topic_out: Heizung/HK2/Betriebsart
                    betriebsart_str:
                        eval: "'Neustart' if value == '' else ['Warmwasser (Schaltzeiten)','reduziert Heizen (dauernd)', 'normal Heizen (dauernd)', 'Heizen und Warmwasser (FS)', 'Heizen und Warmwasser (Schaltzeiten)', 'Standby'][int(value)]"
                Sparbetrieb:
                    name: HK2 Sparbetrieb
                    type: bool
                    viess_read: Sparbetrieb_M2
                    viess_read_cycle: 60
                    viess_init: true
                    viess_send: true
                    viess_read_afterwrite: 5
                    viess_trigger:
                      - Aktuelle_Betriebsart_M2
                      - Betriebsart_M2
                    mqtt_topic_out: Heizung/HK2/Spar
                    mqtt_topic_in: Heizung/HK2/Spar
                Partybetrieb:
                    name: HK2 Partybetrieb
                    type: bool
                    viess_read: Partybetrieb_M2
                    viess_read_cycle: 60
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/HK2/Party
                    mqtt_topic_in: Heizung/HK2/Party
                PartybetriebZeit:
                    name: HK2 Partybetriebszeit in Stunden
                    type: num
                    viess_read: Partybetrieb_M2_Zeit
                    viess_read_cycle: 300
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/HK2/PartyZeit
                    mqtt_topic_in: Heizung/HK2/PartyZeit
                TempRaumSollAkt:
                    name: HK2 Raum Soll-Temperatur Aktuell
                    type: num
                    #viess_read: Raumtemperatur_Soll_Aktuell_M2
                    #viess_read_cycle: 300
                    #viess_init: true
                    #mqtt_topic_out: Heizung/HK2/TempRaumSollAkt
                    #mqtt_retain: true
                TempRaumSollNorm:
                    name: HK2 Raum Soll-Temperatur im Normalbetrieb
                    type: num
                    viess_read: Raumtemperatur_Soll_Normalbetrieb_M2
                    viess_read_cycle: 300
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/HK2/TempRaumSollNorm
                    mqtt_topic_in: Heizung/HK2/TempRaumSollNorm
                TempRaumSollRed:
                    name: HK2 Raum Soll-Temperatur im Reduzierbetrieb
                    type: num
                    viess_read: Raumtemperatur_Soll_Red_Betrieb_M2
                    viess_read_cycle: 300
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/HK2/TempRaumSollRed
                    mqtt_topic_in: Heizung/HK2/TempRaumSollRed
                TempRaumSollParty:
                    name: HK2 Raum Soll-Temperatur im Partybetrieb
                    type: num
                    viess_read: Raumtemperatur_Soll_Party_Betrieb_M2
                    viess_read_cycle: 300
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/HK2/TempRaumSollParty
                    mqtt_topic_in: Heizung/HK2/TempRaumSollParty
                TempVLIst:
                    name: HK2 Vorlauf-Ist-Temperatur
                    type: num
                    viess_read: Vorlauftemperatur_M2
                    viess_read_cycle: 180
                    viess_init: true
                    mqtt_topic_out: Heizung/HK2/TempVLIst
                TempVLSoll:
                    name: HK2 Vorlauf-Soll-Temperatur
                    type: num
                    viess_read_out: Vorlauftemperatur_Soll_M2
                    viess_read_in: Vorlauftemperatur_Soll_M2
                    viess_read_cycle: 300
                    viess_init: true
                    mqtt_topic_out: Heizung/HK2/TempVLSoll
                Neigung:
                    name: HK2 Heizkennlinie Neigung
                    type: num
                    viess_read: Neigung_Heizkennlinie_M2
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/HK2/Neigung
                    mqtt_topic_in: Heizung/HK2/Neigung
                Niveau:
                    name: HK2 Heizkennlinie Niveau
                    type: num
                    viess_read: Niveau_Heizkennlinie_M2
                    viess_init: true
                    viess_send: true
                    mqtt_topic_out: Heizung/HK2/Niveau
                    mqtt_topic_in: Heizung/HK2/Niveau
                Pumpe:
                    name: HK2 Pumpe
                    type: bool
                    viess_read: Heizkreispumpe_M2
                    viess_read_cycle: 60
                    viess_init: true
                    mqtt_topic_out: Heizung/HK2/Pumpe
                Mischer:
                    name: HK2 Mischer
                    type: num
                    viess_read: MischerM2
                    viess_read_cycle: 180
                    viess_init: true
                    mqtt_topic_out: Heizung/HK2/Mischer
                Schaltzeiten:
                    name: HK2 Schaltzeiten im UZSU dict Format
                    type: dict
                    viess_timer: Timer_M2
                    viess_init: true
                    viess_send: true
                    mqtt_topic_init: Heizung/HK2/Schaltzeiten
                    mqtt_topic_in: Heizung/HK2/Schaltzeiten
            StatusKlemme2:
                name: Status Klemme 2
                type: num
                viess_read: StatusKlemme2
                viess_read_cycle: 300
                viess_init: true
            Stoerungen:
                Sammelstoerung:
                    name: Sammelstoerung
                    type: num
                    viess_read: Sammelstoerung
                    viess_read_cycle: 3600
                    viess_init: true
                Error_1:
                    name: Fehlerhistory Eintrag 1
                    type: foo
                    viess_read: Error0
                    viess_read_cycle: 3600
                    viess_init: true
                Error_2:
                    name: Fehlerhistory Eintrag 2
                    type: foo
                    viess_read: Error1
                    viess_read_cycle: 3600
                    viess_init: true
    ​
    Zitat von Morg Beitrag anzeigen
    • Was passiert nach dem zweiten Log?
    Da passiert halt nichts mehr, bis nach einem Neustart.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    • Was meinst du mit "zirkulieren"?
    • Welche Versionen von shng, plugins, Viessmann-Plugin benutzt du? Wie sieht die Konfiguration vom Plugin aus?
    • Steht im Admin-Interface etwas unter den Schedulern?
    • Was passiert nach dem zweiten Log?
    So spontan habe ich noch keine Idee, da müsste man systematisch suchen.

    Einen Kommentar schreiben:


  • TCr82
    antwortet
    Wie ich mir dachte, da ist nichts daran zu erkennen, es hört einfach auf:

    2022-12-21 17:43:48 DEBUG __init__ viessmann Starting sync loop - attempt 1/5 -- (__init__.py:_KW_get_sync:889)
    2022-12-21 17:43:50 DEBUG __init__ viessmann Starting sync loop - attempt 2/5 -- (__init__.py:_KW_get_sync:889)
    2022-12-21 17:43:50 DEBUG __init__ viessmann Got sync. Commencing command send -- (__init__.py:_KW_get_sync:896)
    2022-12-21 17:43:50 DEBUG __init__ viessmann Successfully sent packet: 01f7302808 -- (__init__.py:_send_command_packet:942)
    2022-12-21 17:43:50 DEBUG __init__ viessmann Trying to receive 8 bytes of the response -- (__init__.py:_send_command_packet:952)
    2022-12-21 17:43:50 DEBUG __init__ viessmann Received 8 bytes chunk of response as hexstring 182030b0b8ffffff and as bytes b'\x18 0\xb0\xb8\xff\xff\xff' -- (__init__.py:_send_command_packet:976)
    2022-12-21 17:43:50 DEBUG __init__ viessmann Response decoded to: commandcode: 3028, responsedatacode: 1, valuebytecount: 8, responsetypecode: 1 -- (__init__.py:_parse_response:1413)
    2022-12-21 17:43:50 DEBUG __init__ viessmann Rawdatabytes formatted: 182030b0b8ffffff and unformatted: bytearray(b'\x18 0\xb0\xb8\xff\xff\xff') -- (__init__.py:_parse_response:1414)
    2022-12-21 17:43:50 DEBUG __init__ viessmann Matched command Timer_M2_Sa and read transformed timer [{'An': '03:00', 'Aus': '04:00'}, {'An': '06:00', 'Aus': '22:00'}, {'An': '23:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus'
    : '00:00'}] and byte length 8 -- (__init__.py:_parse_response:1443)
    2022-12-21 17:43:50 DEBUG __init__ viessmann process_response_timer: 3028 -- (__init__.py:_process_response:1134)
    2022-12-21 17:43:50 DEBUG __init__ viessmann Viessmann timer dict: {'Timer_Warmwasser': {'Timer_Warmwasser_Mo': [{'An': '04:00', 'Aus': '04:30'}, {'An': '07:30', 'Aus': '09:00'}, {'An': '14:30', 'Aus': '15:00'}, {'An': '1
    7:00', 'Aus': '22:00'}], 'Timer_Warmwasser_Di': [{'An': '04:00', 'Aus': '04:30'}, {'An': '07:30', 'Aus': '09:00'}, {'An': '14:30', 'Aus': '15:00'}, {'An': '17:00', 'Aus': '22:00'}], 'Timer_Warmwasser_Mi': [{'An': '04:00', 'Aus': '04:30'
    }, {'An': '07:30', 'Aus': '09:00'}, {'An': '14:30', 'Aus': '15:00'}, {'An': '17:00', 'Aus': '22:00'}], 'Timer_Warmwasser_Do': [{'An': '04:00', 'Aus': '04:30'}, {'An': '07:30', 'Aus': '09:00'}, {'An': '14:30', 'Aus': '15:00'}, {'An': '17
    :00', 'Aus': '22:00'}], 'Timer_Warmwasser_Fr': [{'An': '04:00', 'Aus': '04:30'}, {'An': '07:30', 'Aus': '09:00'}, {'An': '14:30', 'Aus': '15:00'}, {'An': '17:00', 'Aus': '22:00'}], 'Timer_Warmwasser_Sa': [{'An': '04:00', 'Aus': '04:30'}
    , {'An': '07:30', 'Aus': '09:00'}, {'An': '14:30', 'Aus': '15:00'}, {'An': '17:00', 'Aus': '22:00'}], 'Timer_Warmwasser_So': [{'An': '04:00', 'Aus': '04:30'}, {'An': '07:30', 'Aus': '09:00'}, {'An': '14:30', 'Aus': '15:00'}, {'An': '17:
    00', 'Aus': '22:00'}]}, 'Timer_A1M1': {'Timer_A1M1_Mo': [{'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_A1M1_Di': [{'An': '00:00', 'Aus': '00:0
    0'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_A1M1_Mi': [{'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00'
    , 'Aus': '00:00'}], 'Timer_A1M1_Do': [{'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_A1M1_Fr': [{'An': '00:00', 'Aus': '00:00'}, {'An': '00:00'
    , 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_A1M1_Sa': [{'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}],
    'Timer_A1M1_So': [{'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}]}, 'Timer_M2': {'Timer_M2_Mo': [{'An': '03:00', 'Aus': '04:00'}, {'An': '06:00', 'Aus'
    : '22:00'}, {'An': '23:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_M2_Di': [{'An': '03:00', 'Aus': '04:00'}, {'An': '06:00', 'Aus': '22:00'}, {'An': '23:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_M
    2_Mi': [{'An': '03:00', 'Aus': '04:00'}, {'An': '06:00', 'Aus': '22:00'}, {'An': '23:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_M2_Do': [{'An': '03:00', 'Aus': '04:00'}, {'An': '06:00', 'Aus': '22:00'}, {'An': '23:00
    ', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_M2_Fr': [{'An': '03:00', 'Aus': '04:00'}, {'An': '06:00', 'Aus': '22:00'}, {'An': '23:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_M2_Sa': [{'An': '03:00', '
    Aus': '04:00'}, {'An': '06:00', 'Aus': '22:00'}, {'An': '23:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}]}} -- (__init__.py:_process_response:1146)
    2022-12-21 17:43:50 DEBUG __init__ viessmann send_timer_commands Timer_M2_So -- (__init__.py:_read_timers:720)
    2022-12-21 17:43:50 DEBUG __init__ viessmann Got a new read job: Command Timer_M2_So -- (__init__.py:_send_command:741)
    2022-12-21 17:43:50 DEBUG __init__ viessmann Build read packet for command Timer_M2_So -- (__init__.py:_build_command_packet:1293)
    2022-12-21 17:43:50 DEBUG __init__ viessmann Created command Timer_M2_So to be sent as hexstring: 01f7303008 and as bytes: bytearray(b'\x01\xf700\x08') -- (__init__.py:_build_command_packet:1349)
    2022-12-21 17:43:50 DEBUG __init__ viessmann Starting sync loop - attempt 1/5 -- (__init__.py:_KW_get_sync:889)
    2022-12-21 17:43:52 DEBUG __init__ viessmann Starting sync loop - attempt 2/5 -- (__init__.py:_KW_get_sync:889)
    2022-12-21 17:43:52 DEBUG __init__ viessmann Got sync. Commencing command send -- (__init__.py:_KW_get_sync:896)
    2022-12-21 17:43:52 DEBUG __init__ viessmann Successfully sent packet: 01f7303008 -- (__init__.py:_send_command_packet:942)
    2022-12-21 17:43:52 DEBUG __init__ viessmann Trying to receive 8 bytes of the response -- (__init__.py:_send_command_packet:952)
    2022-12-21 17:43:52 DEBUG __init__ viessmann Received 8 bytes chunk of response as hexstring 182030b0b8ffffff and as bytes b'\x18 0\xb0\xb8\xff\xff\xff' -- (__init__.py:_send_command_packet:976)
    2022-12-21 17:43:52 DEBUG __init__ viessmann Response decoded to: commandcode: 3030, responsedatacode: 1, valuebytecount: 8, responsetypecode: 1 -- (__init__.py:_parse_response:1413)
    2022-12-21 17:43:52 DEBUG __init__ viessmann Rawdatabytes formatted: 182030b0b8ffffff and unformatted: bytearray(b'\x18 0\xb0\xb8\xff\xff\xff') -- (__init__.py:_parse_response:1414)
    2022-12-21 17:43:52 DEBUG __init__ viessmann Matched command Timer_M2_So and read transformed timer [{'An': '03:00', 'Aus': '04:00'}, {'An': '06:00', 'Aus': '22:00'}, {'An': '23:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus'
    : '00:00'}] and byte length 8 -- (__init__.py:_parse_response:1443)
    2022-12-21 17:43:52 DEBUG __init__ viessmann process_response_timer: 3030 -- (__init__.py:_process_response:1134)
    2022-12-21 17:43:52 DEBUG __init__ viessmann Viessmann timer dict: {'Timer_Warmwasser': {'Timer_Warmwasser_Mo': [{'An': '04:00', 'Aus': '04:30'}, {'An': '07:30', 'Aus': '09:00'}, {'An': '14:30', 'Aus': '15:00'}, {'An': '1
    7:00', 'Aus': '22:00'}], 'Timer_Warmwasser_Di': [{'An': '04:00', 'Aus': '04:30'}, {'An': '07:30', 'Aus': '09:00'}, {'An': '14:30', 'Aus': '15:00'}, {'An': '17:00', 'Aus': '22:00'}], 'Timer_Warmwasser_Mi': [{'An': '04:00', 'Aus': '04:30'
    }, {'An': '07:30', 'Aus': '09:00'}, {'An': '14:30', 'Aus': '15:00'}, {'An': '17:00', 'Aus': '22:00'}], 'Timer_Warmwasser_Do': [{'An': '04:00', 'Aus': '04:30'}, {'An': '07:30', 'Aus': '09:00'}, {'An': '14:30', 'Aus': '15:00'}, {'An': '17
    :00', 'Aus': '22:00'}], 'Timer_Warmwasser_Fr': [{'An': '04:00', 'Aus': '04:30'}, {'An': '07:30', 'Aus': '09:00'}, {'An': '14:30', 'Aus': '15:00'}, {'An': '17:00', 'Aus': '22:00'}], 'Timer_Warmwasser_Sa': [{'An': '04:00', 'Aus': '04:30'}
    , {'An': '07:30', 'Aus': '09:00'}, {'An': '14:30', 'Aus': '15:00'}, {'An': '17:00', 'Aus': '22:00'}], 'Timer_Warmwasser_So': [{'An': '04:00', 'Aus': '04:30'}, {'An': '07:30', 'Aus': '09:00'}, {'An': '14:30', 'Aus': '15:00'}, {'An': '17:
    00', 'Aus': '22:00'}]}, 'Timer_A1M1': {'Timer_A1M1_Mo': [{'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_A1M1_Di': [{'An': '00:00', 'Aus': '00:0
    0'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_A1M1_Mi': [{'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00'
    , 'Aus': '00:00'}], 'Timer_A1M1_Do': [{'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_A1M1_Fr': [{'An': '00:00', 'Aus': '00:00'}, {'An': '00:00'
    , 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_A1M1_Sa': [{'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}],
    'Timer_A1M1_So': [{'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}]}, 'Timer_M2': {'Timer_M2_Mo': [{'An': '03:00', 'Aus': '04:00'}, {'An': '06:00', 'Aus'
    : '22:00'}, {'An': '23:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_M2_Di': [{'An': '03:00', 'Aus': '04:00'}, {'An': '06:00', 'Aus': '22:00'}, {'An': '23:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_M
    2_Mi': [{'An': '03:00', 'Aus': '04:00'}, {'An': '06:00', 'Aus': '22:00'}, {'An': '23:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_M2_Do': [{'An': '03:00', 'Aus': '04:00'}, {'An': '06:00', 'Aus': '22:00'}, {'An': '23:00
    ', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_M2_Fr': [{'An': '03:00', 'Aus': '04:00'}, {'An': '06:00', 'Aus': '22:00'}, {'An': '23:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_M2_Sa': [{'An': '03:00', '
    Aus': '04:00'}, {'An': '06:00', 'Aus': '22:00'}, {'An': '23:00', 'Aus': '00:00'}, {'An': '00:00', 'Aus': '00:00'}], 'Timer_M2_So': [{'An': '03:00', 'Aus': '04:00'}, {'An': '06:00', 'Aus': '22:00'}, {'An': '23:00', 'Aus': '00:00'}, {'An'
    : '00:00', 'Aus': '00:00'}]}} -- (__init__.py:_process_response:1146)
    2022-12-21 17:43:52 DEBUG __init__ viessmann Timer Readout done = True -- (__init__.py:_read_timers:723)
    2022-12-21 17:43:52 DEBUG __init__ viessmann Viessmann timer dict for UZSU: {'Timer_Warmwasser': {'04:00': {1: ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']}, '04:30': {0: ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']}, '07:30'
    : {1: ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']}, '09:00': {0: ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']}, '14:30': {1: ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']}, '15:00': {0: ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']}, '17:00': {1
    : ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']}, '22:00': {0: ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']}}, 'Timer_A1M1': {}, 'Timer_M2': {'03:00': {1: ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']}, '04:00': {0: ['MO', 'TU', 'WE', 'TH', 'FR
    ', 'SA', 'SU']}, '06:00': {1: ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']}, '22:00': {0: ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']}, '23:00': {1: ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']}}} -- (__init__.py:_viess_dict_to_uzsu_dict:1
    540)

    Ein manuelles Lesen über das Webinterface macht er aber noch, ohne den IO error.
    Zuletzt geändert von TCr82; 21.12.2022, 17:55.

    Einen Kommentar schreiben:


  • TCr82
    antwortet
    Hi Morg,

    ich hab ja irgendwann im November shNG mal wieder komplett aktualisiert. Auf jeden Fall ist mir aufgefallen, dass das Plugin immer aufhört zu Zirkulieren. Keine Ahnung ob das schon vorher so war, auf jeden Fall wollte ich mal nachfragen, ob man da was machen kann. Ich meine mich aber zu erinnern, dass wir schonmal darüber gechattet hatten....

    Das Protokoll hört dann einfach auf zu Loggen. shNG läuft aber fleißig weiter (das ist das letzte Protokoll).

    2022-12-18 08:56:50 NOTICE lib.smarthome -------------------- Init SmartHomeNG v1.9.3.1-d189684a.develop --------------------
    2022-12-18 08:56:50 NOTICE lib.smarthome Running in Python interpreter 'v3.9.15 final' in virtual environment, from directory /opt/smarthome
    2022-12-18 08:56:50 NOTICE lib.smarthome - on Linux-5.4.0-1077-raspi-armv7l-with-glibc2.31 (pid=27045)
    2022-12-18 08:56:50 NOTICE lib.smarthome - Loglevel NOTICE is set to value 31 because handler of root logger is set to level WARNING or higher - Set level of handler 'shng_warnings_file' to 'NOTICE'!
    2022-12-18 08:56:54 NOTICE lib.smarthome - Nutze Feiertage für Land 'DE', Provinz 'RP', 1 benutzerdefinierte(r) Feiertag(e) definiert
    2022-12-18 08:57:07 WARNING lib.metadata Item 'technik.heizung.HK2.TempVLSoll', attribute 'viess_read_out': Attribute is undefined and has value 'Vorlauftemperatur_Soll_M2' (defined in 01-viessmann.yaml)
    2022-12-18 08:57:07 WARNING lib.metadata Item 'technik.heizung.HK2.TempVLSoll', attribute 'viess_read_in': Attribute is undefined and has value 'Vorlauftemperatur_Soll_M2' (defined in 01-viessmann.yaml)
    2022-12-18 08:57:08 NOTICE lib.smarthome -------------------- SmartHomeNG initialization finished --------------------
    ​Und danach lief noch alles, bis er dann wieder kurz darauf am 2022-12-18 08:57:12.172291+01:00 das letzte mal gearbeitet hat (am Item abgelesen).

    Bis jetzt bin ich immer wieder hingegangen und habe shNG über den Webadmin neu gestartet (Core neustarten).
    Aber irgendwie kann es das ja nicht sein.

    Ich dachte, probiere ich mal über das Webinterface einen Wert zu lesen. Dann erscheint folgendes im Protokoll:

    2022-12-21 17:22:22 ERROR plugins.viessmann send_command_packet failed with IO error: IO Error: write failed: [Errno 5] Input/output error
    2022-12-21 17:22:22 ERROR plugins.viessmann Trying to reconnect (disconnecting, connecting
    ​Wenn ich dann aber über "Core neu starten" shNG neu starte, läuft es wieder. Er scheint sich da irgendwie zu verschlucken.

    EDIT: Ich hab jetzt mal wieder DEBUG aktiviert. Ich meine es schmierte ja so immer kurz danach ab. Mal schauen was man da erkennen kann.
    Zuletzt geändert von TCr82; 21.12.2022, 17:43.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Ja, da weiß ich auch nicht, wieso das nicht drin ist. Ich hab es bei mir ja beides gleichzeitig geändert, sonst wäre es nicht gelaufen. Wieso das nicht im Repo angekommen ist, kann ich nicht sagen.

    Im Develop habe ich es gepusht, aber du kannst es auch per Hand anpassen.

    Einen Kommentar schreiben:

Lädt...
X