{"id":1191,"date":"2019-08-29T10:56:40","date_gmt":"2019-08-29T08:56:40","guid":{"rendered":"https:\/\/www.rustimation.eu\/?p=1191"},"modified":"2020-05-05T12:34:10","modified_gmt":"2020-05-05T10:34:10","slug":"stabiler-betrieb-bei-schwachem-wlan","status":"publish","type":"post","link":"https:\/\/www.rustimation.eu\/index.php\/stabiler-betrieb-bei-schwachem-wlan\/","title":{"rendered":"Stabiler Betrieb bei schwachem WLAN"},"content":{"rendered":"<p>Einer meiner IoT Raspis (headless) h\u00e4ngt \u00fcber eine ca. 30 Meter weite WiFi Freiluft Verbindung am Router bzw. Access Point. Mit <em>Wavemon<\/em> gemessen sieht dann die Empfangsqualit\u00e4t auch unter optimalen Umst\u00e4nden eher mau aus und schwankt stark:<\/p>\n<p><!--more--><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-1193 aligncenter\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2019\/08\/wavemon-1024x682.png\" alt=\"\" width=\"604\" height=\"402\" srcset=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2019\/08\/wavemon-1024x682.png 1024w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2019\/08\/wavemon-300x200.png 300w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2019\/08\/wavemon-768x512.png 768w, https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2019\/08\/wavemon.png 1058w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/p>\n<p>Wenn sich nun noch Hindernisse wie Gartenst\u00fchle, Personen etc. zwischen Antenne und Repeater befinden, wird die Qualit\u00e4t noch schlechter und die Verbindung rei\u00dft ab.<\/p>\n<p>Ob der Pi sich anschlie\u00dfend wieder mit dem WLAN verbindet h\u00e4ngt vom Zufall ab &#8211; im schlimmsten Fall muss ich den Pi neu booten. Das habe ich einer kleinen Python Routine \u00fcbertragen, welche checkt, ob eine Verbindung ins Internet oder den Router aufgebaut werden kann. Wenn nicht, wird nach ein paar fehlgeschlagenen Wiederholungen automatischn neu gebootet.<\/p>\n<h3>Vorsicht Falle!<\/h3>\n<p>Weil es so sch\u00f6n sinnvoll und professionell klingt, habe ich in <strong><em>raspi-config<\/em><\/strong> bei \"<em>3 Boot Options<\/em>\" die Einstellung \"<em>B2 Wait for Network at Boot<\/em>\" gew\u00e4hlt.<\/p>\n<p>Das ist unter den oben beschriebenen Umst\u00e4nden <strong>kontraproduktiv<\/strong>. Wenn der Pi neu startet und nich innerhalb einer gewissen Zeitspanne mit dem WLAN connected, dann wartet der Pi ewig und drei Tage auf h\u00f6here Eingebungen bzw. das Netzwerk. Da hilft dann nur Stecker ziehen.<\/p>\n<p>Setzt man obige Einstellung auf \"No\", l\u00e4uft alles wie geschmiert.<\/p>\n<p style=\"padding-left: 40px;\"><span style=\"color: #808080;\">Die Einstellung \"B2 Wait for Network at Boot\" macht in vielen, wenn nicht den meisten anderen F\u00e4llen durchaus Sinn! Zum Beispiel, wenn ein NAS Laufwerk (z.B. Synology) beim Starten \u00fcber einen FSTAB Eintrag eingebunden (gemounted) werden soll. Oft ist der Pi nach dem Start so schnell beim Abarbeiten der mount Auftr\u00e4ge angekommen, dass das Netzwerk noch nicht steht. Setzt man \"B2 Wait for Network at Boot\" auf \"Yes\" klappt es auch mit dem Verbinden des NAS.<\/span><\/p>\n<h3>WiFi Self Check Routine<\/h3>\n<p>Hier noch die kleine Routine zum \u00dcberpr\u00fcfen der Netzwerkverbindung und ggf. Neustart:<\/p>\n<pre class=\"lang:python decode:true EnlighterJSRAW \" title=\"Auto-Reboot when no Wifi\">#!\/usr\/bin\/python\r\n#coding=UTF-8\r\n#-----------------\r\n# German documentation can be found at https:\/\/rustimation.eu\r\n# This program tries to establish a connection to a given Internet site.\r\n# In case, a connection cannot established after several retries it will\r\n# reboot the computer.\r\n# This program should be called at regular intervals (ca. 15 minutes)\r\n# by use of a crontab statement.\r\n#-----------------\r\n\r\nimport urllib2\r\nimport time\r\nimport logging\r\nimport os\r\n\r\ndef internet_on():\r\n    try:\r\n        response=urllib2.urlopen('http:\/\/google.com',timeout=urltimeout)\r\n        return True\r\n    except urllib2.URLError as err: pass\r\n    return False\r\n\r\n# Logging - logfile must be present\r\nlogging.basicConfig(filename='\/var\/log\/checkinet.log',level=logging.WARNING,format='%(asctime)s %(message)s')\r\n\r\n#### setting constants\r\n\r\n# set timeout for URL check [s]\r\nurltimeout=15\r\n# set wait inbetween retries [s]\r\nretrywait=20\r\n# set wait after shutdown [s]\r\nshutdownwait=1\r\n# set number of retries\r\nretries=5\r\n\r\ninetstatus=internet_on()\r\n\r\n# Check whether Internet is available\r\nattempt=0\r\nwhile not inetstatus:\r\n      attempt=attempt + 1\r\n      errmsg=\"Attempt number \" + str(attempt) + \": connect failed, retrying\"\r\n      logging.warning(errmsg)\r\n      if attempt &gt;= retries:\r\n\t    logging.warning(\"I seem to be offline, rebooting!\")\r\n\t    os.system(\"sudo reboot\") # reboot \r\n      #wait for some seconds before next try and return to top of while loop\r\n      time.sleep(retrywait)\r\n      inetstatus=internet_on()\r\n\r\nif inetstatus:\r\n       logging.debug(\"I am online!\")\r\n\r\n#End of Connectivity check<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einer meiner IoT Raspis (headless) h\u00e4ngt \u00fcber eine ca. 30 Meter weite WiFi Freiluft Verbindung am Router bzw. Access Point. Mit Wavemon gemessen sieht dann die Empfangsqualit\u00e4t auch unter optimalen Umst\u00e4nden eher mau aus und schwankt stark:<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[53,7,10,69],"tags":[98,97,77,76],"class_list":["post-1191","post","type-post","status-publish","format-standard","hentry","category-iot","category-netzwerk","category-raspberry-pi","category-tips-tricks","tag-schwache-verbindung","tag-wait-for-network-at-boot","tag-wifi","tag-wlan"],"_links":{"self":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/1191","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/comments?post=1191"}],"version-history":[{"count":1,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/1191\/revisions"}],"predecessor-version":[{"id":1263,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/1191\/revisions\/1263"}],"wp:attachment":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/media?parent=1191"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/categories?post=1191"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/tags?post=1191"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}