MagicMirror Forum

    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unsolved
    • Solved
    • MagicMirror² Repository
    • Documentation
    • Donate
    • Discord
    MagicMirror² v2.20.0 is available! For more information about this release, check out this topic.

    How to Change MMM-DWD-WarnWeather Module for Switzerland

    Development
    3
    13
    5272
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      Squirrel last edited by

      @LukeCodewalker here we 😉

      and here is the Output i got from mitmproxy:

      curl -H ‘Host:my.wetteralarm.ch’ -H ‘Content-Type:application/json; charset=utf-8’ -H ‘Proxy-Connection:keep-alive’ -H ‘Weal-Device-ID:1015262’ -H ‘Accept:/’ -H ‘User-Agent:WetterAlarm/5.5.0 (iPhone; iOS 10.1.1; Scale/2.00)’ -H ‘Accept-Language:de’ -H ‘Accept-Encoding:gzip’ -H ‘Connection:keep-alive’ ‘http://my.wetteralarm.ch/v6/alarms/meteo/with-regions.json’

      1 Reply Last reply Reply Quote 0
      • LukeCodewalker
        LukeCodewalker Module Developer last edited by

        ok so you should start with this request:

        var url = 'http://my.wetteralarm.ch/v6/alarms/meteo/with-regions.json'
        
        
        	request({
        		url: url,
        		method: 'GET'
        	}, function (error, response, body) {
        		console.log(body);
        		var result = JSON.parse(body);
        		console.log(result);
        	});
        

        now you can explore the data that you will get with this request. you will see that the json file you get differs from the one you get from the ‘Deutscher Wetterdienst’-site. If you just change the request the module tries to handle the data as if it was structured like the one from DWD. So you have to write your own logic to extract the information your interested in from the json file.
        if you’ve done that you can think about how you will display this data.

        1 Reply Last reply Reply Quote 0
        • S
          Squirrel last edited by

          It looks like this is a lot of work. 😉 After watching 100s of videos and reading 1000s of tutorials i can read now the most of your code and i know that its not that easy as i was thinking. I dont give up but there are still some lines i dont understand. It looks like i need more help for the request in node_helper.
          Can you tell me what the following Line is exactly doing?

          Line 32: if (result['warnings'][regionId][0]['regionName'] == region) };

          i dont understand why you use 4x [ ]. What i think to understand is that you search for regionName in your object warnings. I can imaging for what you use regionId (what you buildet in the line before) but i have no idea forwhat the [0] is??

          1 Reply Last reply Reply Quote 0
          • S
            Squirrel last edited by

            I still need help. Maybe someone else can help me!? Here is the whole Part:

            getWarningData: function (region) {
            var self = this;

            	var timestamp = Date.now().toString();
            	var url = 'http://www.dwd.de/DWD/warnungen/warnapp_landkreise/json/warnings.json?jsonp=loadWarnings' + timestamp;
            
            
            
            	request({
            		url: url,
            		method: 'GET'
            	}, function (error, response, body) {
            
            		var result = JSON.parse(body.substr(24).slice(0, -2));
            		var warningData = [];
            		for (var regionId in result['warnings']) {
            			if (result['warnings'][regionId][0]['regionName'] == region) {
            				var warnings = [];
            				for (var warning in result['warnings'][regionId]) {
            					warnings.push(result['warnings'][regionId][warning]);
            				}
            				if (warnings.length > 0) {
            					warningData = warnings;
            				}
            			}
            		}
            		self.sendSocketNotification('WARNINGS_DATA', {warnings: warningData, region: region});
            

            Here is the JSON Link from @LukeCodewalker and this is the JSON Link i want to use for my Module.

            Dont give me too much help. I need to learn somthing but i stil don understand how is his request working (Line 32)…

            Line 32: if (result['warnings'][regionId][0]['regionName'] == region) };

            strawberry 3.141 1 Reply Last reply Reply Quote 0
            • strawberry 3.141
              strawberry 3.141 Project Sponsor Module Developer @Squirrel last edited by

              @Squirrel the simplified structure of his json looks like this

              result = {
                "warnings": {
                  "103353000" : [ //regionID
                    {"regionName": "Kreis Harburg", ...},
                    ...
                  ],
                  ...
                },
                ...
              }
              

              result is an object, in this object we have the property warnings which is also an object, nested in this we have the regionIds as properties which are of the type array. To acces the first entry in this array we do the following result['warnings'][regionId][0]. Every entry of this array is again an object which has a proerty regionName, which he’s comparing to the region defined in the config of the module.

              Please create a github issue if you need help, so I can keep track

              1 Reply Last reply Reply Quote 0
              • S
                Squirrel last edited by Squirrel

                Ok i understand. But i have problems to transfer this to my module.

                the simplified structure of my json looks like this:

                result = {
                    "alarms": [ {
                         "id":49664,
                         ...
                         "regions": [
                               {
                               "id":40,
                               "name_de":"Agglo BE",
                               "name_fr":"Agglo BE",
                               "name_it":"Agglo BE"
                                }
                          ],
                         ...
                      },
                      
                 }
                

                Now i tried as a first test to display some stuff of my JSON.

                var regionId = 0; // Later i want to create a for-loop with this
                
                console.log (result['alarms'][regionId]['regions']);
                

                With this i got something like:

                "id":40,
                 "name_de":"Agglo BE",
                 "name_fr":"Agglo BE",
                 "name_it":"Agglo BE"
                

                But then i tried

                console.log (result['alarms'][regionId]['regions']['name_de']);
                
                AND
                
                console.log (result['alarms'][regionId]['regions'][1]);
                

                But this gives me undefined as answer… I dont understand why…?
                Very strange is also that i no more see the regions when i delete the last bracket again… then i get [Object][Object]as Answer!? And when i Start again with only the [‘alarms’] Bracket i can see all the Warnings and then again also the regions with [‘alarms’][regionId][‘regions’]

                strawberry 3.141 1 Reply Last reply Reply Quote 0
                • strawberry 3.141
                  strawberry 3.141 Project Sponsor Module Developer @Squirrel last edited by

                  @Squirrel result['alarms'][0]['regions'][0]['name_de'] returns Agglo BE you have to access arrays [] with the index (starting with 0) and access objects {} with the property names

                  Please create a github issue if you need help, so I can keep track

                  1 Reply Last reply Reply Quote 0
                  • S
                    Squirrel last edited by

                    @strawberry-3-141 thank you for your fast and competent answer.

                    This is what i did now:

                    
                    ......
                    
                    request ( {
                              url: url,
                              method: 'GET'
                    		  }, 
                    
                               function (error, response, body) {
                    
                    			var result = JSON.parse(body);
                    			var warningData = [];
                    			
                    			for (var regionId in result['alarms']) {
                    
                                    			if (result['alarms'][regionId]['regions'][0]['name_de'] == region) {
                    					var warnings = new Object();
                    					warnings.start = result['alarms'][regionId]['valid_from'];
                    					warningData.push(warnings.start);
                    					warnings.end = result['alarms'][regionId]['valid_to'];
                    					warningData.push(warnings.end);
                    					warnings.regionName = result['alarms'][regionId]['regions'][0]['name_de'];
                    					warningData.push(warnings.regionName);
                    					warnings.level = result['alarms'][regionId]['priority']
                    					warningData.push(warnings.level);
                    					warnings.type = result['alarms'][regionId]['code']
                    					warningData.push(warnings.type);
                    					warnings.altitudeStart = undefined;
                    					warningData.push(warnings.altitudeStart);
                    					
                    					if (warnings.type == 1){warnings.event = "Frost";}
                    					else if (warnings.type == 2){warnings.event = "Gewitter";}
                    					else if (warnings.type == 3){warnings.event = "Grossflächige Glätte";}
                    					else if (warnings.type == 4){warnings.event = "Kräftiger Regen";}
                    					else if (warnings.type == 5){warnings.event = "Schnee";}
                    					else if (warnings.type == 6){warnings.event = "Sturm";}
                    					else if (warnings.type == 7){warnings.event = "Hochwasser";}
                    
                    					warningData.push(warnings.event);
                    
                    					warnings.headline = result['alarms'][regionId]['de']['title'];
                    					warningData.push(warnings.headline);
                    					warnings.description = result['alarms'][regionId]['de']['paragraph'];
                    					warningData.push(warnings.description);
                    				}
                    			}
                    			self.sendSocketNotification('WARNINGS_DATA', {warnings: warningData, region: region});
                    
                    			console.log(warnings);
                    			console.log(warningData)
                    
                    		});
                    
                              .......
                    
                    

                    Now i got the following outputs:

                    // With console.log(warnings);
                    
                    { start: '2017-01-16T21:00:00.000Z',
                      end: '2017-01-19T00:00:00.000Z',
                      regionName: 'Seeland/Bielersee',
                      level: 1,
                      type: 6,
                      altitudeStart: undefined,
                      event: 'Sturm',
                      headline: 'Starke Windböen',
                      description: 'eisige Bise. 21 Uhr bis Do 00 Uhr' }
                    
                    // With console.log (warningData)
                    
                    [ '2017-01-17T00:00:00.000Z',
                      '2017-01-18T23:00:00.000Z',
                      'Seeland/Bielersee',
                      1,
                      3,
                      undefined,
                      'Grossflächige Glätte',
                      'Gefahr von grossflächiger Glätte',
                      'durch Schneeglätte. Di 00 Uhr bis Mi 23 Uhr',
                      '2017-01-16T21:00:00.000Z',
                      '2017-01-19T00:00:00.000Z',
                      'Seeland/Bielersee',
                      1,
                      6,
                      undefined,
                      'Sturm',
                      'Starke Windböen',
                      'eisige Bise. 21 Uhr bis Do 00 Uhr' ]
                    

                    My Problem now is that my Output is still looking different than his output. And when i get 2 warnings for the same Region the Output goes into the same Array… By the Way… Why i get only one Warning for the region with console.log(warnings);

                    Here is the Output example of his module:

                    [ { start: 1484586000000,
                        end: 1484650800000,
                        regionName: 'Kreis Harburg',
                        .....
                        state: 'Niedersachsen' 
                      },
                      { start: 1484586000000,
                        end: 1484650800000,
                        regionName: 'Kreis Harburg',
                        .......
                        state: 'Niedersachsen' 
                        }
                     ]
                    
                    strawberry 3.141 1 Reply Last reply Reply Quote 0
                    • strawberry 3.141
                      strawberry 3.141 Project Sponsor Module Developer @Squirrel last edited by

                      @Squirrel you are pushing every single propertie to the array instead of the whole object

                      if (result['alarms'][regionId]['regions'][0]['name_de'] == region) {
                        var warnings = {};
                        warnings.start = result['alarms'][regionId]['valid_from'];
                        warnings.end = result['alarms'][regionId]['valid_to'];
                        warnings.regionName = result['alarms'][regionId]['regions'][0]['name_de'];
                        warnings.level = result['alarms'][regionId]['priority']
                        warnings.type = result['alarms'][regionId]['code']
                        warnings.altitudeStart = undefined;
                      					
                        if (warnings.type == 1){warnings.event = "Frost";}
                        else if (warnings.type == 2){warnings.event = "Gewitter";}
                        else if (warnings.type == 3){warnings.event = "Grossflächige Glätte";}
                        else if (warnings.type == 4){warnings.event = "Kräftiger Regen";}
                        else if (warnings.type == 5){warnings.event = "Schnee";}
                        else if (warnings.type == 6){warnings.event = "Sturm";}
                        else if (warnings.type == 7){warnings.event = "Hochwasser";}
                      
                        warnings.headline = result['alarms'][regionId]['de']['title'];
                        warnings.description = result['alarms'][regionId]['de']['paragraph'];
                        warningData.push(warnings);
                      }
                      

                      try this instead

                      Please create a github issue if you need help, so I can keep track

                      1 Reply Last reply Reply Quote 0
                      • S
                        Squirrel last edited by

                        Thanks again for fast Answer! Now everything is working. Im so happy! 🙂

                        I have just one last Question. I tried to run both modules at the same time. This is giving me problems. The Icons are too much big and i cant see something else…

                        I changed all the names of the module files and folders and i have no idea where i can find this fault. I think nobody gonna us this two modules at the same time but i want to upload my module for other users and if somebody is using both of them i dont want to destroy @LukeCodewalker s module… 😉

                        1 Reply Last reply Reply Quote 0
                        • 1
                        • 2
                        • 1 / 2
                        • First post
                          Last post
                        Enjoying MagicMirror? Please consider a donation!
                        MagicMirror created by Michael Teeuw.
                        Forum managed by Paul-Vincent Roll and Rodrigo Ramírez Norambuena.
                        This forum is using NodeBB as its core | Contributors
                        Contact | Privacy Policy