How to: Integrate a "Homey-App Logger" to your App, for a simple global logger in homey

During the development of my new Homey-App S.A.R.A.H, I came across a simple solution for the topic “Global-Log”. The respective app-developer only has to integrate a few lines of code into his app and the app-user has to create 3 additional flows (for log, error and debug messages) by passing the log messages to the log app.

Chris

Change

  • Prefix for Error & Debug message changed

Bdw: I haven’t migrated to Homey v2 yet, but it should work …

For App-Developers:

(Just Copy&Paste the code)

Add to app.js

	onInit() {
		// Initialize Homey-App Loggers
		this.appLogListener = new Homey.FlowCardTrigger("app_log_listener");
		this.appLogListener.register().registerRunListener(Promise.resolve(true));

		this.appErrorListener = new Homey.FlowCardTrigger("app_error_listener");
		this.appErrorListener.register().registerRunListener(Promise.resolve(true));

		this.appDebugListener = new Homey.FlowCardTrigger("app_debug_listener");
		this.appDebugListener.register().registerRunListener(Promise.resolve(true));

		// Sample
		// this.log("Log message");
		// this.error("Error-Log message");
		// this.debug("Debug-Log message");

		this.log(`${Homey.app.manifest.name.en}-App - v${Homey.app.manifest.version} is running...`);
        ...
     }
	// Homey-App Loggers

	log(msg) {
		super.log(msg);
		// Send to logger
		if (this.appLogListener) {
			this.appLogListener.trigger({ name: `${Homey.app.manifest.name.en}`, msg: msg }).catch(err => super.error(err.message));
		}
	}

	error(msg) {
		super.error(`### ${msg}`);
		// Send to error logger
		if (this.appErrorListener) {
			this.appErrorListener.trigger({ name: `${Homey.app.manifest.name.en}`, msg: msg }).catch(err => super.error(err.message));
		}
	}

	debug(msg) {
		super.log(`»»» ${msg}`);
		// Send to debug logger
		if (this.appDebugListener) {
			this.appDebugListener.trigger({ name: `${Homey.app.manifest.name.en}`, msg: msg }).catch(err => super.error(err.message));
		}
	}

Add to App.json

	"flow": {
		"triggers": [
            ......
			{
				"id": "app_log_listener",
				"title": { "en": "Homey-App - Logger" },
				"tokens": [
					{
						"name": "name",
						"type": "string",
						"title": {
							"en": "name"
						},
						"example": {
							"en": "App-Name"
						}
					},
					{
						"name": "msg",
						"type": "string",
						"title": {
							"en": "msg"
						},
						"example": {
							"en": "Log message"
						}
					}
				]
			},
			{
				"id": "app_error_listener",
				"title": { "en": "Homey-App - Error-Logger" },
				"tokens": [
					{
						"name": "name",
						"type": "string",
						"title": {
							"en": "name"
						},
						"example": {
							"en": "App-Name"
						}
					},
					{
						"name": "msg",
						"type": "string",
						"title": {
							"en": "msg"
						},
						"example": {
							"en": "Error message"
						}
					}
				]
			},
			{
				"id": "app_debug_listener",
				"title": { "en": "Homey-App - Debug-Logger" },
				"tokens": [
					{
						"name": "name",
						"type": "string",
						"title": {
							"en": "name"
						},
						"example": {
							"en": "App-Name"
						}
					},
					{
						"name": "msg",
						"type": "string",
						"title": {
							"en": "msg"
						},
						"example": {
							"en": "Debug message"
						}
					}
				]
			}

For App-User:

If you miss this feature in your app, ask the respective app developer if he can implement the “Homey-App Logger”.

Add Homey-App - Logger (with Simple LOG)

Create a Flow: [App-Name] Homey-App - Logger

Add Homey-App - Error-Logger (with Simple LOG)

Create a Flow: [App-Name] Homey-App - Error-Logger

Add Homey-App - Debug-Logger (with Simple LOG)

(Works only in debug-mode)

Create a Flow: [App-Name] Homey-App - Debug-Logger -Flow

Sample:

Basic:

Simple-LOG output:

2019-03-08 09:54:08 [S.A.R.A.H] Log message
2019-03-08 09:54:08 [S.A.R.A.H] ERROR: Error-Log message
2019-03-08 09:54:08 [S.A.R.A.H] DEBUG: Debug-Log message

Terminal output:

2019-03-08 09:54:08 [log] [SarahApp] Log message
2019-03-08 09:54:08 [err] [SarahApp] Error-Log message
2019-03-08 09:54:08 [log] [SarahApp] DEBUG: Debug-Log message

Real-World example:

Simple-LOG output:

2019-03-08 15:23:39 [Simple LOG] Cleared all logging data
2019-03-08 15:24:11 [S.A.R.A.H] S.A.R.A.H-App - v0.0.1 is running...
2019-03-08 15:24:11 [S.A.R.A.H] Initialize settings
2019-03-08 15:24:34 [Home::Internal] onSwitch-InitSarah
2019-03-08 15:24:34 [S.A.R.A.H] Event fired -> Home::Internal #initSarah ()
2019-03-08 15:24:34 [S.A.R.A.H] Event matched -> Home::Internal #initSarah ()
2019-03-08 15:24:34 [Home::Internal] at-InitSarah
2019-03-08 15:24:34 [S.A.R.A.H] Event fired -> Home::Internal #initHome ()
2019-03-08 15:24:34 [S.A.R.A.H] Event matched -> Home::Internal #initHome ()
2019-03-08 15:24:34 [LivingRoom::Light] Home::Internal::initHome
2019-03-08 15:24:34 [S.A.R.A.H] Event fired -> Wohnzimmer::Light #powerOff ()
2019-03-08 15:24:34 [S.A.R.A.H] Event matched -> Wohnzimmer::Light #powerOff ()
2019-03-08 15:24:35 [LivingRoom::Light] atPowerOff
2019-03-08 15:24:38 [Home::Internal] atInitSarah - ToD > Daytime
2019-03-08 15:24:38 [S.A.R.A.H] Event fired -> Home::ToD #atDaytime ()
2019-03-08 15:24:38 [S.A.R.A.H] Event matched -> Home::ToD #atDaytime ()
2019-03-08 15:24:38 [Home::ToD] atDaytime
2019-03-08 17:50:44 [Home::ToD] onAuto-Evening
2019-03-08 17:50:44 [S.A.R.A.H] Event fired -> Home::ToD #atEvening ()
2019-03-08 17:50:44 [S.A.R.A.H] Event matched -> Home::ToD #atEvening ()
2019-03-08 17:50:44 [S.A.R.A.H] Event matched -> Home::ToD #atEvening ()
2019-03-08 17:50:44 [S.A.R.A.H] Event matched -> Home::ToD #atEvening ()
2019-03-08 17:50:44 [LivingRoom::Light] Home::ToD::atEvening
2019-03-08 17:50:44 [Home::ToD] atEvening
2019-03-08 17:50:45 [S.A.R.A.H] Event fired -> Büro::Light #easyLight-mode ()
2019-03-08 17:50:45 [S.A.R.A.H] Event fired -> Wohnzimmer::Light #light-mode ()
2019-03-08 17:50:45 [S.A.R.A.H] State changed -> Home::ToD::timeOfDay Daytime [to] Evening
2019-03-08 17:50:45 [S.A.R.A.H] Event matched -> Büro::Light #easyLight-mode ()
2019-03-08 17:50:45 [Office::Light] atEasyLight-Mode
2019-03-08 17:50:45 [S.A.R.A.H] Event matched -> Wohnzimmer::Light #light-mode ()
2019-03-08 17:50:45 [LivingRoom::Light] atLight-Mode
2019-03-08 17:50:45 [S.A.R.A.H] State-Value matched -> Home::ToD::timeOfDay = Evening
2019-03-08 17:50:45 [S.A.R.A.H] State changed -> Büro::Light::power Off [to] On
2019-03-08 17:50:46 [S.A.R.A.H] State changed -> Wohnzimmer::Light::power Off [to] On

Terminal output:

2019-03-08 10:02:54 [log] [SarahApp] S.A.R.A.H-App - v0.0.1 is running...
2019-03-08 10:02:54 [log] [SarahApp] Initialize settings
2019-03-08 10:03:14 [log] [SarahApp] Event fired -> Home::Internal #initSarah ()
2019-03-08 10:03:14 [log] [SarahApp] Event matched -> Home::Internal #initSarah ()
2019-03-08 10:03:14 [log] [SarahApp] Event fired -> Home::Internal #initHome ()
2019-03-08 10:03:14 [log] [SarahApp] Event matched -> Home::Internal #initHome ()
2019-03-08 10:03:14 [log] [SarahApp] Event fired -> Wohnzimmer::Light #powerOff ()
2019-03-08 10:03:14 [log] [SarahApp] Event matched -> Wohnzimmer::Light #powerOff ()
2019-03-08 10:03:17 [log] [SarahApp] Event fired -> Home::ToD #atDaytime ()
2019-03-08 10:03:18 [log] [SarahApp] Event matched -> Home::ToD #atDaytime ()
1 Like

Reserved for later use

Has this been implemented somewhere or is this useful for someone?

EDIT: it is mentioned already in the Simple-Log app.

Do you mean something like this ?:grin:?

Advanced Flow Logger:

App Logger:

When proceeding as described above, athom was not so enthusiastic. But in the meantime I have rewritten (my) whole logging system so that everyone is hopefully happy.

The Advanced Flow Logger is ready and I’m using it on my end.

At the moment I’m implementing the App-Logger, via the new SimpleLogApp interface, but it’s not running smoothly yet because of TimeOut problems on the App side.

BDW:
I made @Arie_J_Godschalk a feature request for the implementation of a SYSLOG interface in the SimpleLog App, then we would have “the wishful happy package” …

Chris


AdF-Logger based on Advanced Triggers:

1 Like

Yeah, i will have a look into it and work on the timeout.
I haven’t had the issue yet, but i might be able to reproduce the issue.

Only send a lot of data from another app, then…:wink:

1 Like