mirror of
https://github.com/MichMich/MagicMirror.git
synced 2025-07-07 16:11:14 +00:00
Merge branch 'develop' of https://github.com/MichMich/MagicMirror into develop
This commit is contained in:
commit
607aa46032
@ -6,7 +6,9 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|||||||
## [2.1.0] - Unreleased
|
## [2.1.0] - Unreleased
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
- Finnish translation.
|
||||||
- Method to overwrite the module's header. [See documentation.](https://github.com/MichMich/MagicMirror/tree/develop/modules#getheader)
|
- Method to overwrite the module's header. [See documentation.](https://github.com/MichMich/MagicMirror/tree/develop/modules#getheader)
|
||||||
|
- Option to limit access to certain IP addresses based on the value of `ipWhitelist` in the `config.js`, default is access from localhost only (Issue [#456](https://github.com/MichMich/MagicMirror/issues/456))
|
||||||
|
|
||||||
### Updated
|
### Updated
|
||||||
- Modified translations for Frysk.
|
- Modified translations for Frysk.
|
||||||
|
@ -77,6 +77,8 @@ The following properties can be configured:
|
|||||||
| **Option** | **Description** |
|
| **Option** | **Description** |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| `port` | The port on which the MagicMirror² server will run on. The default value is `8080`. |
|
| `port` | The port on which the MagicMirror² server will run on. The default value is `8080`. |
|
||||||
|
| `ipWhitelist` | The list of IPs from which you are allowed to access the MagicMirror². The default value is `["127.0.0.1", "::ffff:127.0.0.1"]`.It is possible to specify IPs with subnet masks (`["127.0.0.1", "127.0.0.1/24"]`) or define ip ranges (`["127.0.0.1", ["192.168.0.1", "192.168.0.100"]]`).
|
||||||
|
|
|
||||||
| `kioskmode` | This allows MagicMirror² to run in Kiosk Mode. It protects from other programs popping on top of your screen. The default value is `false`|
|
| `kioskmode` | This allows MagicMirror² to run in Kiosk Mode. It protects from other programs popping on top of your screen. The default value is `false`|
|
||||||
| `language` | The language of the interface. (Note: Not all elements will be localized.) Possible values are `en`, `nl`, `ru`, `fr`, etc., but the default value is `en`. |
|
| `language` | The language of the interface. (Note: Not all elements will be localized.) Possible values are `en`, `nl`, `ru`, `fr`, etc., but the default value is `en`. |
|
||||||
| `timeFormat` | The form of time notation that will be used. Possible values are `12` or `24`. The default is `24`. |
|
| `timeFormat` | The form of time notation that will be used. Possible values are `12` or `24`. The default is `24`. |
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
var config = {
|
var config = {
|
||||||
port: 8080,
|
port: 8080,
|
||||||
|
ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1"],
|
||||||
|
|
||||||
language: 'en',
|
language: 'en',
|
||||||
timeFormat: 24,
|
timeFormat: 24,
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
var defaults = {
|
var defaults = {
|
||||||
port: 8080,
|
port: 8080,
|
||||||
kioskmode: false,
|
kioskmode: false,
|
||||||
|
ipWhitelist: ["127.0.0.1", "::ffff:127.0.0.1"],
|
||||||
|
|
||||||
language: "en",
|
language: "en",
|
||||||
timeFormat: 24,
|
timeFormat: 24,
|
||||||
|
12
js/server.js
12
js/server.js
@ -10,11 +10,23 @@ var app = require("express")();
|
|||||||
var server = require("http").Server(app);
|
var server = require("http").Server(app);
|
||||||
var io = require("socket.io")(server);
|
var io = require("socket.io")(server);
|
||||||
var path = require("path");
|
var path = require("path");
|
||||||
|
var ipfilter = require("express-ipfilter").IpFilter;
|
||||||
|
|
||||||
var Server = function(config, callback) {
|
var Server = function(config, callback) {
|
||||||
console.log("Starting server op port " + config.port + " ... ");
|
console.log("Starting server op port " + config.port + " ... ");
|
||||||
|
|
||||||
server.listen(config.port);
|
server.listen(config.port);
|
||||||
|
|
||||||
|
app.use(function(req, res, next) {
|
||||||
|
var result = ipfilter(config.ipWhitelist, {mode: "allow", log: false})(req, res, function(err) {
|
||||||
|
if (err === undefined) {
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
console.log(err.message);
|
||||||
|
res.status(403).send("This device is not allowed to access your mirror. <br> Please check your config.js or config.js.sample to change this.");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
app.use("/js", express.static(__dirname));
|
app.use("/js", express.static(__dirname));
|
||||||
app.use("/config", express.static(path.resolve(__dirname + "/../config")));
|
app.use("/config", express.static(path.resolve(__dirname + "/../config")));
|
||||||
app.use("/css", express.static(path.resolve(__dirname + "/../css")));
|
app.use("/css", express.static(path.resolve(__dirname + "/../css")));
|
||||||
|
@ -6,11 +6,11 @@ This document describes the way to develop your own MagicMirror² modules.
|
|||||||
|
|
||||||
All modules are loaded in the `modules` folder. The default modules are grouped together in the `modules/default` folder. Your module should be placed in a subfolder of `modules`. Note that any file or folder your create in the `modules` folder will be ignored by git, allowing you to upgrade the MagicMirror² without the loss of your files.
|
All modules are loaded in the `modules` folder. The default modules are grouped together in the `modules/default` folder. Your module should be placed in a subfolder of `modules`. Note that any file or folder your create in the `modules` folder will be ignored by git, allowing you to upgrade the MagicMirror² without the loss of your files.
|
||||||
|
|
||||||
A module can be placed in one single folder. Or multiple modules can be grouped in a subfoler. Note that name of the module must be unique. Even when a module with a similar name is placed in a different folder, they can't be loaded at the same time.
|
A module can be placed in one single folder. Or multiple modules can be grouped in a subfolder. Note that name of the module must be unique. Even when a module with a similar name is placed in a different folder, they can't be loaded at the same time.
|
||||||
|
|
||||||
### Files
|
### Files
|
||||||
- **modulename/modulename.js** - This is your core module script.
|
- **modulename/modulename.js** - This is your core module script.
|
||||||
- **modulename/node_helper.js** - This is an optional helper that whill be loaded by the node script. The node helper and module script can communicate with each other using an intergrated socket system.
|
- **modulename/node_helper.js** - This is an optional helper that will be loaded by the node script. The node helper and module script can communicate with each other using an intergrated socket system.
|
||||||
- **modulename/public** - Any files in this folder can be accesed via the browser on `/modulename/filename.ext`.
|
- **modulename/public** - Any files in this folder can be accesed via the browser on `/modulename/filename.ext`.
|
||||||
- **modulename/anyfileorfolder** Any other file or folder in the module folder can be used by the core module script. For example: *modulename/css/modulename.css* would be a good path for your additional module styles.
|
- **modulename/anyfileorfolder** Any other file or folder in the module folder can be used by the core module script. For example: *modulename/css/modulename.css* would be a good path for your additional module styles.
|
||||||
|
|
||||||
@ -104,7 +104,7 @@ The getScripts method is called to request any additional scripts that need to b
|
|||||||
getScripts: function() {
|
getScripts: function() {
|
||||||
return [
|
return [
|
||||||
'script.js', // will try to load it from the vendor folder, otherwise it will load is from the module folder.
|
'script.js', // will try to load it from the vendor folder, otherwise it will load is from the module folder.
|
||||||
'moment.js', // this file is available in the vendor folder, so it doesn't need to be avialable in the module folder.
|
'moment.js', // this file is available in the vendor folder, so it doesn't need to be available in the module folder.
|
||||||
this.file('anotherfile.js'), // this file will be loaded straight from the module folder.
|
this.file('anotherfile.js'), // this file will be loaded straight from the module folder.
|
||||||
'https://code.jquery.com/jquery-2.2.3.min.js', // this file will be loaded from the jquery servers.
|
'https://code.jquery.com/jquery-2.2.3.min.js', // this file will be loaded from the jquery servers.
|
||||||
]
|
]
|
||||||
@ -154,7 +154,7 @@ getTranslations: function() {
|
|||||||
####`getDom()`
|
####`getDom()`
|
||||||
**Should return:** Dom Object
|
**Should return:** Dom Object
|
||||||
|
|
||||||
Whenever the MagicMirror needs to update the information on screen (because it starts, or because your module asked a refresh using `this.updateDom()`), the system calls the getDom method. This method should therefor return a dom object.
|
Whenever the MagicMirror needs to update the information on screen (because it starts, or because your module asked a refresh using `this.updateDom()`), the system calls the getDom method. This method should therefore return a dom object.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
````javascript
|
````javascript
|
||||||
@ -202,7 +202,7 @@ notificationReceived: function(notification, payload, sender) {
|
|||||||
}
|
}
|
||||||
````
|
````
|
||||||
|
|
||||||
**Note:** the system sends two notifiations when starting up. These notifications could come in handy!
|
**Note:** the system sends two notifications when starting up. These notifications could come in handy!
|
||||||
|
|
||||||
|
|
||||||
- `ALL_MODULES_STARTED` - All modules are started. You can now send notifications to other modules.
|
- `ALL_MODULES_STARTED` - All modules are started. You can now send notifications to other modules.
|
||||||
@ -215,8 +215,8 @@ When using a node_helper, the node helper can send your module notifications. Wh
|
|||||||
- `notification` - String - The notification identifier.
|
- `notification` - String - The notification identifier.
|
||||||
- `payload` - AnyType - The payload of a notification.
|
- `payload` - AnyType - The payload of a notification.
|
||||||
|
|
||||||
**Note 1:** When a node helper send a notification, all modules of that module type receive the same notifications. <br>
|
**Note 1:** When a node helper sends a notification, all modules of that module type receive the same notifications. <br>
|
||||||
**Note 2:** The socket connection is established as soon as the module sends it's first message using [sendSocketNotification](thissendsocketnotificationnotification-payload).
|
**Note 2:** The socket connection is established as soon as the module sends its first message using [sendSocketNotification](thissendsocketnotificationnotification-payload).
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
````javascript
|
````javascript
|
||||||
@ -234,7 +234,7 @@ When a module will be shown after it was previously hidden (using the `module.sh
|
|||||||
|
|
||||||
### Module instance methods
|
### Module instance methods
|
||||||
|
|
||||||
Each module instance has some handy methods which can be helpfull building your module.
|
Each module instance has some handy methods which can be helpful building your module.
|
||||||
|
|
||||||
|
|
||||||
####`this.file(filename)`
|
####`this.file(filename)`
|
||||||
@ -246,7 +246,7 @@ If you want to create a path to a file in your module folder, use the `file()` m
|
|||||||
####`this.updateDom(speed)`
|
####`this.updateDom(speed)`
|
||||||
***speed* Number** - Optional. Animation speed in milliseconds.<br>
|
***speed* Number** - Optional. Animation speed in milliseconds.<br>
|
||||||
|
|
||||||
Whenever your module need to be updated, call the `updateDom(speed)` method. It requests the MagicMirror core to update it's dom object. If you define the speed, the content update will be animated, but only if the content will realy change.
|
Whenever your module need to be updated, call the `updateDom(speed)` method. It requests the MagicMirror core to update its dom object. If you define the speed, the content update will be animated, but only if the content will really change.
|
||||||
|
|
||||||
As an example: the clock modules calls this method every second:
|
As an example: the clock modules calls this method every second:
|
||||||
|
|
||||||
@ -265,7 +265,7 @@ start: function() {
|
|||||||
***notification* String** - The notification identifier.<br>
|
***notification* String** - The notification identifier.<br>
|
||||||
***payload* AnyType** - Optional. A notification payload.<br>
|
***payload* AnyType** - Optional. A notification payload.<br>
|
||||||
|
|
||||||
If you want to send a notification to all other modules, use the `sendNotification(notification, payload)`. All other modules will receive the message via the [notificationReceived](#notificationreceivednotification-payload-sender) method. In that case, the sender is automaticly set to the instance calling the sendNotification method.
|
If you want to send a notification to all other modules, use the `sendNotification(notification, payload)`. All other modules will receive the message via the [notificationReceived](#notificationreceivednotification-payload-sender) method. In that case, the sender is automatically set to the instance calling the sendNotification method.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
````javascript
|
````javascript
|
||||||
@ -276,7 +276,7 @@ this.sendNotification('MYMODULE_READY_FOR_ACTION', {foo:bar});
|
|||||||
***notification* String** - The notification identifier.<br>
|
***notification* String** - The notification identifier.<br>
|
||||||
***payload* AnyType** - Optional. A notification payload.<br>
|
***payload* AnyType** - Optional. A notification payload.<br>
|
||||||
|
|
||||||
If you want to send a notification to the node_helper, use the `sendSocketNotification(notification, payload)`. Only the node_helper of this module will recieve the socket notification.
|
If you want to send a notification to the node_helper, use the `sendSocketNotification(notification, payload)`. Only the node_helper of this module will receive the socket notification.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
````javascript
|
````javascript
|
||||||
@ -287,7 +287,7 @@ this.sendSocketNotification('SET_CONFIG', this.config);
|
|||||||
***speed* Number** - Optional, The speed of the hide animation in milliseconds.
|
***speed* Number** - Optional, The speed of the hide animation in milliseconds.
|
||||||
***callback* Function** - Optional, The callback after the hide animation is finished.
|
***callback* Function** - Optional, The callback after the hide animation is finished.
|
||||||
|
|
||||||
To hide a module, you can call the `hide(speed, callback)` method. You can call the hide method on the module instance itselve using `this.hide()`, but of course you can also hide an other module using `anOtherModule.hide()`.
|
To hide a module, you can call the `hide(speed, callback)` method. You can call the hide method on the module instance itself using `this.hide()`, but of course you can also hide another module using `anOtherModule.hide()`.
|
||||||
|
|
||||||
**Note 1:** If the hide animation is canceled, for instance because the show method is called before the hide animation was finished, the callback will not be called.<br>
|
**Note 1:** If the hide animation is canceled, for instance because the show method is called before the hide animation was finished, the callback will not be called.<br>
|
||||||
**Note 2:** If the hide animation is hijacked (an other method calls hide on the same module), the callback will not be called.<br>
|
**Note 2:** If the hide animation is hijacked (an other method calls hide on the same module), the callback will not be called.<br>
|
||||||
@ -297,7 +297,7 @@ To hide a module, you can call the `hide(speed, callback)` method. You can call
|
|||||||
***speed* Number** - Optional, The speed of the show animation in milliseconds.
|
***speed* Number** - Optional, The speed of the show animation in milliseconds.
|
||||||
***callback* Function** - Optional, The callback after the show animation is finished.
|
***callback* Function** - Optional, The callback after the show animation is finished.
|
||||||
|
|
||||||
To show a module, you can call the `show(speed, callback)` method. You can call the show method on the module instance itselve using `this.show()`, but of course you can also show an other module using `anOtherModule.show()`.
|
To show a module, you can call the `show(speed, callback)` method. You can call the show method on the module instance itself using `this.show()`, but of course you can also show another module using `anOtherModule.show()`.
|
||||||
|
|
||||||
**Note 1:** If the show animation is canceled, for instance because the hide method is called before the show animation was finished, the callback will not be called.<br>
|
**Note 1:** If the show animation is canceled, for instance because the hide method is called before the show animation was finished, the callback will not be called.<br>
|
||||||
**Note 2:** If the show animation is hijacked (an other method calls show on the same module), the callback will not be called.<br>
|
**Note 2:** If the show animation is hijacked (an other method calls show on the same module), the callback will not be called.<br>
|
||||||
@ -345,7 +345,7 @@ var NodeHelper = require("node_helper");
|
|||||||
module.exports = NodeHelper.create({});
|
module.exports = NodeHelper.create({});
|
||||||
````
|
````
|
||||||
|
|
||||||
Of course, the above helper would not do anything usefull. So with the information above, you should be able to make it a bit more sophisticated.
|
Of course, the above helper would not do anything useful. So with the information above, you should be able to make it a bit more sophisticated.
|
||||||
|
|
||||||
### Available module instance properties
|
### Available module instance properties
|
||||||
|
|
||||||
@ -389,7 +389,7 @@ This is a link to the IO instance. It will allow you to do some Socket.IO magic.
|
|||||||
This method is called when a node helper gets instantiated. In most cases you do not need to subclass this method.
|
This method is called when a node helper gets instantiated. In most cases you do not need to subclass this method.
|
||||||
|
|
||||||
####`start()`
|
####`start()`
|
||||||
This method is called when all node helper are loaded an the system is ready to boot up. The start method is a perfect place to define any additional module properties:
|
This method is called when all node helpers are loaded and the system is ready to boot up. The start method is a perfect place to define any additional module properties:
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
````javascript
|
````javascript
|
||||||
@ -400,12 +400,12 @@ start: function() {
|
|||||||
````
|
````
|
||||||
|
|
||||||
####`socketNotificationReceived: function(notification, payload)`
|
####`socketNotificationReceived: function(notification, payload)`
|
||||||
With this method, your node helper can receive notifications form your modules. When this method is called, it has 2 arguments:
|
With this method, your node helper can receive notifications from your modules. When this method is called, it has 2 arguments:
|
||||||
|
|
||||||
- `notification` - String - The notification identifier.
|
- `notification` - String - The notification identifier.
|
||||||
- `payload` - AnyType - The payload of a notification.
|
- `payload` - AnyType - The payload of a notification.
|
||||||
|
|
||||||
**Note:** The socket connection is established as soon as the module sends it's first message using [sendSocketNotification](thissendsocketnotificationnotification-payload).
|
**Note:** The socket connection is established as soon as the module sends its first message using [sendSocketNotification](thissendsocketnotificationnotification-payload).
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
````javascript
|
````javascript
|
||||||
@ -416,15 +416,15 @@ socketNotificationReceived: function(notification, payload) {
|
|||||||
|
|
||||||
### Module instance methods
|
### Module instance methods
|
||||||
|
|
||||||
Each node helper has some handy methods which can be helpfull building your module.
|
Each node helper has some handy methods which can be helpful building your module.
|
||||||
|
|
||||||
####`this.sendSocketNotification(notification, payload)`
|
####`this.sendSocketNotification(notification, payload)`
|
||||||
***notification* String** - The notification identifier.<br>
|
***notification* String** - The notification identifier.<br>
|
||||||
***payload* AnyType** - Optional. A notification payload.<br>
|
***payload* AnyType** - Optional. A notification payload.<br>
|
||||||
|
|
||||||
If you want to send a notification to all your modules, use the `sendSocketNotification(notification, payload)`. Only the module of your module type will recieve the socket notification.
|
If you want to send a notification to all your modules, use the `sendSocketNotification(notification, payload)`. Only the module of your module type will receive the socket notification.
|
||||||
|
|
||||||
**Note:** Since all instances of you module will receive the notifications, it's your task to make sure the right module responds to your messages.
|
**Note:** Since all instances of your module will receive the notifications, it's your task to make sure the right module responds to your messages.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
````javascript
|
````javascript
|
||||||
@ -447,10 +447,10 @@ To make a selection of all currently loaded module instances, run the `MM.getMod
|
|||||||
|
|
||||||
|
|
||||||
#####`.withClass(classnames)`
|
#####`.withClass(classnames)`
|
||||||
***classnames* String or Array** - The class names on which you want to filer.
|
***classnames* String or Array** - The class names on which you want to filter.
|
||||||
**Returns Array** - An array with module instances.<br>
|
**Returns Array** - An array with module instances.<br>
|
||||||
|
|
||||||
If you want to make a selection based on one ore more class names, use the withClass method on a result of the `MM.getModules()` method. The argument of the `withClass(classname)` method can be an array, or space separated string.
|
If you want to make a selection based on one or more class names, use the withClass method on a result of the `MM.getModules()` method. The argument of the `withClass(classname)` method can be an array, or space separated string.
|
||||||
|
|
||||||
**Examples:**
|
**Examples:**
|
||||||
````javascript
|
````javascript
|
||||||
@ -476,7 +476,7 @@ var modules = MM.getModules().exceptWithClass(['classname1','classname2']);
|
|||||||
***module* Module Object** - The reference to a module you want to remove from the results.
|
***module* Module Object** - The reference to a module you want to remove from the results.
|
||||||
**Returns Array** - An array with module instances.<br>
|
**Returns Array** - An array with module instances.<br>
|
||||||
|
|
||||||
If you to remove a specific module instance from a selection based on a classname, use the exceptWithClass method on a result of the `MM.getModules()` method. This can be helpfull if you want to select all module instances except the instance of your module.
|
If you to remove a specific module instance from a selection based on a classname, use the exceptWithClass method on a result of the `MM.getModules()` method. This can be helpful if you want to select all module instances except the instance of your module.
|
||||||
|
|
||||||
**Examples:**
|
**Examples:**
|
||||||
````javascript
|
````javascript
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"electron-prebuilt": "^0.37.2",
|
"electron-prebuilt": "^0.37.2",
|
||||||
"express": "^4.14.0",
|
"express": "^4.14.0",
|
||||||
|
"express-ipfilter": "latest",
|
||||||
"feedme": "latest",
|
"feedme": "latest",
|
||||||
"iconv-lite": "latest",
|
"iconv-lite": "latest",
|
||||||
"moment": "latest",
|
"moment": "latest",
|
||||||
|
28
translations/fi.json
Normal file
28
translations/fi.json
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
/* GENERAL */
|
||||||
|
"LOADING": "Lataa …",
|
||||||
|
|
||||||
|
/* CALENDAR */
|
||||||
|
"TODAY": "Tänään",
|
||||||
|
"TOMORROW": "Huomenna",
|
||||||
|
"RUNNING": "Meneillään",
|
||||||
|
"EMPTY": "Ei tulevia tapahtumia.",
|
||||||
|
|
||||||
|
/* WEATHER */
|
||||||
|
"N": "P",
|
||||||
|
"NNE": "PPI",
|
||||||
|
"NE": "PI",
|
||||||
|
"ENE": "IPI",
|
||||||
|
"E": "I",
|
||||||
|
"ESE": "IEI",
|
||||||
|
"SE": "EI",
|
||||||
|
"SSE": "EEI",
|
||||||
|
"S": "E",
|
||||||
|
"SSW": "EEL",
|
||||||
|
"SW": "EL",
|
||||||
|
"WSW": "LEL",
|
||||||
|
"W": "L",
|
||||||
|
"WNW": "LPL",
|
||||||
|
"NW": "PL",
|
||||||
|
"NNW": "PPL"
|
||||||
|
}
|
@ -9,6 +9,7 @@ var translations = {
|
|||||||
"en" : "translations/en.json", // English
|
"en" : "translations/en.json", // English
|
||||||
"nl" : "translations/nl.json", // Dutch
|
"nl" : "translations/nl.json", // Dutch
|
||||||
"de" : "translations/de.json", // German
|
"de" : "translations/de.json", // German
|
||||||
|
"fi" : "translations/fi.json", // Suomi
|
||||||
"fr" : "translations/fr.json", // French
|
"fr" : "translations/fr.json", // French
|
||||||
"fy" : "translations/fy.json", // Frysk
|
"fy" : "translations/fy.json", // Frysk
|
||||||
"es" : "translations/es.json", // Spanish
|
"es" : "translations/es.json", // Spanish
|
||||||
|
Loading…
x
Reference in New Issue
Block a user