├── requirements.txt ├── Dockerfile ├── README.md ├── settings-sample.py └── mqtt-zwift.py /requirements.txt: -------------------------------------------------------------------------------- 1 | python-daemon 2 | zwift-client 3 | paho-mqtt 4 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:2.7-stretch 2 | 3 | COPY . /app 4 | WORKDIR /app 5 | RUN pip install -r requirements.txt 6 | 7 | CMD ["python", "mqtt-zwift.py"] 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mqtt-zwift 2 | 3 | This little script logs on zwift, grab live stats and publish then to a MQTT topic in json format. Run as standonline script or a docker container. Dont forget to copy and edit settings-sample.py to settings.py. 4 | -------------------------------------------------------------------------------- /settings-sample.py: -------------------------------------------------------------------------------- 1 | # config zwift 2 | username = ' 5 | #check https://zwiftinsider.com/find-zwift-id/ 6 | 7 | # config mqtt broker 8 | mqtt_host_name = "" 9 | mqtt_client_name = "zwift" 10 | mqtt_login = " 0: 18 | return True 19 | else: 20 | return False 21 | 22 | def players(players): 23 | 24 | for player in players['friendsInWorld']: 25 | print(player) 26 | 27 | if __name__ == "__main__": 28 | 29 | 30 | mqtt_client = mqtt.Client(mqtt_client_name) 31 | mqtt_client.username_pw_set(mqtt_login, mqtt_pw) 32 | mqtt_client.will_set(mqtt_topic_will, payload="Offline", retain=True) 33 | mqtt_client.connect(mqtt_host_name) 34 | mqtt_client.publish(mqtt_topic_will, payload="Online", retain=True) 35 | 36 | client = Client(username, password) 37 | world = client.get_world(1) 38 | 39 | #players(world.players) 40 | 41 | if check_online(world.players): 42 | while(True): 43 | try: 44 | status = world.player_status(player_id) 45 | error = 0 46 | except: 47 | error += 1 48 | #print("error while retrieving player status. Error count = " + str(error)) 49 | if error > 5: 50 | break 51 | if status.sport == 0: 52 | msg_dict = { 'is_online': 1, 'sport': 'cycling', 'hr': status.heartrate, 'power': status.power, 'speed': float("{:.2f}".format(float(status.speed)/1000000.0)) } 53 | elif status.sport == 1: 54 | msg_dict = { 'is_online': 1, 'sport': 'running', 'hr': status.heartrate, 'speed': float("{:.2f}".format(float(status.speed)/1000000.0)) } 55 | mqtt_client.publish(mqtt_topic, payload=json.dumps(msg_dict), retain=False) 56 | time.sleep(10) 57 | else: 58 | #print("not online yet") 59 | mqtt_client.publish(mqtt_topic, payload=OFFLINE_MSG, retain=False) 60 | time.sleep(60) 61 | --------------------------------------------------------------------------------