Docker Containers with fhempy which can be connected to FHEM
If you want two modules, you have to start two containers.
- Debian trixie (slim Python base image)
- Python 3.13.15
- fhempy 0.1.764
Running fhempy in a docker environment is done by starting the container and connect it within the same network as your fhem container:
Example is assuming, that your FHEM network is named net and already defined as in fhem-docker
fhempy-googleweather:
container_name: fhempy-googleweather
networks:
- net
image: ghcr.io/fhem/fhempy-docker_google_weather:1.8.0
fhempy-mqtt:
container_name: fhempy-mqtt
networks:
- net
image: ghcr.io/fhem/fhempy-docker_mqtt_ha_discovery:1.8.0
The image name is ghcr.io/fhem/fhempy-docker_<module> (see the table below).
Give every container a fixed name (container_name), you need it in the FHEM definition.
To start your container right away:
docker run -d --name fhempy-googleweather ghcr.io/fhem/fhempy-docker_google_weather:1.8.0
As noted in the upstream repository, fhempy runs not in the same container as fhem. So you have to follow, the remote peer setup instructions.
flowchart LR
subgraph fhem["FHEM container"]
d1["fhempy device<br/>weather<br/>(google_weather)"]
d2["fhempy device<br/>mqtt<br/>(mqtt_ha_discovery)"]
io1["BindingsIo<br/>fhempy_weather"]
io2["BindingsIo<br/>fhempy_mqtt"]
d1 -- "IODev" --> io1
d2 -- "IODev" --> io2
end
subgraph c1["Container fhempy-googleweather"]
m1["fhempy with<br/>google_weather only"]
end
subgraph c2["Container fhempy-mqtt"]
m2["fhempy with<br/>mqtt_ha_discovery only"]
end
io1 -- "WebSocket, port 15733<br/>(opened by FHEM)" --> m1
io2 -- "WebSocket, port 15733<br/>(opened by FHEM)" --> m2
- Every container runs one module and listens on port
15733. FHEM opens the connection to it. - In FHEM you need one
BindingsIoper container. It only is the connection, it does not know the module. - The module is chosen by the
fhempydevice (define <name> fhempy <module> ...). The attributeIODevdecides which container handles this device. - Containers only contain the dependencies of their own module and can not install anything at runtime. A device which is handled by the wrong container fails with
Module failed to load: <module> ... No module named '...'.
Example:
- Containers are named
fhempy-googleweatherandfhempy-mqtt - FHEM and fhempy are on the same network
- Containernames can bei resolved via DNS
In FHEM a BindingsIo definition must be defined for each container, pointing to the container name:
define fhempy_weather BindingsIo fhempy-googleweather:15733 fhempy
define fhempy_mqtt BindingsIo fhempy-mqtt:15733 fhempy
Wait until both devices are in state opened, then define the fhempy devices and set IODev directly:
define weather fhempy google_weather Berlin
attr weather IODev fhempy_weather
define mqtt fhempy mqtt_ha_discovery
attr mqtt IODev fhempy_mqtt
Check with list <device> that IODev is the BindingsIo of the right container. If you define the device before the BindingsIo is opened, the state fhempy server offline can stay in the device although the connection works. Check the container log, if you are not sure.
fhempy announces itself via mDNS. After the first container is connected, it searches the network for other fhempy containers which are not yet connected to FHEM and creates a BindingsIo named fhempy_peer_<IP> (with the IP address, not the container name) for each of them.
This is meant for fhempy instances in the same local network, but it is not needed if you define the containers by name:
- If such a peer already exists, defining your own
BindingsIofor the same container fails withalready defined and using the same port. Use the peer (you canrenameit) or define yours first. - If a container gets a new IP address (e.g. after recreating it), the peer points to whatever container has this IP now. Prefer
BindingsIodefinitions with the container name or use fixed IP addresses. - Deleting a
BindingsIocan stop the corresponding container, restart it afterwards.
| Module | Image name |
|---|---|
| aktionsfinder | ghcr.io/fhem/fhempy-docker_aktionsfinder:1.8.0,ghcr.io/fhem/fhempy-docker_aktionsfinder:1,ghcr.io/fhem/fhempy-docker_aktionsfinder:latest |
| alphaesscloud | ghcr.io/fhem/fhempy-docker_alphaesscloud:1.8.0,ghcr.io/fhem/fhempy-docker_alphaesscloud:1,ghcr.io/fhem/fhempy-docker_alphaesscloud:latest |
| arp_presence | ghcr.io/fhem/fhempy-docker_arp_presence:1.8.0,ghcr.io/fhem/fhempy-docker_arp_presence:1,ghcr.io/fhem/fhempy-docker_arp_presence:latest |
| ble_monitor | ghcr.io/fhem/fhempy-docker_ble_monitor:1.8.0,ghcr.io/fhem/fhempy-docker_ble_monitor:1,ghcr.io/fhem/fhempy-docker_ble_monitor:latest |
| ble_presence | ghcr.io/fhem/fhempy-docker_ble_presence:1.8.0,ghcr.io/fhem/fhempy-docker_ble_presence:1,ghcr.io/fhem/fhempy-docker_ble_presence:latest |
| ble_reset | ghcr.io/fhem/fhempy-docker_ble_reset:1.8.0,ghcr.io/fhem/fhempy-docker_ble_reset:1,ghcr.io/fhem/fhempy-docker_ble_reset:latest |
| blue_connect | ghcr.io/fhem/fhempy-docker_blue_connect:1.8.0,ghcr.io/fhem/fhempy-docker_blue_connect:1,ghcr.io/fhem/fhempy-docker_blue_connect:latest |
| bt_presence | ghcr.io/fhem/fhempy-docker_bt_presence:1.8.0,ghcr.io/fhem/fhempy-docker_bt_presence:1,ghcr.io/fhem/fhempy-docker_bt_presence:latest |
| ddnssde | ghcr.io/fhem/fhempy-docker_ddnssde:1.8.0,ghcr.io/fhem/fhempy-docker_ddnssde:1,ghcr.io/fhem/fhempy-docker_ddnssde:latest |
| discover_ble | ghcr.io/fhem/fhempy-docker_discover_ble:1.8.0,ghcr.io/fhem/fhempy-docker_discover_ble:1,ghcr.io/fhem/fhempy-docker_discover_ble:latest |
| discover_mdns | ghcr.io/fhem/fhempy-docker_discover_mdns:1.8.0,ghcr.io/fhem/fhempy-docker_discover_mdns:1,ghcr.io/fhem/fhempy-docker_discover_mdns:latest |
| discover_upnp | ghcr.io/fhem/fhempy-docker_discover_upnp:1.8.0,ghcr.io/fhem/fhempy-docker_discover_upnp:1,ghcr.io/fhem/fhempy-docker_discover_upnp:latest |
| dlna_dmr | ghcr.io/fhem/fhempy-docker_dlna_dmr:1.8.0,ghcr.io/fhem/fhempy-docker_dlna_dmr:1,ghcr.io/fhem/fhempy-docker_dlna_dmr:latest |
| energie_gv_at | ghcr.io/fhem/fhempy-docker_energie_gv_at:1.8.0,ghcr.io/fhem/fhempy-docker_energie_gv_at:1,ghcr.io/fhem/fhempy-docker_energie_gv_at:latest |
| eq3bt | ghcr.io/fhem/fhempy-docker_eq3bt:1.8.0,ghcr.io/fhem/fhempy-docker_eq3bt:1,ghcr.io/fhem/fhempy-docker_eq3bt:latest |
| erelax_vaillant | ghcr.io/fhem/fhempy-docker_erelax_vaillant:1.8.0,ghcr.io/fhem/fhempy-docker_erelax_vaillant:1,ghcr.io/fhem/fhempy-docker_erelax_vaillant:latest |
| esphome | ghcr.io/fhem/fhempy-docker_esphome:1.8.0,ghcr.io/fhem/fhempy-docker_esphome:1,ghcr.io/fhem/fhempy-docker_esphome:latest |
| fhem_forum | ghcr.io/fhem/fhempy-docker_fhem_forum:1.8.0,ghcr.io/fhem/fhempy-docker_fhem_forum:1,ghcr.io/fhem/fhempy-docker_fhem_forum:latest |
| fusionsolar | ghcr.io/fhem/fhempy-docker_fusionsolar:1.8.0,ghcr.io/fhem/fhempy-docker_fusionsolar:1,ghcr.io/fhem/fhempy-docker_fusionsolar:latest |
| geizhals | ghcr.io/fhem/fhempy-docker_geizhals:1.8.0,ghcr.io/fhem/fhempy-docker_geizhals:1,ghcr.io/fhem/fhempy-docker_geizhals:latest |
| gfprobt | ghcr.io/fhem/fhempy-docker_gfprobt:1.8.0,ghcr.io/fhem/fhempy-docker_gfprobt:1,ghcr.io/fhem/fhempy-docker_gfprobt:latest |
| github_backup | ghcr.io/fhem/fhempy-docker_github_backup:1.8.0,ghcr.io/fhem/fhempy-docker_github_backup:1,ghcr.io/fhem/fhempy-docker_github_backup:latest |
| github_restore | ghcr.io/fhem/fhempy-docker_github_restore:1.8.0,ghcr.io/fhem/fhempy-docker_github_restore:1,ghcr.io/fhem/fhempy-docker_github_restore:latest |
| goodwe | ghcr.io/fhem/fhempy-docker_goodwe:1.8.0,ghcr.io/fhem/fhempy-docker_goodwe:1,ghcr.io/fhem/fhempy-docker_goodwe:latest |
| google_weather | ghcr.io/fhem/fhempy-docker_google_weather:1.8.0,ghcr.io/fhem/fhempy-docker_google_weather:1,ghcr.io/fhem/fhempy-docker_google_weather:latest |
| googlecast | ghcr.io/fhem/fhempy-docker_googlecast:1.8.0,ghcr.io/fhem/fhempy-docker_googlecast:1,ghcr.io/fhem/fhempy-docker_googlecast:latest |
| gree_climate | ghcr.io/fhem/fhempy-docker_gree_climate:1.8.0,ghcr.io/fhem/fhempy-docker_gree_climate:1,ghcr.io/fhem/fhempy-docker_gree_climate:latest |
| helloworld | ghcr.io/fhem/fhempy-docker_helloworld:1.8.0,ghcr.io/fhem/fhempy-docker_helloworld:1,ghcr.io/fhem/fhempy-docker_helloworld:latest |
| homekit | ghcr.io/fhem/fhempy-docker_homekit:1.8.0,ghcr.io/fhem/fhempy-docker_homekit:1,ghcr.io/fhem/fhempy-docker_homekit:latest |
| huawei_modbus | ghcr.io/fhem/fhempy-docker_huawei_modbus:1.8.0,ghcr.io/fhem/fhempy-docker_huawei_modbus:1,ghcr.io/fhem/fhempy-docker_huawei_modbus:latest |
| ikos | ghcr.io/fhem/fhempy-docker_ikos:1.8.0,ghcr.io/fhem/fhempy-docker_ikos:1,ghcr.io/fhem/fhempy-docker_ikos:latest |
| kia_hyundai | ghcr.io/fhem/fhempy-docker_kia_hyundai:1.8.0,ghcr.io/fhem/fhempy-docker_kia_hyundai:1,ghcr.io/fhem/fhempy-docker_kia_hyundai:latest |
| meross | ghcr.io/fhem/fhempy-docker_meross:1.8.0,ghcr.io/fhem/fhempy-docker_meross:1,ghcr.io/fhem/fhempy-docker_meross:latest |
| miflora | ghcr.io/fhem/fhempy-docker_miflora:1.8.0,ghcr.io/fhem/fhempy-docker_miflora:1,ghcr.io/fhem/fhempy-docker_miflora:latest |
| miio | ghcr.io/fhem/fhempy-docker_miio:1.8.0,ghcr.io/fhem/fhempy-docker_miio:1,ghcr.io/fhem/fhempy-docker_miio:latest |
| miscale | ghcr.io/fhem/fhempy-docker_miscale:1.8.0,ghcr.io/fhem/fhempy-docker_miscale:1,ghcr.io/fhem/fhempy-docker_miscale:latest |
| mitemp2 | ghcr.io/fhem/fhempy-docker_mitemp2:1.8.0,ghcr.io/fhem/fhempy-docker_mitemp2:1,ghcr.io/fhem/fhempy-docker_mitemp2:latest |
| mitemp | ghcr.io/fhem/fhempy-docker_mitemp:1.8.0,ghcr.io/fhem/fhempy-docker_mitemp:1,ghcr.io/fhem/fhempy-docker_mitemp:latest |
| mqtt_ha_discovery | ghcr.io/fhem/fhempy-docker_mqtt_ha_discovery:1.8.0,ghcr.io/fhem/fhempy-docker_mqtt_ha_discovery:1,ghcr.io/fhem/fhempy-docker_mqtt_ha_discovery:latest |
| nefit | ghcr.io/fhem/fhempy-docker_nefit:1.8.0,ghcr.io/fhem/fhempy-docker_nefit:1,ghcr.io/fhem/fhempy-docker_nefit:latest |
| nespresso_ble | ghcr.io/fhem/fhempy-docker_nespresso_ble:1.8.0,ghcr.io/fhem/fhempy-docker_nespresso_ble:1,ghcr.io/fhem/fhempy-docker_nespresso_ble:latest |
| piclock | ghcr.io/fhem/fhempy-docker_piclock:1.8.0,ghcr.io/fhem/fhempy-docker_piclock:1,ghcr.io/fhem/fhempy-docker_piclock:latest |
| prusalink | ghcr.io/fhem/fhempy-docker_prusalink:1.8.0,ghcr.io/fhem/fhempy-docker_prusalink:1,ghcr.io/fhem/fhempy-docker_prusalink:latest |
| pyit600 | ghcr.io/fhem/fhempy-docker_pyit600:1.8.0,ghcr.io/fhem/fhempy-docker_pyit600:1,ghcr.io/fhem/fhempy-docker_pyit600:latest |
| rct_power | ghcr.io/fhem/fhempy-docker_rct_power:1.8.0,ghcr.io/fhem/fhempy-docker_rct_power:1,ghcr.io/fhem/fhempy-docker_rct_power:latest |
| ring | ghcr.io/fhem/fhempy-docker_ring:1.8.0,ghcr.io/fhem/fhempy-docker_ring:1,ghcr.io/fhem/fhempy-docker_ring:latest |
| seatconnect | ghcr.io/fhem/fhempy-docker_seatconnect:1.8.0,ghcr.io/fhem/fhempy-docker_seatconnect:1,ghcr.io/fhem/fhempy-docker_seatconnect:latest |
| skodaconnect | ghcr.io/fhem/fhempy-docker_skodaconnect:1.8.0,ghcr.io/fhem/fhempy-docker_skodaconnect:1,ghcr.io/fhem/fhempy-docker_skodaconnect:latest |
| spotify | ghcr.io/fhem/fhempy-docker_spotify:1.8.0,ghcr.io/fhem/fhempy-docker_spotify:1,ghcr.io/fhem/fhempy-docker_spotify:latest |
| tibber | ghcr.io/fhem/fhempy-docker_tibber:1.8.0,ghcr.io/fhem/fhempy-docker_tibber:1,ghcr.io/fhem/fhempy-docker_tibber:latest |
| tuya_cloud | ghcr.io/fhem/fhempy-docker_tuya_cloud:1.8.0,ghcr.io/fhem/fhempy-docker_tuya_cloud:1,ghcr.io/fhem/fhempy-docker_tuya_cloud:latest |
| tuya | ghcr.io/fhem/fhempy-docker_tuya:1.8.0,ghcr.io/fhem/fhempy-docker_tuya:1,ghcr.io/fhem/fhempy-docker_tuya:latest |
| tuya_smartlife | ghcr.io/fhem/fhempy-docker_tuya_smartlife:1.8.0,ghcr.io/fhem/fhempy-docker_tuya_smartlife:1,ghcr.io/fhem/fhempy-docker_tuya_smartlife:latest |
| volvo | ghcr.io/fhem/fhempy-docker_volvo:1.8.0,ghcr.io/fhem/fhempy-docker_volvo:1,ghcr.io/fhem/fhempy-docker_volvo:latest |
| volvo_software_update | ghcr.io/fhem/fhempy-docker_volvo_software_update:1.8.0,ghcr.io/fhem/fhempy-docker_volvo_software_update:1,ghcr.io/fhem/fhempy-docker_volvo_software_update:latest |
| warema | ghcr.io/fhem/fhempy-docker_warema:1.8.0,ghcr.io/fhem/fhempy-docker_warema:1,ghcr.io/fhem/fhempy-docker_warema:latest |
| websitetests | ghcr.io/fhem/fhempy-docker_websitetests:1.8.0,ghcr.io/fhem/fhempy-docker_websitetests:1,ghcr.io/fhem/fhempy-docker_websitetests:latest |
| wienerlinien | ghcr.io/fhem/fhempy-docker_wienerlinien:1.8.0,ghcr.io/fhem/fhempy-docker_wienerlinien:1,ghcr.io/fhem/fhempy-docker_wienerlinien:latest |
| wienernetze_smartmeter | ghcr.io/fhem/fhempy-docker_wienernetze_smartmeter:1.8.0,ghcr.io/fhem/fhempy-docker_wienernetze_smartmeter:1,ghcr.io/fhem/fhempy-docker_wienernetze_smartmeter:latest |
| xiaomi_gateway3_device | ghcr.io/fhem/fhempy-docker_xiaomi_gateway3_device:1.8.0,ghcr.io/fhem/fhempy-docker_xiaomi_gateway3_device:1,ghcr.io/fhem/fhempy-docker_xiaomi_gateway3_device:latest |
| xiaomi_gateway3 | ghcr.io/fhem/fhempy-docker_xiaomi_gateway3:1.8.0,ghcr.io/fhem/fhempy-docker_xiaomi_gateway3:1,ghcr.io/fhem/fhempy-docker_xiaomi_gateway3:latest |
| xiaomi_tokens | ghcr.io/fhem/fhempy-docker_xiaomi_tokens:1.8.0,ghcr.io/fhem/fhempy-docker_xiaomi_tokens:1,ghcr.io/fhem/fhempy-docker_xiaomi_tokens:latest |
| zappi | ghcr.io/fhem/fhempy-docker_zappi:1.8.0,ghcr.io/fhem/fhempy-docker_zappi:1,ghcr.io/fhem/fhempy-docker_zappi:latest |
| zigbee2mqtt | ghcr.io/fhem/fhempy-docker_zigbee2mqtt:1.8.0,ghcr.io/fhem/fhempy-docker_zigbee2mqtt:1,ghcr.io/fhem/fhempy-docker_zigbee2mqtt:latest |