Read the statement by Michael Teeuw here.
.txt file include
-
@strawberry-3-141
Ok, i will try step by step.
Beginning with my first probleme:
The Output message (displayed on the mirror) is only displaying one word after the “identifyer-word”identifyer "Meldung"
Stellmotor Antrieb blockiert
MagicMirror Display onlyStellmotor
Antrieb blockiert is missingThe
identifyer-wordsare Meldung Zone ZeitThe content from my txt:
Meldung Stellmotor Antrieb blockiert Zone Nebenantrieb Zeit 6.Juni 2018 10:40 +++ENDE DER DATEI+++My edited
sensor.js:Module.register("Home-Status",{ defaults: { updateInterval: 0.5 * 60 * 1000 //reads the file every 30 seconds }, start: function(){ this.sendSocketNotification("START", this.config); }, socketNotificationReceived: function(notification, payload) { if(notification === "DATA"){ this.dataFile = payload; this.updateDom(); } }, getDom: function(){ var wrapper = document.createElement("div"); if(this.dataFile){ var meldungRegExp = /Meldung (.*?) /ig; var meldung = meldungRegExp.exec(this.dataFile)[1]; var zoneRegExp = /Zone (.*?) /ig; var zone = zoneRegExp.exec(this.dataFile)[1]; var zeitRegExp = /Zeit (.*?) /ig; var zeit = zeitRegExp.exec(this.dataFile)[1]; wrapper.innerHTML = "Meldung: " + meldung + " Zone: " + zone + " Zeit: " + zeit; } else { wrapper.innerHTML = "No Data"; } return wrapper; } });Result wich is displayed at MagicMirror:
Meldung:Stellmotor Zone:Nebenantrieb Zeit:6.Juni -
@saschasp your regular expressens are different from the one i posted, use them and I’m sure it will work
-
hi,
sorry to be dragging up old posts, but im trying to get my mirror to display the contents of a txt file and i have it partly working… i have the contents displaying on my mirror but its all showing up on one line, how can i display it with each line break as in txt file?thanks
-
@banbutcher you will have to replace the line feeds (\n) with html breaks (
) -
hi again,
im after getting my script to update my txt file with the names of downloaded movies and tv series… how would i go about reading the title of the series and just having the title and info ie:
if title has S**E** in it then
filename - Archer S01E01pilot 1080p x265.mkv
desired result - Archer S01E01else its a movie and just add movie name
i think this is the bit of code im to edit but i havent got it working :(
getDom: function(){ var wrapper = document.createElement("div"); if(this.dataFile){ var meldungRegExp = /Meldung (.*?) /ig; var meldung = meldungRegExp.exec(this.dataFile)[1]; var zoneRegExp = /Zone (.*?) /ig; var zone = zoneRegExp.exec(this.dataFile)[1]; var zeitRegExp = /Zeit (.*?) /ig; var zeit = zeitRegExp.exec(this.dataFile)[1]; wrapper.innerHTML = "Meldung: " + meldung + " Zone: " + zone + " Zeit: " + zeit; } else { wrapper.innerHTML = "No Data"; } return wrapper; } });thanks
Richie
-
@banbutcher said in .txt file include:
Archer S01E01pilot 1080p x265.mkv
using the regex tester,
https://regex101.com/I think this is the regex u want
/.*[S][(0-9)]+[E][(0-9)]+/ -
that worked great…
however, im a little bit stuck again… your expression works fine and return the correct result but only on the first line of the file and only if i remove the [1] from the end of line 5 of the code
getDom: function(){ var wrapper = document.createElement("div"); if(this.dataFile){ var splitRegExp = /.*[S][(0-9)]+[E][(0-9)]+/ig; var split = splitRegExp.exec(this.dataFile)[1]; wrapper.innerHTML = split; } else { wrapper.innerHTML = "No Data"; } return wrapper; }do i need to stick it in some kind of loop? or am i reading the contents of file wrong?
again thanks for your help :)
-
@banbutcher is dataFile an array of filenames? then yes, you’ll need a loop.
so, you are moving part of name a, to a new array
then part of name b to the next slot in the arrayarray.push(item)
adds item to the end of the arrayname_of_array =[] initializes name_of_array to be an empty array
then u will need to format the array of partial names
var x = name_of_array.join(separator)
will turn the array into x, a string with separator between the names -
Band.Of.Brothers.E01.1080p.5.1Ch.BluRay.ReEnc-DeeJayAhmed.srt <br> Archer S01E03 Diversity Hire (1080p x265 10bit S94 Joy).mkv <br> devs.s01e02.720p.hdtv.x264-river[eztv].mkv <br> What.We.Do.in.the.Shadows.S02E02.Ghosts.720p.AMZN.WEBRip.DDP5.1.x264-NTb[eztv.io].mkv <br> What.We.Do.in.the.Shadows.S02E01.Resurrection.720p.AMZN.WEBRip.DDP5.1.x264-NTb[eztv.io].mkv <br>this is the file im reading from… im not sure if thats an array, sorry and i want them outputted same line by line just missing the trailing parts.
again thanks for your help :)
-
@banbutcher reading how
-
this is my main module .js
i think this is where im reading from :/
Module.register("deluge",{ defaults: { updateInterval: 10 * 60 * 1000 //reads the file every 10 mins }, start: function(){ this.sendSocketNotification("START", this.config); }, socketNotificationReceived: function(notification, payload) { if(notification === "DATA"){ this.dataFile = payload; this.updateDom(); } }, // getDom: function(){ // var wrapper = document.createElement("div"); // if(this.dataFile){ // wrapper.innerHTML = this.dataFile; // } else { // wrapper.innerHTML = "No data"; // } // return wrapper; // } getDom: function(){ var wrapper = document.createElement("div"); if(this.dataFile){ var splitRegExp = /.*[S][(0-9)]+[E][(0-9)]+/ig; var split = splitRegExp.exec(this.dataFile); wrapper.innerHTML = split; } else { wrapper.innerHTML = "No Data"; } return wrapper; } });again thanks for your help :)
im in way overmy head here!
-
@banbutcher reading in the node_helper, sending up to the module.
-
Node_helper :)
const NodeHelper = require("node_helper"); const fs= require("fs"); module.exports = NodeHelper.create({ //here comes the part of the nodehelper after the 3 dots as posted above socketNotificationReceived: function(notification, payload) { if(notification === "START"){ this.config = payload; this.readData(); setInterval(() => { this.readData(); }, this.config.updateInterval); } }, readData: function(){ //to read a file to do the following fs.readFile("new-tv-list.txt", "utf8", (err, data) => { if (err) throw err; this.sendSocketNotification("DATA", data); }); } }); -
@banbutcher I won’t have time to look at this tonight
-
@sdetweil
not a problem at all, i really appreciate your help so far in this topic and every other question ive had across the board! :thumbs_up_light_skin_tone: -
@banbutcher ok, the fs.readFile() returns ALL the content of the file. I still would remove the utf8.
but you want a list of names, not a stream of characters…
so you need to split the stream into an array.a list of text ‘lines’ has a character after each, called a line feed, we don’t want those
but the last filename MAY or MAY NOT be followed by a line feed. (depends on how the file was created)
anyhow we can fix that
I would change the readData function in node_helper like this
readData: function(){ //to read a file to do the following fs.readFile("new-tv-list.txt", (err, data) => { var output_data = null // if there was no error if (!err){ // convert byte stream to array of names output_data=data.toString().concat("\n").split('\n') } // always send something back to module, so it can display messages // might be null if there was an error this.sendSocketNotification("DATA", output_data); }); }then to fix the module side
build an html table structurevar wrapper = document.createElement("div"); if(this.dataFile){ var output_list= []; // setup regex, no i no g (only once, and case sensitive) var splitRegExp = /.*[S][(0-9)]+[E][(0-9)]+/; // loop thru the list of filenames for(filename of this.dataFile) { // if the name is not zero length (split could have returned for just linefeed if(filename.length >0) { // get the filename prefix var split = splitRegExp.exec(filename); // save name to the output list, as a table entry // remove space after the ->< , the forum hides everything after unless a space // table has a row, output_list.push("< tr>< td>") // with data output_list.push(split) // end of data and row output_list.push("< /td>< /tr>") } } // insert the table into the wrapper wrapper.innerHTML = "< table>" + output_list.join('')+ "< /table>"; } else { -
you can also you divs instead of a table, and then set a css style
‘display’:‘inline-flex’
‘flex-direction’:‘vertical’and u can also use code to create the tree instead of text (don’t use the output_list anymore)
(and u can use this with divs too, don’t need as many elements)var table=document.createElement("table") wrapper.appendChild(table) for(filename of this.dataFile) { // if the name is not zero length (split could have returned for just linefeed if(filename.length >0) { // get the filename prefix var tr=document.createElement("tr") table.appendChild(tr) var td=document.createElement("td") tr.appendChild(td) var split = splitRegExp.exec(filename); td.innerText=split } } return wrapper; -
-
wow… works like a charm! lists all tv shows perfectly! :)
is there any way to print a line if the regex isn’t met… ie like a movie title instead of a series title with s01e03 attached?
and possibly limit output to 10 lines?Thanks,
Richie
-
@banbutcher >is there any way to print a line if the regex isn’t met… ie like a movie title instead of a series title with s01e03 attached?
and possibly limit output to 10 lines?sure
// should make this a config variable by adding to module defaults // then would be this.config.counter // get display limit, 10 if not specified in defaults var counter=this.config.counter || 10 var table=document.createElement("table") wrapper.appendChild(table) for(filename of this.dataFile) { // if the name is not zero length (split could have returned for just linefeed // and the view limit has not been reached if(filename.length >0 && counter>0) { // get the filename prefix var tr=document.createElement("tr") table.appendChild(tr) var td=document.createElement("td") tr.appendChild(td) var split = splitRegExp.exec(filename); if(split) td.innerText=split else td.innerText='name not matched '+ filename counter--; } } return wrapper;or using the text form
var wrapper = document.createElement("div"); if(this.dataFile){ var output_list= []; // should make this a config variable by adding to module defaults // then would be this.config.counter // get display limit, 10 if not specified in defaults var counter=this.config.counter || 10 // setup regex, no i no g (only once, and case sensitive) var splitRegExp = /.*[S][(0-9)]+[E][(0-9)]+/; // loop thru the list of filenames for(filename of this.dataFile) { // if the name is not zero length (split could have returned for just linefeed if(filename.length >0 && counter >0) { // get the filename prefix var split = splitRegExp.exec(filename); // save name to the output list, as a table entry // remove space after the ->< , the forum hides everything after unless a space // table has a row, output_list.push("< tr>< td>") // with data if(split) output_list.push(split) else output_list.push('name not matched '+ filename) // end of data and row output_list.push("< /td>< /tr>") counter--; } } // insert the table into the wrapper wrapper.innerHTML = "< table>" + output_list.join('')+ "< /table>"; } else {
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