Read the statement by Michael Teeuw here.
MMM-PublicTransportHafas
-
@KristjanESPERANTO Have you found in node seeker?
Ohhh now Hafas module again : D
But your module is working for Gotha Hauptbahnhof. Can we speak German or we require English only on this forum? -
Error code ops_blocked when searching in MMM-PublicTransportHub module using node --run query
-
@Mati_93 Have you managed to figure it out yet? :) If not, please describe again what you’re trying to do and what’s not working. And most importantly, which module you’re using.
-
@KristjanESPERANTO well, on the HAFAS (older module) I see only 22 position when I am searching using node. Why? How to change pagination.
Your new Module HUB is working for Gotha Hauptbahnhof… perfectly. I want to use both modules if possible.
And still on theolder module HAFAS is update socket issue 1
On the searching mode inside node query can not use German letters. How to configure node CLI?
On your module Hub node console looks exactly:

-
So ID searching tool from node query still won’t work with 18 März Straße but i found stationId via gemini :) (i dont’ like it). In my code i am using two TransportHub modules (TransportHafas is in code but i am not using in my carousel because is not working) . 18 Marz Strasse station does not return an error but says that there is no departures. Ansbach station works perfecly.
let config = { address: "localhost", // Lub "127.0.0.1" port: 8080, basePath: "/", ipWhitelist: ["127.0.0.1", "::1"], // Zezwala na dostęp tylko z tego samego urządzenia useHttps: false, httpsPrivateKey: "", httpsCertificate: "", language: "pl", locale: "pl", logLevel: ["INFO", "LOG", "WARN", "ERROR"], timeFormat: 24, units: "metric", modules: [ { module: "MMM-KeyBindings", config: { evdev: { enabled: false }, enableKeyboard: true, } }, { module: "MMM-Carousel", position: "bottom_bar", config: { transitionInterval: 20000, ignoreModules: ["clock", "alert","Station_Gotha"], mode: "slides", showPageIndicators: true, showPageControls: true, slides: { main: ["weather"], "Slide 2": ["MMM-OpenWeatherForecast", "newsfeed"], "Slide 3": ["calendar", "compliments"], "Slide 4": ["MMM-PublicTransportHub"], "Slide 5": ["MMM-EasyPix"] }, keyBindings: { enabled: true, map: { NextSlide: "ArrowRight", PrevSlide: "ArrowLeft", Pause: "ArrowDown", Slide0: "Home" }, mode: "DEFAULT" } } }, { module: "MMM-EasyPix", position: "top_right", config: { picName: "Alona.jpg", // Enter the picture file name. You can even use a direct internet URL to an image. maxWidth: "70%" // Size picture precisely. Retains aspect ratio. } }, { module: "alert" }, { module: "updatenotification", header: "US Holidays", position: "top_bar", }, { module: "calendar", header: "Holidays in Thüringen", position: "top_left", config: { calendars: [ { fetchInterval: 7 * 24 * 60 * 60 * 1000, symbol: "calendar-check", url: "https://www.officeholidays.com/ics-all/germany/thuringia" } ] } }, { module: "compliments", position: "lower_third", }, { module: "weather", position: "top_right", classes : "weather-forecast", header: "Weather Forecast", config: { weatherProvider: "openmeteo", type: "forecast", lat: 50.9494849, lon: 10.7014435 } }, { module: "weather", position: "top_right", classes : "weather-current", header: "Weather Current", config: { weatherProvider: "openmeteo", type: "current", lat: 50.9494849, lon: 10.7014435 } }, { module: "MMM-OpenWeatherForecast", position: "top_right", header: "Forecast", config: { apikey: "23cf27375cfb96bd9c4bcfe389c729c6", //only string here latitude: 50.9494849, //number works here longitude: "10.7014435", //so does a string units: "metric", // dopasowane do reszty updateInterval: 600000, // co 10 min animationSpeed: 1000, lang: "pl", label_hourlyTimeFormat: "H:mm", label_sunriseTimeFormat: "H:mm", label_days: ["Ndz", "Pon", "Wt", " Śr", "Czw", "Pt", "Sob"], showCurrentConditions: true, showHourlyForecast: true, showDailyForecast: true, hourlyForecastInterval: 3, dailyForecastDays: 7 } }, { module: "newsfeed", position: "bottom_bar", config: { feeds: [ { title: "New York Times", url: "https://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml" } ], showSourceTitle: true, showPublishDate: true, broadcastNewsFeeds: true, broadcastNewsUpdates: true } }, { module: 'clock', position: 'bottom_bar' }, { module: "MMM-PublicTransportHafas", position: "bottom_left", config: { hafasProfile: "vmt", carouselId: "My_Station", stationID: "167050", stationName: "Gotha, 18.-März-Straße", direction: "", excludedTransportationTypes: [], ignoredLines: [], timeToStation: 10, displayLastUpdate: true, maxUnreachableDepartures: 0, maxReachableDepartures: 7, showColoredLineSymbols: true, customLineStyles: "", showOnlyLineNumbers: false, showTableHeadersAsSymbols: true, useColorForRealtimeInfo: true } }, { module: "MMM-PublicTransportHub", position: "top_left", header: "Gotha, 18.-März-Straße", config: { carouselId: "Station_Gotha", provider: "vmt", stationId: "de-DELFI_de:16067:167050", updatesEvery: 60, maxDepartures: 12, timeToStation: 4, maxUnreachableDepartures: 2, excludeCanceled: false, lineFilter: [], directionFilter: [], productFilter: ["tram", "bus"], showDelay: false, showRealtimeIndicator: true, showRemarks: true, columnOrder: ["time", "line", "direction", "platform"], lineStylePreset: "none", replaceInLineNames: { "Bus ": "" }, requestTimeoutMs: 12000, fetchRetries: 1, contact: "mateusz.kujawa93@gmail.com" } }, { module: "MMM-PublicTransportHub", position: "bottom_right", header: "Ansbach", config: { carouselId: "Station_Ansbach", provider: "transitous", stationId: "de-DELFI_de:09561:11000:53:4", updatesEvery: 60, maxDepartures: 12, timeToStation: 4, maxUnreachableDepartures: 2, excludeCanceled: false, lineFilter: [], directionFilter: [], productFilter: ["tram", "bus"], showDelay: false, showRealtimeIndicator: true, showRemarks: true, columnOrder: ["time", "line", "direction", "platform"], lineStylePreset: "none", replaceInLineNames: { "Bus ": "" }, requestTimeoutMs: 12000, fetchRetries: 1, contact: "mateusz.kujawa93@gmail.com" } }, ] }; /***** DO NOT EDIT THE LINE BELOW *****/ if (typeof module !== "undefined") { module.exports = config; } please help me to figure it out together. -
@Mati_93 Wow, that a bunch of separate issues. These three minimal configurations work for me with the Gotha stop. Please test them one at a time first. I had to play with
timeInFutureMinutesa bit to get departures.MMM-PublicTransportHub with HAFAS
{ module: "MMM-PublicTransportHub", position: "top_left", header: "Gotha, 18.-März-Straße", config: { provider: "hafas", hafasProfile: "vmt", stationId: "167050", timeInFutureMinutes: 720 } },Older MMM-PublicTransportHafas
{ module: "MMM-PublicTransportHafas", position: "top_right", header: "Gotha, 18.-März-Straße", config: { hafasProfile: "vmt", stationID: "167050", timeInFuture: 720 } },MMM-PublicTransportHub with Transitous
{ module: "MMM-PublicTransportHub", position: "top_center", header: "Gotha, 18.-März-Straße", config: { provider: "transitous", stationId: "de-DELFI_de:16067:167050::16705000", contact: "@Mati_93", timeInFutureMinutes: 720 } },Please note that
vmtis a HAFAS profile, not a provider. Therefore the Hub needsprovider: "hafas"together withhafasProfile: "vmt".The garbled German characters look like a UTF-8/locale problem on Raspberry Pi OS. Please check:
locale locale charmapThe result should contain
UTF-8. You can configure this with:sudo raspi-configI think you have to select Localization Options → Locale and enable
de_DE.UTF-8 UTF-8. Log in again or reboot afterwards.As a quick test, you can search without special characters:
18 Maerz Strasse GothaOPS_BLOCKEDusually comes from a blocked DB endpoint. For Gotha, please use the regionalvmtprofile instead of a DB profile. -
@KristjanESPERANTO I can use German signs everywhere on terminal but not in node.js.
After I type node – run query i am no longer permitted to use äüß umlauts.
Second problem : HAFAS is over. All the time I have socket issue.
As you seen in my project i am using carouselId variable because on every slide I have different station. On HAFAS this was possible but on your new module Hub this is impossible(or maybe i don’t know the new way) . New modules understand only module name instead of carouselId. Please take a deeper look on my slide config.let config = { address: "localhost", // Lub "127.0.0.1" port: 8080, basePath: "/", ipWhitelist: ["127.0.0.1", "::1"], // Zezwala na dostęp tylko z tego samego urządzenia useHttps: false, httpsPrivateKey: "", httpsCertificate: "", language: "pl", locale: "pl", logLevel: ["INFO", "LOG", "WARN", "ERROR"], timeFormat: 24, units: "metric", modules: [ { module: "MMM-KeyBindings", config: { evdev: { enabled: false }, enableKeyboard: true, } }, { module: "MMM-Carousel", position: "bottom_bar", config: { transitionInterval: 20000, ignoreModules: ["clock", "alert","Station_Gotha_18_März"], mode: "slides", showPageIndicators: true, showPageControls: true, slides: { main: ["weather"], "Slide 2": ["MMM-OpenWeatherForecast", "newsfeed"], "Slide 3": ["calendar", "compliments","MMM-PublicTransportHub"], "Slide 4": ["MMM-PublicTransportHub"], "Slide 5": ["MMM-EasyPix"] }, keyBindings: { enabled: true, map: { NextSlide: "ArrowRight", PrevSlide: "ArrowLeft", Pause: "ArrowDown", Slide0: "Home" }, mode: "DEFAULT" } } }, { module: "MMM-EasyPix", position: "top_right", config: { picName: "Alona.jpg", // Enter the picture file name. You can even use a direct internet URL to an image. maxWidth: "70%" // Size picture precisely. Retains aspect ratio. } }, { module: "alert" }, { module: "updatenotification", header: "US Holidays", position: "top_bar", }, { module: "calendar", header: "Holidays in Thüringen", position: "top_left", config: { calendars: [ { fetchInterval: 7 * 24 * 60 * 60 * 1000, symbol: "calendar-check", url: "https://www.officeholidays.com/ics-all/germany/thuringia" } ] } }, { module: "compliments", position: "lower_third", }, { module: "weather", position: "top_right", classes : "weather-forecast", header: "Weather Forecast", config: { weatherProvider: "openmeteo", type: "forecast", lat: 50.9494849, lon: 10.7014435 } }, { module: "weather", position: "top_right", classes : "weather-current", header: "Weather Current", config: { weatherProvider: "openmeteo", type: "current", lat: 50.9494849, lon: 10.7014435 } }, { module: "MMM-OpenWeatherForecast", position: "top_right", header: "Forecast", config: { apikey: "23cf27375cfb96bd9c4bcfe389c729c6", //only string here latitude: 50.9494849, //number works here longitude: "10.7014435", //so does a string units: "metric", // dopasowane do reszty updateInterval: 600000, // co 10 min animationSpeed: 1000, lang: "pl", label_hourlyTimeFormat: "H:mm", label_sunriseTimeFormat: "H:mm", label_days: ["Ndz", "Pon", "Wt", " Śr", "Czw", "Pt", "Sob"], showCurrentConditions: true, showHourlyForecast: true, showDailyForecast: true, hourlyForecastInterval: 3, dailyForecastDays: 7 } }, { module: "newsfeed", position: "bottom_bar", config: { feeds: [ { title: "New York Times", url: "https://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml" } ], showSourceTitle: true, showPublishDate: true, broadcastNewsFeeds: true, broadcastNewsUpdates: true } }, { module: 'clock', position: 'bottom_bar' }, { module: "MMM-PublicTransportHafas", position: "bottom_left", config: { carouselId: "My_Station", hafasProfile: "vmt", stationID: "167050", timeInFuture: 720, stationName: "Gotha, Hauptbahnhof", direction: "", excludedTransportationTypes: [], ignoredLines: [], timeToStation: 10, displayLastUpdate: true, maxUnreachableDepartures: 0, maxReachableDepartures: 7, showColoredLineSymbols: true, customLineStyles: "", showOnlyLineNumbers: false, showTableHeadersAsSymbols: true, useColorForRealtimeInfo: true } }, { module: "MMM-PublicTransportHub", position: "bottom_left", header: "Gotha, 18.-März-Straße", config: { carouselId: "Station_Gotha_18_März", provider: "transitous", hafasProfile: "vmt", stationId: "de-DELFI_de:16067:167050::16705000", timeInFutureMinutes: 720, updatesEvery: 60, maxDepartures: 12, timeToStation: 4, maxUnreachableDepartures: 2, excludeCanceled: false, lineFilter: [], directionFilter: [], productFilter: ["tram", "bus"], showDelay: false, showRealtimeIndicator: true, showRemarks: true, columnOrder: ["time", "line", "direction", "platform"], lineStylePreset: "none", replaceInLineNames: { "Bus ": "" }, requestTimeoutMs: 12000, fetchRetries: 1, contact: "mateusz.kujawa93@gmail.com" } }, { module: "MMM-PublicTransportHub", position: "bottom_right", header: "Ansbach", config: { carouselId: "Station_Ansbach", provider: "transitous", stationId: "de-DELFI_de:09561:11000:53:4", updatesEvery: 60, maxDepartures: 12, timeToStation: 4, maxUnreachableDepartures: 2, excludeCanceled: false, lineFilter: [], directionFilter: [], productFilter: ["tram", "bus"], showDelay: false, showRealtimeIndicator: true, showRemarks: true, columnOrder: ["time", "line", "direction", "platform"], lineStylePreset: "none", replaceInLineNames: { "Bus ": "" }, requestTimeoutMs: 12000, fetchRetries: 1, contact: "mateusz.kujawa93@gmail.com" } }, { module: "MMM-PublicTransportHub", position: "bottom_right", header: "Gotha, Hauptbahnhof", config: { carouselId: "Station_Gotha", provider: "transitous", hafasProfile: "vmt", stationId: "de-DELFI_de:16067:8010136", timeInFutureMinutes: 720, updatesEvery: 60, maxDepartures: 12, timeToStation: 4, maxUnreachableDepartures: 2, excludeCanceled: false, lineFilter: [], directionFilter: [], productFilter: ["tram", "bus"], showDelay: false, showRealtimeIndicator: true, showRemarks: true, columnOrder: ["time", "line", "direction", "platform"], lineStylePreset: "none", replaceInLineNames: { "Bus ": "" }, requestTimeoutMs: 12000, fetchRetries: 1, contact: "mateusz.kujawa93@gmail.com" } }, ] }; /***** DO NOT EDIT THE LINE BELOW *****/ if (typeof module !== "undefined") { module.exports = config; }For Slide 3 and 4 I have no solution. Your module Hub understand carouselId only when i put it in ignoreModules list!

EDIT! I’ve found a solution : O to the carouselId!
{ module: "MMM-Carousel", position: "bottom_bar", config: { transitionInterval: 20000, ignoreModules: ["clock", "alert","Station_Gotha_18_März"], mode: "slides", showPageIndicators: true, showPageControls: true, slides: { main: ["weather"], "Slide 2": ["MMM-OpenWeatherForecast", "newsfeed"], "Slide 3": ["calendar", "compliments",{name: "MMM-PublicTransportHub", carouselId: "Station_Ansbach" }], "Slide 4": [{ name: "MMM-PublicTransportHub", carouselId: "Station_Gotha" }], "Slide 5": ["MMM-EasyPix"] }, keyBindings: { enabled: true, map: { NextSlide: "ArrowRight", PrevSlide: "ArrowLeft", Pause: "ArrowDown", Slide0: "Home" }, mode: "DEFAULT" } } },dictionaries were the key. Sorry for my bad level of programming.
Still bad that hafas module is over. I liked design of hafas module much more.
Now everyhing is working on HUB module just like before it has been running on HAFASmodule (clock and main station is permanent on the screen on every slide and other modules and stations shows only with dedicated ones slides.) I like this combination. Still have not found a solution to UTF encoding in node.js query searching tool. -
@Mati_93 Great, I’m glad you got the carousel setup working!
I don’t have a hot tip for the umlaut problem at the moment since I can’t reproduce it on my system.
You mentioned that you liked the design of the old HAFAS module more. What exactly do you prefer about it, and what is missing or different for you in MMM-PublicTransportHub? Maybe we can improve that :)
-
@KristjanESPERANTO haha Kristjan, there in hafas was displayed important delay for each position if occured. To be honest sweet train and clock icons on the layout schedule were very nice for eyes. Im pretty sure station ID had been easier to find on HAFAS module too (more friendly IDs with less display problems)
-
There, HAFAS displayed important delays for each departure.
The module supports this, but Transitous apparently does not receive real-time data for your station. The open-source community is doing impressive work trying to collect real-time data wherever possible, but this is unfortunately difficult in some regions.
HAFAS interfaces were never really intended for the kind of free use we make of them, and access is becoming more and more restricted. You could contact your local transport association and ask why they do not provide real-time data through an open API, preferably GTFS-RT. This would allow projects like Transitous, and therefore MMM-PublicTransportHub, to use it.
The train and clock icons in the timetable looked very nice.
That was already on my to-do list. I have now added a similar header to MMM-PublicTransportHub, so you only need to update the module.
Station IDs were easier to find with the HAFAS module.
Those IDs come from the provider, so there is not much I can change about their format. I actually prefer the Transitous IDs because they are real DHIDs and work globally.
The display problem with umlauts is still a bit mysterious. The query scripts of both modules are not fundamentally very different, so I currently do not have a reliable explanation for why it only happens on your machine with the new query tool.
-
@KristjanESPERANTO thanks a lot .
Sorry I mean umlauts don’t work on both node run query (hafas and hub) but on the HAFAS module it had simply required less …less precise data and forgave the absence of umlauts. Output (results) were clearlier. On HAFAS I found my station (18 März Straße) by myself on December 2025, and on new hub module I needed your help .
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login