[gelöst] vallox_websocket_api mit fhem koppeln

Begonnen von ch.eick, 20 August 2019, 16:21:51

Vorheriges Thema - Nächstes Thema

Otto123

Hallo Christian,

mir scheint eher hier das Problem? CSRF token not available!

Aber ich verstehe auch gerade nicht wirklich welchen Weg Du gehst  :-\

Wer soll mit SSL reden udn wo klappt es nicht? Dein FHEM Server mag es nicht? Dein KWL mag es nicht?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

ch.eick

Zitat von: Otto123 am 22 August 2019, 14:05:54
Hallo Christian,

mir scheint eher hier das Problem? CSRF token not available!

Aber ich verstehe auch gerade nicht wirklich welchen Weg Du gehst  :-\

Wer soll mit SSL reden udn wo klappt es nicht? Dein FHEM Server mag es nicht? Dein KWL mag es nicht?

Gruß Otto

Die Verbindung ist aus dem Python Skript zum FHEM Server.
Das Skript wird mit system() aufgerufen. Userid und Passwort kommen aus einer Datei.
Es ist das identische Skript, das ich mit dem User fhem aufrufe.

Ich vermute das Environment vom User fhem und das Environment vom system() Aufruf aus dem FHEM Server könnten unterschiedlich sein.

Wie wir es gestern besprochen hatten baut jetzt das Python Skript mit https eine Verbindung zum FHEM auf, um mit setreading die Daten zu übergeben.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Hallo nochmal,

ich habe den selben Post hier https://forum.fhem.de/index.php/topic,63816.msg968825.html#msg968825 nochmal eingetragen, da es eventuell mit dem "Python FHEM API-Modul" zutun haben könnte.

Sorry, ich wusste ansonsten nicht, wie ich beides zusammen kriegen sollte.

Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Update:
Bei Aufruf des Skriptes mit system(...&) tritt das Problem nicht auf.
https://forum.fhem.de/index.php/topic,63816.msg970207.html#msg970207

Viele Grüße
    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Und nun geht es weiter....

Das Auslesen der Vallox MV 270 funktioniert nun.

Jetzt würde ich gerne das Profil wechseln, was in der Vallox Cloud folgender maßen möglich ist.

HTTPMOD Attribute

set01Data     {"20545":{"value":15,"minutesflag":true,"modbus":20545,"disabled":false},"65550":{"value":$val,"modbus":65550},"65603":{"value":30,"minutesflag":true,"modbus":65603,"disabled":false}}

set01IMap     0:Anwesend, 1:Abwesend, 2:Stosslueften, 3:Kaminfunktion

set01Name    KWL_Set_Profil


Das einzig Variable beim setzen der JSON Werte ist hierbei "65550" mit Value "[0|1|2|3]"

Wie könnte ich jetzt eine eqivalenten Aufruf im vallox_websocket_api verwenden?
Ich habe bereits etwas wie hier gefunden, komme jedoch mit den zu verwendenden JSON Variablen nicht ganz klar.

    client.set_settable_address('A_CYC_MODE', int)

    await client.set_values({
      'A_CYC_MODE': 0, #Minutes
    })


Wer kann mir da mal bitte etwas Hilfestellung geben?

Viele Grüße
    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

#20
Update:

Mit diesem Code kann man die Profile 0,1 und 3 ansteuern, jedoch ist das Profil 2 (boost; Stoßlüften) nicht funktionstüchtig.

# import logging
# logging.basicConfig(level=logging.DEBUG)

import json
import asyncio
from vallox_websocket_api import Vallox, PROFILE

import sys
kwl = sys.argv[1]

try:
    with open('/opt/fhem/python/pwd.json', 'r') as f:
        credentials=json.load(f)
except Exception as e:
    print('Something went wrong: {}'.format(e))

client = Vallox(kwl) # Vallox unit IP

async def run():
    await client.get_profile() # RETURNS a PROFILE.* value

# Hier bitte eins auswählen
    await client.set_profile(PROFILE.HOME) # Permanently HOME profile
#    await client.set_profile(PROFILE.AWAY) # Permanently AWAY profile
#    await client.set_profile(PROFILE.FIREPLACE) # FIREPLACE mode for configured timeout

# Dies hat noch nicht funktioniert, oder wurde von mir falsch angewendet
#    await client.set_profile(PROFILE.FIREPLACE, 120) # FIREPLACE mode for 120 min
#    await client.set_profile(PROFILE.FIREPLACE, 65535) # FIREPLACE mode, never TIMEOUT
#    await client.set_profile(PROFILE.EXTRA) # EXTRA mode for configured timeout
#    await client.set_profile(PROFILE.EXTRA, 65535) # EXTRA mode, never TIMEOUT
#    await client.set_profile(PROFILE.EXTRA, 120) # EXTRA mode for 120 min

asyncio.get_event_loop().run_until_complete(run())


Und hier ein Log vom Profil 2 (EXTRA)
Es kommt eine INFO, jedoch schaltet die Vallox nicht, wie bei den drei anderen, in dieses Profil um.
Die Laufzeitveränderungen aus dem beispiel habe ich ebenfalls ohne Erfolg getestet.

DEBUG:asyncio:Using selector: EpollSelector
DEBUG:websockets.protocol:client - state = CONNECTING
DEBUG:websockets.protocol:client - event = connection_made(<_SelectorSocketTransport fd=6 read=idle write=<idle, bufsize=0>>)
DEBUG:websockets.protocol:client - state = OPEN
DEBUG:websockets.protocol:client > Frame(fin=True, opcode=2, data=b'\x03\x00\xf6\x00\x00\x00\xf9\x00', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client < Frame(fin=True, opcode=2, data=b'\x00$\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x08\x00\n\x00\x00\x00\x00\x00\x00\x00[_\xec\xa0\x00\x01\x00\x05 ?\xbb\x11\x0c\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+\x00\x1eu\nvPvSu\ruv\x00\x01\x00\x00\x04\x01\x04\xb6\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc7\x02\xf0\x00\x02\x00\x00\x00<\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00W\xc5\x03\xe8\xff\xff\xff\xff\xff\xff\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x02\x15\xfe\x00\x95\x000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x07\x00\x14\x00\x13\x00\x1c\x00\x08\x00\x13\x00\x03\x00\x07\x00X\x00i\x00\x01\x00\x00\x00\x00\x00\x00\x00\x07\x002\x002\x00\x01\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\xc0\xa8\xb2\x01\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\xa8\xb2\x0bC,wu?\xdaC\n\x92\n\x97\xb5\x91\xb5\xf2\xc4\x00L\x00L\x00\x01\x00\xc0\x01\x01\x00%\x002\x002\x002\x00\x00\x009\x03\x84\x00\x00p\x8f\x002\x002\x00\n\x00\x00\x00\x00\x00\x01\x00\x00\x00\x14p\x8f\x00\x00\x00\x00\x00\x01\x00\x00\x00\x1ep\x8f\x00\x00\x00\x00\x00\x01\x00\x00\x00Kp\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x007\x00\x0f\x00\x0b\x02v\x00\x00\x00\x00h\xbf\x00\x01\x00\x05\x9c\xaa\x00\x00\x00\x14\x01h\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x1e\x00\x0f\x00\x14\x00\n\x00\x12\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x03\xe9\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00\x00\x00\n\x002\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - state = CLOSING
DEBUG:websockets.protocol:client > Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client < Frame(fin=True, opcode=8, data=b'', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - event = eof_received()
DEBUG:websockets.protocol:client - event = connection_lost(None)
DEBUG:websockets.protocol:client - state = CLOSED
DEBUG:websockets.protocol:client x code = 1005, reason = [no reason]
DEBUG:websockets.protocol:client - state = CONNECTING
DEBUG:websockets.protocol:client - event = connection_made(<_SelectorSocketTransport fd=6 read=idle write=<idle, bufsize=0>>)
DEBUG:websockets.protocol:client - state = OPEN
DEBUG:websockets.protocol:client > Frame(fin=True, opcode=2, data=b'\x03\x00\xf6\x00\x00\x00\xf9\x00', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client < Frame(fin=True, opcode=2, data=b'\x00$\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x08\x00\n\x00\x00\x00\x00\x00\x00\x00[_\xec\xa0\x00\x01\x00\x05 ?\xbb\x11\x0c\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+\x00\x1eu%vkvPt\xeeui\x00\x01\x00\x00\x04\x01\x04\xb7\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc7\x02\xf4\x00\x00\x00\x00\x00<\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00W\xc5\x03\xe8\xff\xff\xff\xff\xff\xff\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x02\x15\xfe\x00\x95\x000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x07\x00\x14\x00\x13\x00\x1c\x00\x08\x00\x13\x00\x03\x00\x07\x00X\x00i\x00\x01\x00\x00\x00\x00\x00\x00\x00\x07\x002\x002\x00\x01\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\xc0\xa8\xb2\x01\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\xa8\xb2\x0bC,wu?\xdaC\n\x92\n\x97\xb5\x91\xb5\xf2\xc4\x00L\x00L\x00\x01\x00\xc0\x01\x01\x00%\x002\x002\x002\x00\x00\x009\x03\x84\x00\x00p\x8f\x002\x002\x00\n\x00\x00\x00\x00\x00\x01\x00\x00\x00\x14p\x8f\x00\x00\x00\x00\x00\x01\x00\x00\x00\x1ep\x8f\x00\x00\x00\x00\x00\x01\x00\x00\x00Kp\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x007\x00\x0f\x00\x0b\x02v\x00\x00\x00\x00h\xbf\x00\x01\x00\x05\x9c\xaa\x00\x00\x00\x14\x01h\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x1e\x00\x0f\x00\x14\x00\n\x00\x12\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x03\xe9\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00\x00\x00\n\x002\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - state = CLOSING
DEBUG:websockets.protocol:client > Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client < Frame(fin=True, opcode=8, data=b'', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - event = eof_received()
DEBUG:websockets.protocol:client - event = connection_lost(None)
DEBUG:websockets.protocol:client - state = CLOSED
DEBUG:websockets.protocol:client x code = 1005, reason = [no reason]


INFO:root:Setting unit to EXTRA profile for 10 minutes


DEBUG:websockets.protocol:client - state = CONNECTING
DEBUG:websockets.protocol:client - event = connection_made(<_SelectorSocketTransport fd=6 read=idle write=<idle, bufsize=0>>)
DEBUG:websockets.protocol:client - state = OPEN
DEBUG:websockets.protocol:client > Frame(fin=True, opcode=2, data=b'\x08\x00\xf9\x00\x04\x12\x00\x00\x05\x12\x00\x00\x06\x12\n\x00\x1a7', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client < Frame(fin=True, opcode=2, data=b'\x02\x00\xf5\x00\xf7\x00', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - state = CLOSING
DEBUG:websockets.protocol:client > Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client < Frame(fin=True, opcode=8, data=b'', rsv1=False, rsv2=False, rsv3=False)
DEBUG:websockets.protocol:client - event = eof_received()
DEBUG:websockets.protocol:client - event = connection_lost(None)
DEBUG:websockets.protocol:client - state = CLOSED
DEBUG:websockets.protocol:client x code = 1005, reason = [no reason]


Jetzt bin ich schon sooooo nah dran und bräuchte dann doch noch Unterstützung.

Vielen Dank im Voraus
     Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

#21
Update

Nun gehen alle Profile, es war ein Anfänger Fehler.

Im Beispiel auf GitHup https://github.com/yozik04/vallox_websocket_api war einfach nur das BOOST Prifile nicht angegeben, konnte aber mit logik einfach ergänzt werden.

await client.set_profile(PROFILE.BOOST) # BOOST profile for configured time ( 30 minutes )

So einfach kann es sein...

Viele Grüße
    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

#22
Update 20190906 15:59   Es wurde noch die aktive Profil Erkennung eingebaut.

Die Steuerung besteht nun aus den drei folgenden FHEM definitionen:

defmod KWL_Control dummy
attr KWL_Control comment Profile \
1=Anwesend/Home,\
2=Abwesend/Away,\
3=Stosslueften/Boost,\
4=Kaminfunktion/Fireplace\

attr KWL_Control group KWL
attr KWL_Control icon audio_eq
attr KWL_Control readingList Profil
attr KWL_Control room Heizung->System
attr KWL_Control setList Profil:slider,1,1,4
attr KWL_Control sortby 01
attr KWL_Control stateFormat {sprintf("innen %d °C, Zuluft %d °C, Abluf %d °C, außen %d °C | %s %s| %s", \
ReadingsVal("KWL_Status","A_CYC_TEMP_EXTRACT_AIR","?"),\
ReadingsVal("KWL_Status","A_CYC_TEMP_SUPPLY_AIR","?"),\
ReadingsVal("KWL_Status","A_CYC_TEMP_EXHAUST_AIR","?"),\
ReadingsVal("KWL_Status","A_CYC_TEMP_OUTDOOR_AIR","?"),\
ReadingsVal("KWL_Status","EXT_CYC_STATE","?"),\
ReadingsVal("KWL_Status","EXT_CYC_CELL_STATE","?"),\
ReadingsVal("KWL_Status","EXT_CYC_TIME","?")\
)}

setstate KWL_Control innen 22 °C, Zuluft 21 °C, Abluf 22 °C, außen 19 °C | Home Bypass| 15:54

# Hier habe ich veränderliche Variablen plaziert, die z.B. beim Skriptaufruf verwendet werden.
setstate KWL_Control 2019-09-05 18:44:30 FHEM_Ip-Adress x.x.x.x
setstate KWL_Control 2019-09-05 18:44:50 KWL_Ip-Adress x.x.x.x



defmod KWL_Status expandJSON KWL_Status:output:.\{.*}
attr KWL_Status comment Das Device wird über ein Python Skript im reading output befüllt.\
deletereading KWL [A|C|EXT|RANGE|WS].*\
CYC_CELL_STATE 0=WRG, 1= KRG, 2= Bypass, 3=Defrost\
CYC_STATE 0=HOME, 1=AWAY
attr KWL_Status group KWL
attr KWL_Status icon Ventilator_wind
attr KWL_Status room Heizung->System
attr KWL_Status sortby 02
attr KWL_Status userReadings EXT_CYC_TIME { sprintf("%0.2i:%0.2i",ReadingsVal("$name","A_CYC_HOUR",""), ReadingsVal("$name","A_CYC_MINUTE","")) } ,\
EXT_CYC_DATE { sprintf("20%i.%0.2i.%0.2i",ReadingsVal("$name","A_CYC_YEAR",""), ReadingsVal("$name","A_CYC_MONTH",""), ReadingsVal("$name","A_CYC_DAY","")) } ,\
EXT_CYC_FILTER_CHANGED_DATE { sprintf("20%i.%0.2i.%0.2i",ReadingsVal("$name","A_CYC_FILTER_CHANGED_YEAR",""), ReadingsVal("$name","A_CYC_FILTER_CHANGED_MONTH",""), ReadingsVal("$name","A_CYC_FILTER_CHANGED_DAY","") ) },\
EXT_CYC_STATE {\
if     (ReadingsVal("$name","A_CYC_BOOST_TIMER","?") > 0 ) {sprintf("%s", "Boost")}\
elsif (ReadingsVal("$name","A_CYC_FIREPLACE_TIMER","?") > 0 ) {sprintf("%s", "Fireplace")}\
elsif (ReadingsVal("$name","A_CYC_STATE","?") == 0 ) {sprintf("%s", "Home")}\
else  {sprintf("%s", "Away")}\
}, \
EXT_CYC_CELL_STATE {\
if     (ReadingsVal("$name","A_CYC_CELL_STATE","?") == 0 ) {sprintf("%s", "WRG")}\
elsif (ReadingsVal("$name","A_CYC_CELL_STATE","?") == 1 ) {sprintf("%s", "KRG")}\
elsif (ReadingsVal("$name","A_CYC_CELL_STATE","?") == 2 ) {sprintf("%s", "Bypass")}\
elsif (ReadingsVal("$name","A_CYC_CELL_STATE","?") == 3 ) {sprintf("%s", "Defrost")}\
else  {sprintf("%s", "?")}\
}


Hier habe ich mich für ein DOIF entschieden, um alle Steuerungsaktivitäten aus einer Definition heraus zu steuern.
1) Sobald im Dummy das Profil geändert wird
2) Alle 5 Minuten den Status abfragen
3) Wenn das KWL_Status.pl Skript den Output ins FHEM geschrieben hat wird mit expandJSON alles in readings geschrieben und im Anschluss der Intervall Timer noch publiziert.

defmod KWL_Call DOIF ##\
## Ändert sich in KWL_Control das Profil, dann sende es zur KWL\
##\
([KWL_Control:Profil])\
    ({system("/usr/bin/python /opt/fhem/python/bin/kwl_set_profil.py ".ReadingsVal("KWL_Control","KWL_Ip-Adress","?")." ".ReadingsVal("KWL_Control","Profil","?")." &")}\
     {fhem("setreading KWL_Control KWL_next_polling ".ReadingsVal("KWL_Call","timer_01_c02","?"))}\
     {fhem("setreading KWL_Status KWL_next_polling ".ReadingsVal("KWL_Call","timer_01_c02","?"))}\
     {Log 1, "KWL Profil geändert"})\
##\
## Abfrage der KWL in 5 Minuten Intervallen\
##\
DOELSEIF ([+00:05:00])\
     {system("/usr/bin/python /opt/fhem/python/bin/kwl_status.py ".ReadingsVal("KWL_Control","KWL_Ip-Adress","?")." ".ReadingsVal("KWL_Control","FHEM_Ip-Adress","?")." &")}\
     {Log 1, "KWL polling"}\
##\
## Publiziere den Intervall Timer\
##\
DOELSEIF ([KWL_Status:EXT_CYC_TIME])\
     {fhem("setreading KWL_Control KWL_next_polling ".ReadingsVal("KWL_Call","timer_01_c02","?"))}\
     {fhem("setreading KWL_Status KWL_next_polling ".ReadingsVal("KWL_Call","timer_01_c02","?"))}\
     {Log 1, "KWL new intervall"}
attr KWL_Call alias KWL_Call
attr KWL_Call checkReadingEvent 1
attr KWL_Call cmdState Profil geändert|KWL polling|KWL polling finished
attr KWL_Call do always
attr KWL_Call group KWL
attr KWL_Call icon file_manpage
attr KWL_Call room Heizung->System
attr KWL_Call sortby 04
attr KWL_Call verbose 0


Und dann noch den folgenden zwei Python Skripten:

fhem@raspberrypi:~/python/bin$ pwd
/opt/fhem/python/bin

fhem@raspberrypi:~/python/bin$ cat kwl_set_profil.py

# import logging
# logging.basicConfig(level=logging.DEBUG)

import json
import asyncio
from vallox_websocket_api import Vallox, PROFILE

import sys
kwl     = sys.argv[1]
profile = sys.argv[2]

try:
    with open('/opt/fhem/python/pwd.json', 'r') as f:
        credentials=json.load(f)
except Exception as e:
    print('Something went wrong: {}'.format(e))

client = Vallox(kwl) # Vallox unit IP

async def run():
    await client.get_profile() # RETURNS a PROFILE.* value

    if profile == "1":
         await client.set_profile(PROFILE.HOME)      # Permanently HOME profile
    elif profile == "2":
         await client.set_profile(PROFILE.AWAY)      # Permanently AWAY profile
    elif profile == "3":
         await client.set_profile(PROFILE.BOOST)     # BOOST profile for configured time ( 30 minutes )
    elif profile == "4":
         await client.set_profile(PROFILE.FIREPLACE) # FIREPLACE mode for configured timeout
    else:
         await client.set_profile(PROFILE.AWAY)      # Permanently AWAY profile

asyncio.get_event_loop().run_until_complete(run())



fhem@raspberrypi:~/python/bin$ pwd
/opt/fhem/python/bin

fhem@raspberrypi:~/python/bin$ cat kwl_status.py

# import logging
# logging.basicConfig(level=logging.DEBUG)

import fhem
import json
import asyncio
from vallox_websocket_api import Client

import sys
kwl = sys.argv[1]
web = sys.argv[2]

try:
    with open('/opt/fhem/python/pwd.json', 'r') as f:
        credentials=json.load(f)
except Exception as e:
    print('Something went wrong: {}'.format(e))

client = Client(kwl)
async def run():
#    metrics = await client.fetch_metrics()

    metrics = await client.fetch_metrics([
      'A_CYC_TEMP_EXHAUST_AIR',
      'A_CYC_TEMP_EXTRACT_AIR',
      'A_CYC_TEMP_OUTDOOR_AIR',
      'A_CYC_TEMP_SUPPLY_AIR',
      'A_CYC_TEMP_SUPPLY_CELL_AIR',
      'A_CYC_MODE',
      'A_CYC_STATE',
      'A_CYC_FAN_SPEED',
      'A_CYC_CELL_STATE',
      'A_CYC_IN_BYPASS',
      'A_CYC_MACHINE_MODEL',
      'A_CYC_DAY',
      'A_CYC_MONTH',
      'A_CYC_YEAR',
      'A_CYC_HOUR',
      'A_CYC_MINUTE',
      'A_CYC_MACHINE_MODEL',
      'A_CYC_MACHINE_TYPE',
      'A_CYC_FILTER_CHANGED_DAY',
      'A_CYC_FILTER_CHANGED_MONTH',
      'A_CYC_FILTER_CHANGED_YEAR',
      'A_CYC_REMAINING_TIME_FOR_FILTER',
      'A_CYC_BOOST_TIMER',
      'A_CYC_FIREPLACE_TIMER',
      'A_CYC_EXTRA_TIMER'
    ])

    message = json.dumps(metrics)

    from pprint import pprint
#    pprint(message)
#    pprint(metrics)

    fh = fhem.Fhem(web, protocol="https", port=8083, username=credentials["username"], password=credentials["password"])

    fh.send_cmd("setreading KWL_Status output " + message)

asyncio.get_event_loop().run_until_complete(run())


Ich habe bei mir standardmäßig bereits python auf python3 umgestellt, da ich bisher kein python verwendet habe.

pi@raspberrypi:~ $cd /usr/bin
pi@raspberrypi:~ $ ls -l /usr/bin/python
lrwxrwxrwx 1 root root 7 Aug 22 11:19 /usr/bin/python -> python3

pi@raspberrypi:~ $ sudo rm python

pi@raspberrypi:~ $ sudo ln -s python3 python

pi@raspberrypi:~ $ python --version
Python 3.5.3


Dann noch die Python Erweiterungen nicht vergessen

fhem@raspberrypi:~/python/bin$ pip install vallox-websocket-api

Collecting vallox-websocket-api
  Using cached https://www.piwheels.org/simple/vallox-websocket-api/vallox_websocket_api-2.2.0-py2.py3-none-any.whl
Collecting construct<3.0.0,>=2.9.0 (from vallox-websocket-api)
  Using cached https://www.piwheels.org/simple/construct/construct-2.9.45-py3-none-any.whl
Collecting websockets<8.0,>=7.0 (from vallox-websocket-api)
  Using cached https://www.piwheels.org/simple/websockets/websockets-7.0-cp35-cp35m-linux_armv6l.whl
Installing collected packages: construct, websockets, vallox-websocket-api
Successfully installed construct-2.9.45 vallox-websocket-api-2.2.0 websockets-7.0

fhem@raspberrypi:~/python/bin$ pip install fhem

Collecting fhem
  Downloading https://www.piwheels.org/simple/fhem/fhem-0.6.2-py2.py3-none-any.whl
Installing collected packages: fhem
Successfully installed fhem-0.6.2


Viele Grüße
    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick